diff --git a/flutter/.gitattributes b/flutter/.gitattributes new file mode 100644 index 000000000..176a458f9 --- /dev/null +++ b/flutter/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/flutter/.gitignore b/flutter/.gitignore new file mode 100644 index 000000000..72307b910 --- /dev/null +++ b/flutter/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json +jniLibs + +.vscode \ No newline at end of file diff --git a/flutter/.metadata b/flutter/.metadata new file mode 100644 index 000000000..107fcb7b5 --- /dev/null +++ b/flutter/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 8874f21e79d7ec66d0457c7ab338348e31b17f1d + channel: stable + +project_type: app diff --git a/flutter/android/.gitignore b/flutter/android/.gitignore new file mode 100644 index 000000000..0a741cb43 --- /dev/null +++ b/flutter/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/flutter/android/app/build.gradle b/flutter/android/app/build.gradle new file mode 100644 index 000000000..79bf6426a --- /dev/null +++ b/flutter/android/app/build.gradle @@ -0,0 +1,82 @@ +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 31 + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.carriez.flutter_hbb" + minSdkVersion 21 + targetSdkVersion 31 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "androidx.media:media:1.4.3" + implementation 'com.github.getActivity:XXPermissions:13.2' + implementation("org.jetbrains.kotlin:kotlin-stdlib") { version { strictly("$kotlin_version") } } +} + +apply plugin: 'com.google.gms.google-services' diff --git a/flutter/android/app/google-services.json b/flutter/android/app/google-services.json new file mode 100644 index 000000000..3945e432a --- /dev/null +++ b/flutter/android/app/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "768133699366", + "firebase_url": "https://rustdesk.firebaseio.com", + "project_id": "rustdesk", + "storage_bucket": "rustdesk.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:768133699366:android:5fc9015370e344457993e7", + "android_client_info": { + "package_name": "com.carriez.flutter_hbb" + } + }, + "oauth_client": [ + { + "client_id": "768133699366-s9gdfsijefsd5g1nura4kmfne42lencn.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAPOsKcXjrAR-7Z148sYr_gdB_JQZkamTM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "768133699366-s9gdfsijefsd5g1nura4kmfne42lencn.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/flutter/android/app/src/debug/AndroidManifest.xml b/flutter/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..64d68a588 --- /dev/null +++ b/flutter/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/flutter/android/app/src/main/AndroidManifest.xml b/flutter/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c552efae5 --- /dev/null +++ b/flutter/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt new file mode 100644 index 000000000..328701567 --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt @@ -0,0 +1,23 @@ +package com.carriez.flutter_hbb + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.widget.Toast + +class BootReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if ("android.intent.action.BOOT_COMPLETED" == intent.action){ + val it = Intent(context,MainService::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + Toast.makeText(context, "RustDesk is Open", Toast.LENGTH_LONG).show(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(it) + }else{ + context.startService(it) + } + } + } +} diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt new file mode 100644 index 000000000..e061037db --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt @@ -0,0 +1,221 @@ +package com.carriez.flutter_hbb + +import android.accessibilityservice.AccessibilityService +import android.accessibilityservice.GestureDescription +import android.content.Context +import android.graphics.Path +import android.os.Build +import android.util.Log +import android.view.accessibility.AccessibilityEvent +import androidx.annotation.Keep +import androidx.annotation.RequiresApi +import java.util.* + +const val LIFT_DOWN = 9 +const val LIFT_MOVE = 8 +const val LIFT_UP = 10 +const val RIGHT_UP = 18 +const val WHEEL_BUTTON_DOWN = 33 +const val WHEEL_BUTTON_UP = 34 +const val WHEEL_DOWN = 523331 +const val WHEEL_UP = 963 + +const val WHEEL_STEP = 120 +const val WHEEL_DURATION = 50L +const val LONG_TAP_DELAY = 200L + +class InputService : AccessibilityService() { + + companion object { + var ctx: InputService? = null + val isOpen: Boolean + get() = ctx != null + } + + private external fun init(ctx: Context) + + init { + System.loadLibrary("rustdesk") + } + + private val logTag = "input service" + private var leftIsDown = false + private var touchPath = Path() + private var lastTouchGestureStartTime = 0L + private var mouseX = 0 + private var mouseY = 0 + private var timer = Timer() + private var recentActionTask: TimerTask? = null + + private val wheelActionsQueue = LinkedList() + private var isWheelActionsPolling = false + + @Keep + @RequiresApi(Build.VERSION_CODES.N) + fun rustMouseInput(mask: Int, _x: Int, _y: Int) { + val x = if (_x < 0) { + 0 + } else { + _x + } + + val y = if (_y < 0) { + 0 + } else { + _y + } + + if (mask == 0 || mask == LIFT_MOVE) { + mouseX = x * SCREEN_INFO.scale + mouseY = y * SCREEN_INFO.scale + } + + // left button down ,was up + if (mask == LIFT_DOWN) { + leftIsDown = true + startGesture(mouseX, mouseY) + return + } + + // left down ,was down + if (leftIsDown) { + continueGesture(mouseX, mouseY) + } + + // left up ,was down + if (mask == LIFT_UP) { + leftIsDown = false + endGesture(mouseX, mouseY) + return + } + + if (mask == RIGHT_UP) { + performGlobalAction(GLOBAL_ACTION_BACK) + return + } + + // long WHEEL_BUTTON_DOWN -> GLOBAL_ACTION_RECENTS + if (mask == WHEEL_BUTTON_DOWN) { + timer.purge() + recentActionTask = object : TimerTask() { + override fun run() { + performGlobalAction(GLOBAL_ACTION_RECENTS) + recentActionTask = null + } + } + timer.schedule(recentActionTask, LONG_TAP_DELAY) + } + + // wheel button up + if (mask == WHEEL_BUTTON_UP) { + if (recentActionTask != null) { + recentActionTask!!.cancel() + performGlobalAction(GLOBAL_ACTION_HOME) + } + return + } + + if (mask == WHEEL_DOWN) { + if (mouseY < WHEEL_STEP) { + return + } + val path = Path() + path.moveTo(mouseX.toFloat(), mouseY.toFloat()) + path.lineTo(mouseX.toFloat(), (mouseY - WHEEL_STEP).toFloat()) + val stroke = GestureDescription.StrokeDescription( + path, + 0, + WHEEL_DURATION + ) + val builder = GestureDescription.Builder() + builder.addStroke(stroke) + wheelActionsQueue.offer(builder.build()) + consumeWheelActions() + + } + + if (mask == WHEEL_UP) { + if (mouseY < WHEEL_STEP) { + return + } + val path = Path() + path.moveTo(mouseX.toFloat(), mouseY.toFloat()) + path.lineTo(mouseX.toFloat(), (mouseY + WHEEL_STEP).toFloat()) + val stroke = GestureDescription.StrokeDescription( + path, + 0, + WHEEL_DURATION + ) + val builder = GestureDescription.Builder() + builder.addStroke(stroke) + wheelActionsQueue.offer(builder.build()) + consumeWheelActions() + } + } + + @RequiresApi(Build.VERSION_CODES.N) + private fun consumeWheelActions() { + if (isWheelActionsPolling) { + return + } else { + isWheelActionsPolling = true + } + wheelActionsQueue.poll()?.let { + dispatchGesture(it, null, null) + timer.purge() + timer.schedule(object : TimerTask() { + override fun run() { + isWheelActionsPolling = false + consumeWheelActions() + } + }, WHEEL_DURATION + 10) + } ?: let { + isWheelActionsPolling = false + return + } + } + + private fun startGesture(x: Int, y: Int) { + touchPath = Path() + touchPath.moveTo(x.toFloat(), y.toFloat()) + lastTouchGestureStartTime = System.currentTimeMillis() + } + + private fun continueGesture(x: Int, y: Int) { + touchPath.lineTo(x.toFloat(), y.toFloat()) + } + + @RequiresApi(Build.VERSION_CODES.N) + private fun endGesture(x: Int, y: Int) { + try { + touchPath.lineTo(x.toFloat(), y.toFloat()) + var duration = System.currentTimeMillis() - lastTouchGestureStartTime + if (duration <= 0) { + duration = 1 + } + val stroke = GestureDescription.StrokeDescription( + touchPath, + 0, + duration + ) + val builder = GestureDescription.Builder() + builder.addStroke(stroke) + Log.d(logTag, "end gesture x:$x y:$y time:$duration") + dispatchGesture(builder.build(), null, null) + } catch (e: Exception) { + Log.e(logTag, "endGesture error:$e") + } + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun onServiceConnected() { + super.onServiceConnected() + ctx = this + Log.d(logTag, "onServiceConnected!") + init(this) + } + + override fun onAccessibilityEvent(event: AccessibilityEvent?) {} + + override fun onInterrupt() {} +} diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt new file mode 100644 index 000000000..bb4e85c89 --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt @@ -0,0 +1,229 @@ +package com.carriez.flutter_hbb + +import android.app.Activity +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.media.projection.MediaProjectionManager +import android.os.Build +import android.os.IBinder +import android.provider.Settings +import android.util.Log +import android.view.WindowManager +import androidx.annotation.RequiresApi +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel + +const val MEDIA_REQUEST_CODE = 42 + +class MainActivity : FlutterActivity() { + companion object { + lateinit var flutterMethodChannel: MethodChannel + } + + private val channelTag = "mChannel" + private val logTag = "mMainActivity" + private var mediaProjectionResultIntent: Intent? = null + private var mainService: MainService? = null + + @RequiresApi(Build.VERSION_CODES.M) + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + if (MainService.isReady) { + Intent(activity, MainService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } + } + flutterMethodChannel = MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + channelTag + ).apply { + // make sure result is set, otherwise flutter will await forever + setMethodCallHandler { call, result -> + when (call.method) { + "init_service" -> { + Intent(activity, MainService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } + if (MainService.isReady) { + result.success(false) + return@setMethodCallHandler + } + getMediaProjection() + result.success(true) + } + "start_capture" -> { + mainService?.let { + result.success(it.startCapture()) + } ?: let { + result.success(false) + } + } + "stop_service" -> { + Log.d(logTag, "Stop service") + mainService?.let { + it.destroy() + result.success(true) + } ?: let { + result.success(false) + } + } + "check_permission" -> { + if (call.arguments is String) { + result.success(checkPermission(context, call.arguments as String)) + } else { + result.success(false) + } + } + "request_permission" -> { + if (call.arguments is String) { + requestPermission(context, call.arguments as String) + result.success(true) + } else { + result.success(false) + } + } + "check_video_permission" -> { + mainService?.let { + result.success(it.checkMediaPermission()) + } ?: let { + result.success(false) + } + } + "check_service" -> { + flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "input", "value" to InputService.isOpen.toString()) + ) + flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "media", "value" to MainService.isReady.toString()) + ) + result.success(true) + } + "init_input" -> { + initInput() + result.success(true) + } + "stop_input" -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + InputService.ctx?.disableSelf() + } + InputService.ctx = null + flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "input", "value" to InputService.isOpen.toString()) + ) + result.success(true) + } + "cancel_notification" -> { + try { + val id = call.arguments as Int + mainService?.cancelNotification(id) + } finally { + result.success(true) + } + } + "enable_soft_keyboard" -> { + // https://blog.csdn.net/hanye2020/article/details/105553780 + try { + if (call.arguments as Boolean) { + window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) + } + } finally { + result.success(true) + } + } + else -> { + result.error("-1", "No such method", null) + } + } + } + } + } + + private fun getMediaProjection() { + val mMediaProjectionManager = + getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager + val mIntent = mMediaProjectionManager.createScreenCaptureIntent() + startActivityForResult(mIntent, MEDIA_REQUEST_CODE) + } + + private fun initService() { + if (mediaProjectionResultIntent == null) { + Log.w(logTag, "initService fail,mediaProjectionResultIntent is null") + return + } + Log.d(logTag, "Init service") + val serviceIntent = Intent(this, MainService::class.java) + serviceIntent.action = INIT_SERVICE + serviceIntent.putExtra(EXTRA_MP_DATA, mediaProjectionResultIntent) + + launchMainService(serviceIntent) + } + + private fun launchMainService(intent: Intent) { + // TEST api < O + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent) + } else { + startService(intent) + } + } + + private fun initInput() { + val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent) + } + } + + override fun onResume() { + super.onResume() + val inputPer = InputService.isOpen + Log.d(logTag, "onResume inputPer:$inputPer") + activity.runOnUiThread { + flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "input", "value" to inputPer.toString()) + ) + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == MEDIA_REQUEST_CODE) { + if (resultCode == Activity.RESULT_OK && data != null) { + mediaProjectionResultIntent = data + initService() + } else { + flutterMethodChannel.invokeMethod("on_media_projection_canceled", null) + } + } + } + + override fun onDestroy() { + Log.e(logTag, "onDestroy") + mainService?.let { + unbindService(serviceConnection) + } + super.onDestroy() + } + + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + Log.d(logTag, "onServiceConnected") + val binder = service as MainService.LocalBinder + mainService = binder.getService() + } + + override fun onServiceDisconnected(name: ComponentName?) { + Log.d(logTag, "onServiceDisconnected") + mainService = null + } + } +} diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt new file mode 100644 index 000000000..4a1b8c06f --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt @@ -0,0 +1,670 @@ +/** + * Capture screen,get video and audio,send to rust. + * Handle notification + */ +package com.carriez.flutter_hbb + +import android.Manifest +import android.annotation.SuppressLint +import android.app.* +import android.app.PendingIntent.FLAG_IMMUTABLE +import android.app.PendingIntent.FLAG_UPDATE_CURRENT +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.res.Configuration +import android.content.res.Configuration.ORIENTATION_LANDSCAPE +import android.graphics.Color +import android.graphics.PixelFormat +import android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR +import android.hardware.display.VirtualDisplay +import android.media.* +import android.media.projection.MediaProjection +import android.media.projection.MediaProjectionManager +import android.os.* +import android.util.DisplayMetrics +import android.util.Log +import android.view.Surface +import android.view.Surface.FRAME_RATE_COMPATIBILITY_DEFAULT +import android.view.WindowManager +import androidx.annotation.Keep +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import java.util.concurrent.Executors +import kotlin.concurrent.thread +import org.json.JSONException +import org.json.JSONObject +import java.nio.ByteBuffer +import kotlin.math.max +import kotlin.math.min + +const val EXTRA_MP_DATA = "mp_intent" +const val INIT_SERVICE = "init_service" +const val ACTION_LOGIN_REQ_NOTIFY = "ACTION_LOGIN_REQ_NOTIFY" +const val EXTRA_LOGIN_REQ_NOTIFY = "EXTRA_LOGIN_REQ_NOTIFY" + +const val DEFAULT_NOTIFY_TITLE = "RustDesk" +const val DEFAULT_NOTIFY_TEXT = "Service is running" +const val DEFAULT_NOTIFY_ID = 1 +const val NOTIFY_ID_OFFSET = 100 + +const val MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_VP9 + +// video const +const val MAX_SCREEN_SIZE = 1200 + +const val VIDEO_KEY_BIT_RATE = 1024_000 +const val VIDEO_KEY_FRAME_RATE = 30 + +// audio const +const val AUDIO_ENCODING = AudioFormat.ENCODING_PCM_FLOAT // ENCODING_OPUS need API 30 +const val AUDIO_SAMPLE_RATE = 48000 +const val AUDIO_CHANNEL_MASK = AudioFormat.CHANNEL_IN_STEREO + +class MainService : Service() { + + init { + System.loadLibrary("rustdesk") + } + + @Keep + fun rustGetByName(name: String): String { + return when (name) { + "screen_size" -> "${SCREEN_INFO.width}:${SCREEN_INFO.height}" + else -> "" + } + } + + @Keep + fun rustSetByName(name: String, arg1: String, arg2: String) { + when (name) { + "try_start_without_auth" -> { + try { + val jsonObject = JSONObject(arg1) + val id = jsonObject["id"] as Int + val username = jsonObject["name"] as String + val peerId = jsonObject["peer_id"] as String + val type = if (jsonObject["is_file_transfer"] as Boolean) { + translate("File Connection") + } else { + translate("Screen Connection") + } + loginRequestNotification(id, type, username, peerId) + } catch (e: JSONException) { + e.printStackTrace() + } + } + "on_client_authorized" -> { + Log.d(logTag, "from rust:on_client_authorized") + try { + val jsonObject = JSONObject(arg1) + val id = jsonObject["id"] as Int + val username = jsonObject["name"] as String + val peerId = jsonObject["peer_id"] as String + val isFileTransfer = jsonObject["is_file_transfer"] as Boolean + val type = if (isFileTransfer) { + translate("File Connection") + } else { + translate("Screen Connection") + } + if (!isFileTransfer && !isStart) { + startCapture() + } + onClientAuthorizedNotification(id, type, username, peerId) + } catch (e: JSONException) { + e.printStackTrace() + } + + } + "stop_capture" -> { + Log.d(logTag, "from rust:stop_capture") + stopCapture() + } + else -> { + } + } + } + + private var serviceLooper: Looper? = null + private var serviceHandler: Handler? = null + + // jvm call rust + private external fun init(ctx: Context) + private external fun startServer() + private external fun onVideoFrameUpdate(buf: ByteBuffer) + private external fun onAudioFrameUpdate(buf: ByteBuffer) + private external fun translateLocale(localeName: String, input: String): String + private external fun refreshScreen() + private external fun setFrameRawEnable(name: String, value: Boolean) + // private external fun sendVp9(data: ByteArray) + + private fun translate(input: String): String { + Log.d(logTag, "translate:$LOCAL_NAME") + return translateLocale(LOCAL_NAME, input) + } + + companion object { + private var _isReady = false // media permission ready status + private var _isStart = false // screen capture start status + val isReady: Boolean + get() = _isReady + val isStart: Boolean + get() = _isStart + } + + private val logTag = "LOG_SERVICE" + private val useVP9 = false + private val binder = LocalBinder() + + + // video + private var mediaProjection: MediaProjection? = null + private var surface: Surface? = null + private val sendVP9Thread = Executors.newSingleThreadExecutor() + private var videoEncoder: MediaCodec? = null + private var imageReader: ImageReader? = null + private var virtualDisplay: VirtualDisplay? = null + + // audio + private var audioRecorder: AudioRecord? = null + private var audioReader: AudioReader? = null + private var minBufferSize = 0 + private var audioRecordStat = false + + // notification + private lateinit var notificationManager: NotificationManager + private lateinit var notificationChannel: String + private lateinit var notificationBuilder: NotificationCompat.Builder + + override fun onCreate() { + super.onCreate() + HandlerThread("Service", Process.THREAD_PRIORITY_BACKGROUND).apply { + start() + serviceLooper = looper + serviceHandler = Handler(looper) + } + updateScreenInfo(resources.configuration.orientation) + initNotification() + startServer() + } + + override fun onDestroy() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + InputService.ctx?.disableSelf() + } + InputService.ctx = null + checkMediaPermission() + super.onDestroy() + } + + private fun updateScreenInfo(orientation: Int) { + var w: Int + var h: Int + var dpi: Int + val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager + + @Suppress("DEPRECATION") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val m = windowManager.maximumWindowMetrics + w = m.bounds.width() + h = m.bounds.height() + dpi = resources.configuration.densityDpi + } else { + val dm = DisplayMetrics() + windowManager.defaultDisplay.getRealMetrics(dm) + w = dm.widthPixels + h = dm.heightPixels + dpi = dm.densityDpi + } + + val max = max(w,h) + val min = min(w,h) + if (orientation == ORIENTATION_LANDSCAPE) { + w = max + h = min + } else { + w = min + h = max + } + Log.d(logTag,"updateScreenInfo:w:$w,h:$h") + var scale = 1 + if (w != 0 && h != 0) { + if (w > MAX_SCREEN_SIZE || h > MAX_SCREEN_SIZE) { + scale = 2 + w /= scale + h /= scale + dpi /= scale + } + if (SCREEN_INFO.width != w) { + SCREEN_INFO.width = w + SCREEN_INFO.height = h + SCREEN_INFO.scale = scale + SCREEN_INFO.dpi = dpi + if (isStart) { + stopCapture() + refreshScreen() + startCapture() + } + } + + } + } + + override fun onBind(intent: Intent): IBinder { + Log.d(logTag, "service onBind") + return binder + } + + inner class LocalBinder : Binder() { + init { + Log.d(logTag, "LocalBinder init") + } + + fun getService(): MainService = this@MainService + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + Log.d("whichService", "this service:${Thread.currentThread()}") + super.onStartCommand(intent, flags, startId) + if (intent?.action == INIT_SERVICE) { + Log.d(logTag, "service starting:${startId}:${Thread.currentThread()}") + createForegroundNotification() + val mMediaProjectionManager = + getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager + intent.getParcelableExtra(EXTRA_MP_DATA)?.let { + mediaProjection = + mMediaProjectionManager.getMediaProjection(Activity.RESULT_OK, it) + checkMediaPermission() + init(this) + _isReady = true + } + } + return START_NOT_STICKY // don't use sticky (auto restart),the new service (from auto restart) will lose control + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + updateScreenInfo(newConfig.orientation) + } + + @SuppressLint("WrongConstant") + private fun createSurface(): Surface? { + return if (useVP9) { + // TODO + null + } else { + Log.d(logTag, "ImageReader.newInstance:INFO:$SCREEN_INFO") + imageReader = + ImageReader.newInstance( + SCREEN_INFO.width, + SCREEN_INFO.height, + PixelFormat.RGBA_8888, + 4 + ).apply { + setOnImageAvailableListener({ imageReader: ImageReader -> + try { + imageReader.acquireLatestImage().use { image -> + if (image == null) return@setOnImageAvailableListener + val planes = image.planes + val buffer = planes[0].buffer + buffer.rewind() + onVideoFrameUpdate(buffer) + } + } catch (ignored: java.lang.Exception) { + } + }, serviceHandler) + } + Log.d(logTag, "ImageReader.setOnImageAvailableListener done") + imageReader?.surface + } + } + + fun startCapture(): Boolean { + if (isStart) { + return true + } + if (mediaProjection == null) { + Log.w(logTag, "startCapture fail,mediaProjection is null") + return false + } + updateScreenInfo(resources.configuration.orientation) + Log.d(logTag, "Start Capture") + surface = createSurface() + + if (useVP9) { + startVP9VideoRecorder(mediaProjection!!) + } else { + startRawVideoRecorder(mediaProjection!!) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + startAudioRecorder() + } + checkMediaPermission() + _isStart = true + setFrameRawEnable("video",true) + setFrameRawEnable("audio",true) + return true + } + + fun stopCapture() { + Log.d(logTag, "Stop Capture") + setFrameRawEnable("video",false) + setFrameRawEnable("audio",false) + _isStart = false + // release video + virtualDisplay?.release() + surface?.release() + imageReader?.close() + videoEncoder?.let { + it.signalEndOfInputStream() + it.stop() + it.release() + } + virtualDisplay = null + videoEncoder = null + + // release audio + audioRecordStat = false + audioRecorder?.release() + audioRecorder = null + minBufferSize = 0 + } + + fun destroy() { + Log.d(logTag, "destroy service") + _isReady = false + + stopCapture() + imageReader?.close() + imageReader = null + + mediaProjection = null + checkMediaPermission() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + InputService.ctx?.disableSelf() + } + InputService.ctx = null + stopForeground(true) + stopSelf() + } + + fun checkMediaPermission(): Boolean { + Handler(Looper.getMainLooper()).post { + MainActivity.flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "media", "value" to isReady.toString()) + ) + } + Handler(Looper.getMainLooper()).post { + MainActivity.flutterMethodChannel.invokeMethod( + "on_state_changed", + mapOf("name" to "input", "value" to InputService.isOpen.toString()) + ) + } + return isReady + } + + private fun startRawVideoRecorder(mp: MediaProjection) { + Log.d(logTag, "startRawVideoRecorder,screen info:$SCREEN_INFO") + if (surface == null) { + Log.d(logTag, "startRawVideoRecorder failed,surface is null") + return + } + virtualDisplay = mp.createVirtualDisplay( + "RustDeskVD", + SCREEN_INFO.width, SCREEN_INFO.height, SCREEN_INFO.dpi, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + surface, null, null + ) + } + + private fun startVP9VideoRecorder(mp: MediaProjection) { + createMediaCodec() + videoEncoder?.let { + surface = it.createInputSurface() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + surface!!.setFrameRate(1F, FRAME_RATE_COMPATIBILITY_DEFAULT) + } + it.setCallback(cb) + it.start() + virtualDisplay = mp.createVirtualDisplay( + "RustDeskVD", + SCREEN_INFO.width, SCREEN_INFO.height, SCREEN_INFO.dpi, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + surface, null, null + ) + } + } + + private val cb: MediaCodec.Callback = object : MediaCodec.Callback() { + override fun onInputBufferAvailable(codec: MediaCodec, index: Int) {} + override fun onOutputFormatChanged(codec: MediaCodec, format: MediaFormat) {} + + override fun onOutputBufferAvailable( + codec: MediaCodec, + index: Int, + info: MediaCodec.BufferInfo + ) { + codec.getOutputBuffer(index)?.let { buf -> + sendVP9Thread.execute { + val byteArray = ByteArray(buf.limit()) + buf.get(byteArray) + // sendVp9(byteArray) + codec.releaseOutputBuffer(index, false) + } + } + } + + override fun onError(codec: MediaCodec, e: MediaCodec.CodecException) { + Log.e(logTag, "MediaCodec.Callback error:$e") + } + } + + + private fun createMediaCodec() { + Log.d(logTag, "MediaFormat.MIMETYPE_VIDEO_VP9 :$MIME_TYPE") + videoEncoder = MediaCodec.createEncoderByType(MIME_TYPE) + val mFormat = + MediaFormat.createVideoFormat(MIME_TYPE, SCREEN_INFO.width, SCREEN_INFO.height) + mFormat.setInteger(MediaFormat.KEY_BIT_RATE, VIDEO_KEY_BIT_RATE) + mFormat.setInteger(MediaFormat.KEY_FRAME_RATE, VIDEO_KEY_FRAME_RATE) + mFormat.setInteger( + MediaFormat.KEY_COLOR_FORMAT, + MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible + ) + mFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5) + try { + videoEncoder!!.configure(mFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE) + } catch (e: Exception) { + Log.e(logTag, "mEncoder.configure fail!") + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun startAudioRecorder() { + checkAudioRecorder() + if (audioReader != null && audioRecorder != null && minBufferSize != 0) { + try { + audioRecorder!!.startRecording() + audioRecordStat = true + thread { + while (audioRecordStat) { + audioReader!!.readSync(audioRecorder!!)?.let { + onAudioFrameUpdate(it) + } + } + Log.d(logTag, "Exit audio thread") + } + } catch (e: Exception) { + Log.d(logTag, "startAudioRecorder fail:$e") + } + } else { + Log.d(logTag, "startAudioRecorder fail") + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkAudioRecorder() { + if (audioRecorder != null && audioRecorder != null && minBufferSize != 0) { + return + } + // read f32 to byte , length * 4 + minBufferSize = 2 * 4 * AudioRecord.getMinBufferSize( + AUDIO_SAMPLE_RATE, + AUDIO_CHANNEL_MASK, + AUDIO_ENCODING + ) + if (minBufferSize == 0) { + Log.d(logTag, "get min buffer size fail!") + return + } + audioReader = AudioReader(minBufferSize, 4) + Log.d(logTag, "init audioData len:$minBufferSize") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + mediaProjection?.let { + val apcc = AudioPlaybackCaptureConfiguration.Builder(it) + .addMatchingUsage(AudioAttributes.USAGE_MEDIA) + .addMatchingUsage(AudioAttributes.USAGE_ALARM) + .addMatchingUsage(AudioAttributes.USAGE_GAME) + .addMatchingUsage(AudioAttributes.USAGE_UNKNOWN).build() + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.RECORD_AUDIO + ) != PackageManager.PERMISSION_GRANTED + ) { + return + } + audioRecorder = AudioRecord.Builder() + .setAudioFormat( + AudioFormat.Builder() + .setEncoding(AUDIO_ENCODING) + .setSampleRate(AUDIO_SAMPLE_RATE) + .setChannelMask(AUDIO_CHANNEL_MASK).build() + ) + .setAudioPlaybackCaptureConfig(apcc) + .setBufferSizeInBytes(minBufferSize).build() + Log.d(logTag, "createAudioRecorder done,minBufferSize:$minBufferSize") + return + } + } + Log.d(logTag, "createAudioRecorder fail") + } + + private fun initNotification() { + notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationChannel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channelId = "RustDesk" + val channelName = "RustDesk Service" + val channel = NotificationChannel( + channelId, + channelName, NotificationManager.IMPORTANCE_HIGH + ).apply { + description = "RustDesk Service Channel" + } + channel.lightColor = Color.BLUE + channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE + notificationManager.createNotificationChannel(channel) + channelId + } else { + "" + } + notificationBuilder = NotificationCompat.Builder(this, notificationChannel) + } + + @SuppressLint("UnspecifiedImmutableFlag") + private fun createForegroundNotification() { + val intent = Intent(this, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + putExtra("type", type) + } + val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PendingIntent.getActivity(this, 0, intent, FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE) + } else { + PendingIntent.getActivity(this, 0, intent, FLAG_UPDATE_CURRENT) + } + val notification = notificationBuilder + .setOngoing(true) + .setSmallIcon(R.mipmap.ic_launcher) + .setDefaults(Notification.DEFAULT_ALL) + .setAutoCancel(true) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setContentTitle(DEFAULT_NOTIFY_TITLE) + .setContentText(translate(DEFAULT_NOTIFY_TEXT) + '!') + .setOnlyAlertOnce(true) + .setContentIntent(pendingIntent) + .setColor(ContextCompat.getColor(this, R.color.primary)) + .setWhen(System.currentTimeMillis()) + .build() + startForeground(DEFAULT_NOTIFY_ID, notification) + } + + private fun loginRequestNotification( + clientID: Int, + type: String, + username: String, + peerId: String + ) { + val notification = notificationBuilder + .setOngoing(false) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setContentTitle(translate("Do you accept?")) + .setContentText("$type:$username-$peerId") + // .setStyle(MediaStyle().setShowActionsInCompactView(0, 1)) + // .addAction(R.drawable.check_blue, "check", genLoginRequestPendingIntent(true)) + // .addAction(R.drawable.close_red, "close", genLoginRequestPendingIntent(false)) + .build() + notificationManager.notify(getClientNotifyID(clientID), notification) + } + + private fun onClientAuthorizedNotification( + clientID: Int, + type: String, + username: String, + peerId: String + ) { + cancelNotification(clientID) + val notification = notificationBuilder + .setOngoing(false) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setContentTitle("$type ${translate("Established")}") + .setContentText("$username - $peerId") + .build() + notificationManager.notify(getClientNotifyID(clientID), notification) + } + + private fun getClientNotifyID(clientID: Int): Int { + return clientID + NOTIFY_ID_OFFSET + } + + fun cancelNotification(clientID: Int) { + notificationManager.cancel(getClientNotifyID(clientID)) + } + + @SuppressLint("UnspecifiedImmutableFlag") + private fun genLoginRequestPendingIntent(res: Boolean): PendingIntent { + val intent = Intent(this, MainService::class.java).apply { + action = ACTION_LOGIN_REQ_NOTIFY + putExtra(EXTRA_LOGIN_REQ_NOTIFY, res) + } + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PendingIntent.getService(this, 111, intent, FLAG_IMMUTABLE) + } else { + PendingIntent.getService(this, 111, intent, FLAG_UPDATE_CURRENT) + } + } + + private fun setTextNotification(_title: String?, _text: String?) { + val title = _title ?: DEFAULT_NOTIFY_TITLE + val text = _text ?: translate(DEFAULT_NOTIFY_TEXT) + '!' + val notification = notificationBuilder + .clearActions() + .setStyle(null) + .setContentTitle(title) + .setContentText(text) + .build() + notificationManager.notify(DEFAULT_NOTIFY_ID, notification) + } +} diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt new file mode 100644 index 000000000..7ce7d3ecc --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt @@ -0,0 +1,116 @@ +package com.carriez.flutter_hbb + +import android.annotation.SuppressLint +import android.content.Context +import android.media.AudioRecord +import android.media.AudioRecord.READ_BLOCKING +import android.media.MediaCodecList +import android.media.MediaFormat +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.util.Log +import androidx.annotation.RequiresApi +import com.hjq.permissions.Permission +import com.hjq.permissions.XXPermissions +import java.nio.ByteBuffer +import java.util.* + +@SuppressLint("ConstantLocale") +val LOCAL_NAME = Locale.getDefault().toString() +val SCREEN_INFO = Info(0, 0, 1, 200) + +data class Info( + var width: Int, var height: Int, var scale: Int, var dpi: Int +) + +@RequiresApi(Build.VERSION_CODES.LOLLIPOP) +fun testVP9Support(): Boolean { + return true + val res = MediaCodecList(MediaCodecList.ALL_CODECS) + .findEncoderForFormat( + MediaFormat.createVideoFormat( + MediaFormat.MIMETYPE_VIDEO_VP9, + SCREEN_INFO.width, + SCREEN_INFO.width + ) + ) + return res != null +} + +fun requestPermission(context: Context, type: String) { + val permission = when (type) { + "audio" -> { + Permission.RECORD_AUDIO + } + "file" -> { + Permission.MANAGE_EXTERNAL_STORAGE + } + else -> { + return + } + } + XXPermissions.with(context) + .permission(permission) + .request { permissions, all -> + if (all) { + Handler(Looper.getMainLooper()).post { + MainActivity.flutterMethodChannel.invokeMethod( + "on_android_permission_result", + mapOf("type" to type, "result" to all) + ) + } + } + } +} + +fun checkPermission(context: Context, type: String): Boolean { + val permission = when (type) { + "audio" -> { + Permission.RECORD_AUDIO + } + "file" -> { + Permission.MANAGE_EXTERNAL_STORAGE + } + else -> { + return false + } + } + return XXPermissions.isGranted(context, permission) +} + +class AudioReader(val bufSize: Int, private val maxFrames: Int) { + private var currentPos = 0 + private val bufferPool: Array + + init { + if (maxFrames < 0 || maxFrames > 32) { + throw Exception("Out of bounds") + } + if (bufSize <= 0) { + throw Exception("Wrong bufSize") + } + bufferPool = Array(maxFrames) { + ByteBuffer.allocateDirect(bufSize) + } + } + + private fun next() { + currentPos++ + if (currentPos >= maxFrames) { + currentPos = 0 + } + } + + @RequiresApi(Build.VERSION_CODES.M) + fun readSync(audioRecord: AudioRecord): ByteBuffer? { + val buffer = bufferPool[currentPos] + val res = audioRecord.read(buffer, bufSize, READ_BLOCKING) + return if (res > 0) { + next() + buffer + } else { + null + } + } +} diff --git a/flutter/android/app/src/main/res/drawable-v21/launch_background.xml b/flutter/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/flutter/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/flutter/android/app/src/main/res/drawable/check_blue.xml b/flutter/android/app/src/main/res/drawable/check_blue.xml new file mode 100644 index 000000000..b06974b36 --- /dev/null +++ b/flutter/android/app/src/main/res/drawable/check_blue.xml @@ -0,0 +1,5 @@ + + + diff --git a/flutter/android/app/src/main/res/drawable/close_red.xml b/flutter/android/app/src/main/res/drawable/close_red.xml new file mode 100644 index 000000000..02ff2c8b6 --- /dev/null +++ b/flutter/android/app/src/main/res/drawable/close_red.xml @@ -0,0 +1,5 @@ + + + diff --git a/flutter/android/app/src/main/res/drawable/launch_background.xml b/flutter/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/flutter/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9a6ce011d Binary files /dev/null and b/flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..20cb4f904 Binary files /dev/null and b/flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b77c65d15 Binary files /dev/null and b/flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..638a672f9 Binary files /dev/null and b/flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..de6dc58b4 Binary files /dev/null and b/flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/flutter/android/app/src/main/res/values-night/styles.xml b/flutter/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..449a9f930 --- /dev/null +++ b/flutter/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/flutter/android/app/src/main/res/values/colors.xml b/flutter/android/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..273468987 --- /dev/null +++ b/flutter/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #FF0071FF + \ No newline at end of file diff --git a/flutter/android/app/src/main/res/values/strings.xml b/flutter/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..3e058a81b --- /dev/null +++ b/flutter/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + RustDesk + Allow other devices to control your phone using virtual touch, when RustDesk screen sharing is established + diff --git a/flutter/android/app/src/main/res/values/styles.xml b/flutter/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..d74aa35c2 --- /dev/null +++ b/flutter/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/flutter/android/app/src/main/res/xml/accessibility_service_config.xml b/flutter/android/app/src/main/res/xml/accessibility_service_config.xml new file mode 100644 index 000000000..fa9407128 --- /dev/null +++ b/flutter/android/app/src/main/res/xml/accessibility_service_config.xml @@ -0,0 +1,6 @@ + diff --git a/flutter/android/app/src/profile/AndroidManifest.xml b/flutter/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..64d68a588 --- /dev/null +++ b/flutter/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/flutter/android/build.gradle b/flutter/android/build.gradle new file mode 100644 index 000000000..e34fecc69 --- /dev/null +++ b/flutter/android/build.gradle @@ -0,0 +1,32 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + jcenter() + maven { url 'https://jitpack.io' } + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.0.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.3' + } +} + +allprojects { + repositories { + google() + jcenter() + maven { url 'https://jitpack.io' } + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/flutter/android/flutter_hbb_android.iml b/flutter/android/flutter_hbb_android.iml new file mode 100644 index 000000000..18999696a --- /dev/null +++ b/flutter/android/flutter_hbb_android.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/flutter/android/gradle.properties b/flutter/android/gradle.properties new file mode 100644 index 000000000..94adc3a3f --- /dev/null +++ b/flutter/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/flutter/android/gradle/wrapper/gradle-wrapper.properties b/flutter/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..b8793d3c0 --- /dev/null +++ b/flutter/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/flutter/android/key.jks b/flutter/android/key.jks new file mode 100644 index 000000000..8e1763f46 Binary files /dev/null and b/flutter/android/key.jks differ diff --git a/flutter/android/settings.gradle b/flutter/android/settings.gradle new file mode 100644 index 000000000..44e62bcf0 --- /dev/null +++ b/flutter/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/flutter/assets/android.png b/flutter/assets/android.png new file mode 100644 index 000000000..323100330 Binary files /dev/null and b/flutter/assets/android.png differ diff --git a/flutter/assets/gestures.ttf b/flutter/assets/gestures.ttf new file mode 100644 index 000000000..b6cebbf43 Binary files /dev/null and b/flutter/assets/gestures.ttf differ diff --git a/flutter/assets/insecure.png b/flutter/assets/insecure.png new file mode 100644 index 000000000..0c954468d Binary files /dev/null and b/flutter/assets/insecure.png differ diff --git a/flutter/assets/insecure_relay.png b/flutter/assets/insecure_relay.png new file mode 100644 index 000000000..878d57467 Binary files /dev/null and b/flutter/assets/insecure_relay.png differ diff --git a/flutter/assets/linux.png b/flutter/assets/linux.png new file mode 100644 index 000000000..456e58675 Binary files /dev/null and b/flutter/assets/linux.png differ diff --git a/flutter/assets/mac.png b/flutter/assets/mac.png new file mode 100644 index 000000000..4be16f369 Binary files /dev/null and b/flutter/assets/mac.png differ diff --git a/flutter/assets/secure.png b/flutter/assets/secure.png new file mode 100644 index 000000000..01dcb2a8a Binary files /dev/null and b/flutter/assets/secure.png differ diff --git a/flutter/assets/secure_relay.png b/flutter/assets/secure_relay.png new file mode 100644 index 000000000..4119f05ba Binary files /dev/null and b/flutter/assets/secure_relay.png differ diff --git a/flutter/assets/win.png b/flutter/assets/win.png new file mode 100644 index 000000000..5ce86a257 Binary files /dev/null and b/flutter/assets/win.png differ diff --git a/flutter/build_android.sh b/flutter/build_android.sh new file mode 100755 index 000000000..4f4038593 --- /dev/null +++ b/flutter/build_android.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +$ANDROID_NDK/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-strip android/app/src/main/jniLibs/arm64-v8a/* +flutter build apk --target-platform android-arm64 --release --obfuscate --split-debug-info ./split-debug-info +flutter build appbundle --target-platform android-arm64 --release --obfuscate --split-debug-info ./split-debug-info + +# build in linux +# $ANDROID_NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip android/app/src/main/jniLibs/arm64-v8a/* diff --git a/flutter/build_ios.sh b/flutter/build_ios.sh new file mode 100755 index 000000000..6d0d627ac --- /dev/null +++ b/flutter/build_ios.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info diff --git a/flutter/deploy.sh b/flutter/deploy.sh new file mode 100755 index 000000000..c18803419 --- /dev/null +++ b/flutter/deploy.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +cd build/web/ +python3 -c 'x=open("./main.dart.js", "rt").read();import re;y=re.search("https://.*canvaskit-wasm@([\d\.]+)/bin/",x);dirname="canvaskit@"+y.groups()[0];z=x.replace(y.group(),"/"+dirname+"/");f=open("./main.dart.js", "wt");f.write(z);import os;os.system("ln -s canvaskit " + dirname);' +python3 -c 'import hashlib;x=hashlib.sha1(open("./main.dart.js").read().encode()).hexdigest()[:10];y=open("index.html","rt").read().replace("main.dart.js", "main.dart.js?v="+x);open("index.html","wt").write(y)' +tar czf x * +scp x sg:/tmp/ +ssh sg "sudo tar xzf /tmp/x -C /var/www/html/web.rustdesk.com/ && /bin/rm /tmp/x && sudo chown www-data:www-data /var/www/html/web.rustdesk.com/ -R" +/bin/rm x +cd - diff --git a/flutter/ios/.gitignore b/flutter/ios/.gitignore new file mode 100644 index 000000000..151026b91 --- /dev/null +++ b/flutter/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/flutter/ios/Flutter/AppFrameworkInfo.plist b/flutter/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..8d4492f97 --- /dev/null +++ b/flutter/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/flutter/ios/Flutter/Debug.xcconfig b/flutter/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..ec97fc6f3 --- /dev/null +++ b/flutter/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/flutter/ios/Flutter/Release.xcconfig b/flutter/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..c4855bfe2 --- /dev/null +++ b/flutter/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/flutter/ios/Podfile b/flutter/ios/Podfile new file mode 100644 index 000000000..0df0a09f8 --- /dev/null +++ b/flutter/ios/Podfile @@ -0,0 +1,45 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +platform :ios, '11.0' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end + + diff --git a/flutter/ios/Podfile.lock b/flutter/ios/Podfile.lock new file mode 100644 index 000000000..947fd0d36 --- /dev/null +++ b/flutter/ios/Podfile.lock @@ -0,0 +1,194 @@ +PODS: + - device_info (0.0.1): + - Flutter + - Firebase/Analytics (8.14.0): + - Firebase/Core + - Firebase/Core (8.14.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 8.14.0) + - Firebase/CoreOnly (8.14.0): + - FirebaseCore (= 8.14.0) + - firebase_analytics (9.1.5): + - Firebase/Analytics (= 8.14.0) + - firebase_core + - Flutter + - firebase_core (1.14.1): + - Firebase/CoreOnly (= 8.14.0) + - Flutter + - FirebaseAnalytics (8.14.0): + - FirebaseAnalytics/AdIdSupport (= 8.14.0) + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.7) + - GoogleUtilities/MethodSwizzler (~> 7.7) + - GoogleUtilities/Network (~> 7.7) + - "GoogleUtilities/NSData+zlib (~> 7.7)" + - nanopb (~> 2.30908.0) + - FirebaseAnalytics/AdIdSupport (8.14.0): + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleAppMeasurement (= 8.14.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.7) + - GoogleUtilities/MethodSwizzler (~> 7.7) + - GoogleUtilities/Network (~> 7.7) + - "GoogleUtilities/NSData+zlib (~> 7.7)" + - nanopb (~> 2.30908.0) + - FirebaseCore (8.14.0): + - FirebaseCoreDiagnostics (~> 8.0) + - GoogleUtilities/Environment (~> 7.7) + - GoogleUtilities/Logger (~> 7.7) + - FirebaseCoreDiagnostics (8.15.0): + - GoogleDataTransport (~> 9.1) + - GoogleUtilities/Environment (~> 7.7) + - GoogleUtilities/Logger (~> 7.7) + - nanopb (~> 2.30908.0) + - FirebaseInstallations (8.15.0): + - FirebaseCore (~> 8.0) + - GoogleUtilities/Environment (~> 7.7) + - GoogleUtilities/UserDefaults (~> 7.7) + - PromisesObjC (< 3.0, >= 1.2) + - Flutter (1.0.0) + - GoogleAppMeasurement (8.14.0): + - GoogleAppMeasurement/AdIdSupport (= 8.14.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.7) + - GoogleUtilities/MethodSwizzler (~> 7.7) + - GoogleUtilities/Network (~> 7.7) + - "GoogleUtilities/NSData+zlib (~> 7.7)" + - nanopb (~> 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (8.14.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 8.14.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.7) + - GoogleUtilities/MethodSwizzler (~> 7.7) + - GoogleUtilities/Network (~> 7.7) + - "GoogleUtilities/NSData+zlib (~> 7.7)" + - nanopb (~> 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (8.14.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.7) + - GoogleUtilities/MethodSwizzler (~> 7.7) + - GoogleUtilities/Network (~> 7.7) + - "GoogleUtilities/NSData+zlib (~> 7.7)" + - nanopb (~> 2.30908.0) + - GoogleDataTransport (9.1.2): + - GoogleUtilities/Environment (~> 7.2) + - nanopb (~> 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.7.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.7.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.7.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.7.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.7.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.7.0)" + - GoogleUtilities/Reachability (7.7.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.7.0): + - GoogleUtilities/Logger + - image_picker_ios (0.0.1): + - Flutter + - MTBBarcodeScanner (5.0.11) + - nanopb (2.30908.0): + - nanopb/decode (= 2.30908.0) + - nanopb/encode (= 2.30908.0) + - nanopb/decode (2.30908.0) + - nanopb/encode (2.30908.0) + - package_info (0.0.1): + - Flutter + - path_provider_ios (0.0.1): + - Flutter + - PromisesObjC (2.1.0) + - qr_code_scanner (0.2.0): + - Flutter + - MTBBarcodeScanner + - shared_preferences_ios (0.0.1): + - Flutter + - url_launcher_ios (0.0.1): + - Flutter + - wakelock (0.0.1): + - Flutter + +DEPENDENCIES: + - device_info (from `.symlinks/plugins/device_info/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - Flutter (from `Flutter`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) + - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - wakelock (from `.symlinks/plugins/wakelock/ios`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseInstallations + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - MTBBarcodeScanner + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + device_info: + :path: ".symlinks/plugins/device_info/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + Flutter: + :path: Flutter + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + qr_code_scanner: + :path: ".symlinks/plugins/qr_code_scanner/ios" + shared_preferences_ios: + :path: ".symlinks/plugins/shared_preferences_ios/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + wakelock: + :path: ".symlinks/plugins/wakelock/ios" + +SPEC CHECKSUMS: + device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 + Firebase: 7e8fe528c161b9271d365217a74c16aaf834578e + firebase_analytics: 8a36c76380be1fca3bab69534cf911082e0d7ab8 + firebase_core: cdef02fcf55872191eb0568d4c31a7a700e38582 + FirebaseAnalytics: 2fc3876e2eb347673ad2f35e249ae7b15d6c88f5 + FirebaseCore: b84a44ee7ba999e0f9f76d198a9c7f60a797b848 + FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb + FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + GoogleAppMeasurement: 71156240babd3cc6ced03e0d54816f01a880c730 + GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 + GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1 + image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb + MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb + nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 + PromisesObjC: 99b6f43f9e1044bd87a95a60beff28c2c44ddb72 + qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e + shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad + url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de + wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f + +PODFILE CHECKSUM: a00077baecbb97321490c14848fceed3893ca92a + +COCOAPODS: 1.11.3 diff --git a/flutter/ios/Runner.xcodeproj/project.pbxproj b/flutter/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..953dad47b --- /dev/null +++ b/flutter/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,575 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7E078EE926BAB4720036E738 /* liblibrustdesk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E078EE826BAB4710036E738 /* liblibrustdesk.a */; }; + 7E078EEC26BADB3D0036E738 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E078EEB26BADB3D0036E738 /* GoogleService-Info.plist */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C362FA62593C0A953D788A2B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D81DD31BD179189F3EA0124A /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7B0BE50AED65C219B81E506C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7E078EE826BAB4710036E738 /* liblibrustdesk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibrustdesk.a; path = "../../target/aarch64-apple-ios/release/liblibrustdesk.a"; sourceTree = ""; }; + 7E078EEA26BABB100036E738 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; + 7E078EEB26BADB3D0036E738 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 7E0A73A826CAB3C100FF94B3 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 94AF76B3E95A41AD3421FB7B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C9E47BCA6B42B34FF7A143DA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + D81DD31BD179189F3EA0124A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E078EE926BAB4720036E738 /* liblibrustdesk.a in Frameworks */, + C362FA62593C0A953D788A2B /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4064E93F6C682BED4ADBDEEA /* Pods */ = { + isa = PBXGroup; + children = ( + 94AF76B3E95A41AD3421FB7B /* Pods-Runner.debug.xcconfig */, + 7B0BE50AED65C219B81E506C /* Pods-Runner.release.xcconfig */, + C9E47BCA6B42B34FF7A143DA /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 4064E93F6C682BED4ADBDEEA /* Pods */, + 9F474765C702311B2610E104 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7E0A73A826CAB3C100FF94B3 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 7E078EEB26BADB3D0036E738 /* GoogleService-Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 7E078EEA26BABB100036E738 /* ffi.h */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 9F474765C702311B2610E104 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7E078EE826BAB4710036E738 /* liblibrustdesk.a */, + D81DD31BD179189F3EA0124A /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7E81731B2965F8CA22E67C02 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 3974543C243EF943511C7BDD /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 7E078EEC26BADB3D0036E738 /* GoogleService-Info.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3974543C243EF943511C7BDD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 7E81731B2965F8CA22E67C02 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = HZF9JMC8YN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/"; + PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_STYLE = "non-global"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = HZF9JMC8YN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/"; + PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_STYLE = "non-global"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = HZF9JMC8YN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/"; + PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_STYLE = "non-global"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..3db53b6e1 --- /dev/null +++ b/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata b/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/flutter/ios/Runner/AppDelegate.swift b/flutter/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..203cfff11 --- /dev/null +++ b/flutter/ios/Runner/AppDelegate.swift @@ -0,0 +1,21 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + dummyMethodToEnforceBundling(); + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + public func dummyMethodToEnforceBundling() { + get_rgba(); + free_rgba(nil); + get_by_name("", ""); + set_by_name("", ""); + } +} diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 000000000..eb0bf04fd Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 000000000..b17866fe4 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 000000000..70164e1a4 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 000000000..fa5fb621a Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 000000000..8999d5ed9 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 000000000..047d553ce Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 000000000..295741a1b Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 000000000..70164e1a4 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 000000000..6207bba1b Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 000000000..df9cb7d0a Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 000000000..df9cb7d0a Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 000000000..12ffdab24 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 000000000..563187384 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 000000000..834c4d8e8 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 000000000..4a3ffa808 Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard b/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/flutter/ios/Runner/Base.lproj/Main.storyboard b/flutter/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/flutter/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/flutter/ios/Runner/GoogleService-Info.plist b/flutter/ios/Runner/GoogleService-Info.plist new file mode 100644 index 000000000..f39288230 --- /dev/null +++ b/flutter/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 768133699366-k1rn3ls1u2n3nklmgd9t4cmpdob0c8bn.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.768133699366-k1rn3ls1u2n3nklmgd9t4cmpdob0c8bn + API_KEY + AIzaSyCf57HjCwSokt91CqFI0Mwf8D--ek0jvfc + GCM_SENDER_ID + 768133699366 + PLIST_VERSION + 1 + BUNDLE_ID + com.carriez.flutterHbb + PROJECT_ID + rustdesk + STORAGE_BUCKET + rustdesk.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:768133699366:ios:c33078a6181b9d507993e7 + DATABASE_URL + https://rustdesk.firebaseio.com + + \ No newline at end of file diff --git a/flutter/ios/Runner/Info.plist b/flutter/ios/Runner/Info.plist new file mode 100644 index 000000000..3886d2456 --- /dev/null +++ b/flutter/ios/Runner/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + RustDesk + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + ITSAppUsesNonExemptEncryption + + io.flutter.embedded_views_preview + + NSCameraUsageDescription + This app needs camera access to scan QR codes + NSPhotoLibraryUsageDescription + This app needs photo library access to get QR codes from image + + diff --git a/flutter/ios/Runner/Runner-Bridging-Header.h b/flutter/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..a8c447418 --- /dev/null +++ b/flutter/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1,3 @@ +#import "GeneratedPluginRegistrant.h" + +#import "ffi.h" diff --git a/flutter/ios/Runner/Runner.entitlements b/flutter/ios/Runner/Runner.entitlements new file mode 100644 index 000000000..ba21fbdaf --- /dev/null +++ b/flutter/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.networking.wifi-info + + + diff --git a/flutter/ios/Runner/ffi.h b/flutter/ios/Runner/ffi.h new file mode 100644 index 000000000..701ec4b09 --- /dev/null +++ b/flutter/ios/Runner/ffi.h @@ -0,0 +1,4 @@ +void* get_rgba(); +void free_rgba(void*); +void set_by_name(const char*, const char*); +const char* get_by_name(const char*, const char*); diff --git a/flutter/ios_arm64.sh b/flutter/ios_arm64.sh new file mode 100755 index 000000000..01a09a4b4 --- /dev/null +++ b/flutter/ios_arm64.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +cargo build --release --target aarch64-apple-ios diff --git a/flutter/ios_x64.sh b/flutter/ios_x64.sh new file mode 100755 index 000000000..455ef4199 --- /dev/null +++ b/flutter/ios_x64.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +cargo build --release --target x86_64-apple-ios diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart new file mode 100644 index 000000000..42487379c --- /dev/null +++ b/flutter/lib/common.dart @@ -0,0 +1,307 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; + +import 'models/model.dart'; + +final globalKey = GlobalKey(); +final navigationBarKey = GlobalKey(); + +var isAndroid = false; +var isIOS = false; +var isWeb = false; +var isDesktop = false; +var version = ""; +int androidVersion = 0; + +typedef F = String Function(String); +typedef FMethod = String Function(String, dynamic); + +class Translator { + static late F call; +} + +class MyTheme { + MyTheme._(); + + static const Color grayBg = Color(0xFFEEEEEE); + static const Color white = Color(0xFFFFFFFF); + static const Color accent = Color(0xFF0071FF); + static const Color accent50 = Color(0x770071FF); + static const Color accent80 = Color(0xAA0071FF); + static const Color canvasColor = Color(0xFF212121); + static const Color border = Color(0xFFCCCCCC); + static const Color idColor = Color(0xFF00B6F0); + static const Color darkGray = Color(0xFFB9BABC); +} + +final ButtonStyle flatButtonStyle = TextButton.styleFrom( + minimumSize: Size(88, 36), + padding: EdgeInsets.symmetric(horizontal: 16.0), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(2.0)), + ), +); + +void showToast(String text, {Duration? duration}) { + SmartDialog.showToast(text, displayTime: duration); +} + +void showLoading(String text, {bool clickMaskDismiss = false}) { + SmartDialog.dismiss(); + SmartDialog.showLoading( + clickMaskDismiss: false, + builder: (context) { + return Container( + color: MyTheme.white, + constraints: BoxConstraints(maxWidth: 240), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 30), + Center(child: CircularProgressIndicator()), + SizedBox(height: 20), + Center( + child: Text(Translator.call(text), + style: TextStyle(fontSize: 15))), + SizedBox(height: 20), + Center( + child: TextButton( + style: flatButtonStyle, + onPressed: () { + SmartDialog.dismiss(); + backToHome(); + }, + child: Text(Translator.call('Cancel'), + style: TextStyle(color: MyTheme.accent)))) + ])); + }); +} + +backToHome() { + Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/")); +} + +typedef DialogBuilder = CustomAlertDialog Function( + StateSetter setState, void Function([dynamic]) close); + +class DialogManager { + static int _tag = 0; + + static dismissByTag(String tag, [result]) { + SmartDialog.dismiss(tag: tag, result: result); + } + + static Future show(DialogBuilder builder, + {bool clickMaskDismiss = false, + bool backDismiss = false, + String? tag, + bool useAnimation = true}) async { + final t; + if (tag != null) { + t = tag; + } else { + _tag += 1; + t = _tag.toString(); + } + SmartDialog.dismiss(status: SmartStatus.allToast); + SmartDialog.dismiss(status: SmartStatus.loading); + final close = ([res]) { + SmartDialog.dismiss(tag: t, result: res); + }; + final res = await SmartDialog.show( + tag: t, + clickMaskDismiss: clickMaskDismiss, + backDismiss: backDismiss, + useAnimation: useAnimation, + builder: (_) => StatefulBuilder( + builder: (_, setState) => builder(setState, close))); + return res; + } +} + +class CustomAlertDialog extends StatelessWidget { + CustomAlertDialog( + {required this.title, + required this.content, + required this.actions, + this.contentPadding}); + + final Widget title; + final Widget content; + final List actions; + final double? contentPadding; + + @override + Widget build(BuildContext context) { + return AlertDialog( + scrollable: true, + title: title, + contentPadding: + EdgeInsets.symmetric(horizontal: contentPadding ?? 25, vertical: 10), + content: content, + actions: actions, + ); + } +} + +void msgBox(String type, String title, String text, {bool? hasCancel}) { + var wrap = (String text, void Function() onPressed) => ButtonTheme( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + //limits the touch area to the button area + minWidth: 0, + //wraps child's width + height: 0, + child: TextButton( + style: flatButtonStyle, + onPressed: onPressed, + child: Text(Translator.call(text), + style: TextStyle(color: MyTheme.accent)))); + + SmartDialog.dismiss(); + final buttons = [ + wrap(Translator.call('OK'), () { + SmartDialog.dismiss(); + backToHome(); + }) + ]; + if (hasCancel == null) { + hasCancel = type != 'error'; + } + if (hasCancel) { + buttons.insert( + 0, + wrap(Translator.call('Cancel'), () { + SmartDialog.dismiss(); + })); + } + DialogManager.show((setState, close) => CustomAlertDialog( + title: Text(translate(title), style: TextStyle(fontSize: 21)), + content: Text(Translator.call(text), style: TextStyle(fontSize: 15)), + actions: buttons)); +} + +Color str2color(String str, [alpha = 0xFF]) { + var hash = 160 << 16 + 114 << 8 + 91; + for (var i = 0; i < str.length; i += 1) { + hash = str.codeUnitAt(i) + ((hash << 5) - hash); + } + hash = hash % 16777216; + return Color((hash & 0xFF7FFF) | (alpha << 24)); +} + +const K = 1024; +const M = K * K; +const G = M * K; + +String readableFileSize(double size) { + if (size < K) { + return size.toString() + " B"; + } else if (size < M) { + return (size / K).toStringAsFixed(2) + " KB"; + } else if (size < G) { + return (size / M).toStringAsFixed(2) + " MB"; + } else { + return (size / G).toStringAsFixed(2) + " GB"; + } +} + +/// Flutter can't not catch PointerMoveEvent when size is 1 +/// This will happen in Android AccessibilityService Input +/// android can't init dispatching size yet ,see: https://stackoverflow.com/questions/59960451/android-accessibility-dispatchgesture-is-it-possible-to-specify-pressure-for-a +/// use this temporary solution until flutter or android fixes the bug +class AccessibilityListener extends StatelessWidget { + final Widget? child; + static final offset = 100; + + AccessibilityListener({this.child}); + + @override + Widget build(BuildContext context) { + return Listener( + onPointerDown: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerAddedEvent( + pointer: evt.pointer + offset, position: evt.position)); + GestureBinding.instance!.handlePointerEvent(PointerDownEvent( + pointer: evt.pointer + offset, + size: 0.1, + position: evt.position)); + } + }, + onPointerUp: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerUpEvent( + pointer: evt.pointer + offset, + size: 0.1, + position: evt.position)); + GestureBinding.instance!.handlePointerEvent(PointerRemovedEvent( + pointer: evt.pointer + offset, position: evt.position)); + } + }, + onPointerMove: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerMoveEvent( + pointer: evt.pointer + offset, + size: 0.1, + delta: evt.delta, + position: evt.position)); + } + }, + child: child); + } +} + +class PermissionManager { + static Completer? _completer; + static Timer? _timer; + static var _current = ""; + + static final permissions = ["audio", "file"]; + + static bool isWaitingFile() { + if (_completer != null) { + return !_completer!.isCompleted && _current == "file"; + } + return false; + } + + static Future check(String type) { + if (!permissions.contains(type)) + return Future.error("Wrong permission!$type"); + return FFI.invokeMethod("check_permission", type); + } + + static Future request(String type) { + if (!permissions.contains(type)) + return Future.error("Wrong permission!$type"); + + _current = type; + _completer = Completer(); + FFI.invokeMethod("request_permission", type); + + // timeout + _timer?.cancel(); + _timer = Timer(Duration(seconds: 60), () { + if (_completer == null) return; + if (!_completer!.isCompleted) { + _completer!.complete(false); + } + _completer = null; + _current = ""; + }); + return _completer!.future; + } + + static complete(String type, bool res) { + if (type != _current) { + res = false; + } + _timer?.cancel(); + _completer?.complete(res); + _current = ""; + } +} diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart new file mode 100644 index 000000000..a81a047b4 --- /dev/null +++ b/flutter/lib/main.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:provider/provider.dart'; +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'common.dart'; +import 'models/model.dart'; +import 'pages/home_page.dart'; +import 'pages/server_page.dart'; +import 'pages/settings_page.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + var a = FFI.ffiModel.init(); + var b = Firebase.initializeApp(); + await a; + await b; + refreshCurrentUser(); + toAndroidChannelInit(); + runApp(App()); +} + +class App extends StatelessWidget { + @override + Widget build(BuildContext context) { + final analytics = FirebaseAnalytics.instance; + return MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: FFI.ffiModel), + ChangeNotifierProvider.value(value: FFI.imageModel), + ChangeNotifierProvider.value(value: FFI.cursorModel), + ChangeNotifierProvider.value(value: FFI.canvasModel), + ], + child: MaterialApp( + navigatorKey: globalKey, + debugShowCheckedModeBanner: false, + title: 'RustDesk', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: !isAndroid ? WebHomePage() : HomePage(), + navigatorObservers: [ + FirebaseAnalyticsObserver(analytics: analytics), + FlutterSmartDialog.observer + ], + builder: FlutterSmartDialog.init( + builder: isAndroid + ? (_, child) => AccessibilityListener( + child: child, + ) + : null)), + ); + } +} diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart new file mode 100644 index 000000000..8ee93ae28 --- /dev/null +++ b/flutter/lib/models/chat_model.dart @@ -0,0 +1,103 @@ +import 'dart:convert'; + +import 'package:dash_chat/dash_chat.dart'; +import 'package:flutter/material.dart'; + +import '../widgets/overlay.dart'; +import 'model.dart'; + +class ChatModel with ChangeNotifier { + static final clientModeID = -1; + + final Map> _messages = Map()..[clientModeID] = []; + + final ChatUser me = ChatUser( + uid: "", + name: "Me", + ); + + final _scroller = ScrollController(); + + var _currentID = clientModeID; + + ScrollController get scroller => _scroller; + + Map> get messages => _messages; + + int get currentID => _currentID; + + ChatUser get currentUser => + FFI.serverModel.clients[_currentID]?.chatUser ?? me; + + changeCurrentID(int id) { + if (_messages.containsKey(id)) { + _currentID = id; + notifyListeners(); + } else { + final chatUser = FFI.serverModel.clients[id]?.chatUser; + if (chatUser == null) { + return debugPrint( + "Failed to changeCurrentID,remote user doesn't exist"); + } + _messages[id] = []; + _currentID = id; + } + } + + receive(int id, String text) { + if (text.isEmpty) return; + // first message show overlay icon + if (chatIconOverlayEntry == null) { + showChatIconOverlay(); + } + late final chatUser; + if (id == clientModeID) { + chatUser = ChatUser( + name: FFI.ffiModel.pi.username, + uid: FFI.getId(), + ); + } else { + chatUser = FFI.serverModel.clients[id]?.chatUser; + } + if (chatUser == null) { + return debugPrint("Failed to receive msg,user doesn't exist"); + } + if (!_messages.containsKey(id)) { + _messages[id] = []; + } + _messages[id]!.add(ChatMessage(text: text, user: chatUser)); + _currentID = id; + notifyListeners(); + scrollToBottom(); + } + + scrollToBottom() { + Future.delayed(Duration(milliseconds: 500), () { + _scroller.animateTo(_scroller.position.maxScrollExtent, + duration: Duration(milliseconds: 200), + curve: Curves.fastLinearToSlowEaseIn); + }); + } + + send(ChatMessage message) { + if (message.text != null && message.text!.isNotEmpty) { + _messages[_currentID]?.add(message); + if (_currentID == clientModeID) { + FFI.setByName("chat_client_mode", message.text!); + } else { + final msg = Map() + ..["id"] = _currentID + ..["text"] = message.text!; + FFI.setByName("chat_server_mode", jsonEncode(msg)); + } + } + notifyListeners(); + scrollToBottom(); + } + + close() { + hideChatIconOverlay(); + hideChatWindowOverlay(); + notifyListeners(); + } +} diff --git a/flutter/lib/models/file_model.dart b/flutter/lib/models/file_model.dart new file mode 100644 index 000000000..10325f2b0 --- /dev/null +++ b/flutter/lib/models/file_model.dart @@ -0,0 +1,775 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/pages/file_manager_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:path/path.dart' as Path; + +import 'model.dart'; + +enum SortBy { Name, Type, Modified, Size } + +class FileModel extends ChangeNotifier { + var _isLocal = false; + var _selectMode = false; + + var _localOption = DirectoryOption(); + var _remoteOption = DirectoryOption(); + + var _jobId = 0; + + var _jobProgress = JobProgress(); // from rust update + + bool get isLocal => _isLocal; + + bool get selectMode => _selectMode; + + JobProgress get jobProgress => _jobProgress; + + JobState get jobState => _jobProgress.state; + + SortBy _sortStyle = SortBy.Name; + + SortBy get sortStyle => _sortStyle; + + FileDirectory _currentLocalDir = FileDirectory(); + + FileDirectory get currentLocalDir => _currentLocalDir; + + FileDirectory _currentRemoteDir = FileDirectory(); + + FileDirectory get currentRemoteDir => _currentRemoteDir; + + FileDirectory get currentDir => _isLocal ? currentLocalDir : currentRemoteDir; + + String get currentHome => _isLocal ? _localOption.home : _remoteOption.home; + + String get currentShortPath { + if (currentDir.path.startsWith(currentHome)) { + var path = currentDir.path.replaceFirst(currentHome, ""); + if (path.length == 0) return ""; + if (path[0] == "/" || path[0] == "\\") { + // remove more '/' or '\' + path = path.replaceFirst(path[0], ""); + } + return path; + } else { + return currentDir.path.replaceFirst(currentHome, ""); + } + } + + bool get currentShowHidden => + _isLocal ? _localOption.showHidden : _remoteOption.showHidden; + + bool get currentIsWindows => + _isLocal ? _localOption.isWindows : _remoteOption.isWindows; + + final _fileFetcher = FileFetcher(); + + final _jobResultListener = JobResultListener>(); + + toggleSelectMode() { + if (jobState == JobState.inProgress) { + return; + } + _selectMode = !_selectMode; + notifyListeners(); + } + + togglePage() { + _isLocal = !_isLocal; + notifyListeners(); + } + + toggleShowHidden({bool? showHidden, bool? local}) { + final isLocal = local ?? _isLocal; + if (isLocal) { + _localOption.showHidden = showHidden ?? !_localOption.showHidden; + } else { + _remoteOption.showHidden = showHidden ?? !_remoteOption.showHidden; + } + refresh(); + } + + tryUpdateJobProgress(Map evt) { + try { + int id = int.parse(evt['id']); + _jobProgress.id = id; + _jobProgress.fileNum = int.parse(evt['file_num']); + _jobProgress.speed = double.parse(evt['speed']); + _jobProgress.finishedSize = int.parse(evt['finished_size']); + notifyListeners(); + } catch (e) { + debugPrint("Failed to tryUpdateJobProgress,evt:${evt.toString()}"); + } + } + + receiveFileDir(Map evt) { + if (_remoteOption.home.isEmpty && evt['is_local'] == "false") { + // init remote home, the connection will automatic read remote home when established, + try { + final fd = FileDirectory.fromJson(jsonDecode(evt['value'])); + fd.format(_remoteOption.isWindows, sort: _sortStyle); + _remoteOption.home = fd.path; + debugPrint("init remote home:${fd.path}"); + _currentRemoteDir = fd; + notifyListeners(); + return; + } finally {} + } + _fileFetcher.tryCompleteTask(evt['value'], evt['is_local']); + } + + jobDone(Map evt) { + if (_jobResultListener.isListening) { + _jobResultListener.complete(evt); + return; + } + _selectMode = false; + _jobProgress.state = JobState.done; + refresh(); + } + + jobError(Map evt) { + if (_jobResultListener.isListening) { + _jobResultListener.complete(evt); + return; + } + + debugPrint("jobError $evt"); + _selectMode = false; + _jobProgress.clear(); + _jobProgress.state = JobState.error; + notifyListeners(); + } + + jobReset() { + _jobProgress.clear(); + notifyListeners(); + } + + onReady() async { + _localOption.home = FFI.getByName("get_home_dir"); + _localOption.showHidden = + FFI.getByName("peer_option", "local_show_hidden").isNotEmpty; + + _remoteOption.showHidden = + FFI.getByName("peer_option", "remote_show_hidden").isNotEmpty; + _remoteOption.isWindows = FFI.ffiModel.pi.platform == "Windows"; + + debugPrint("remote platform: ${FFI.ffiModel.pi.platform}"); + + await Future.delayed(Duration(milliseconds: 100)); + + final local = FFI.getByName("peer_option", "local_dir"); + final remote = FFI.getByName("peer_option", "remote_dir"); + openDirectory(local.isEmpty ? _localOption.home : local, isLocal: true); + openDirectory(remote.isEmpty ? _remoteOption.home : remote, isLocal: false); + await Future.delayed(Duration(seconds: 1)); + if (_currentLocalDir.path.isEmpty) { + openDirectory(_localOption.home, isLocal: true); + } + if (_currentRemoteDir.path.isEmpty) { + openDirectory(_remoteOption.home, isLocal: false); + } + } + + onClose() { + SmartDialog.dismiss(); + + // save config + Map msg = Map(); + + msg["name"] = "local_dir"; + msg["value"] = _currentLocalDir.path; + FFI.setByName('peer_option', jsonEncode(msg)); + + msg["name"] = "local_show_hidden"; + msg["value"] = _localOption.showHidden ? "Y" : ""; + FFI.setByName('peer_option', jsonEncode(msg)); + + msg["name"] = "remote_dir"; + msg["value"] = _currentRemoteDir.path; + FFI.setByName('peer_option', jsonEncode(msg)); + + msg["name"] = "remote_show_hidden"; + msg["value"] = _remoteOption.showHidden ? "Y" : ""; + FFI.setByName('peer_option', jsonEncode(msg)); + _currentLocalDir.clear(); + _currentRemoteDir.clear(); + _localOption.clear(); + _remoteOption.clear(); + } + + refresh() { + openDirectory(currentDir.path); + } + + openDirectory(String path, {bool? isLocal}) async { + isLocal = isLocal ?? _isLocal; + final showHidden = + isLocal ? _localOption.showHidden : _remoteOption.showHidden; + final isWindows = + isLocal ? _localOption.isWindows : _remoteOption.isWindows; + try { + final fd = await _fileFetcher.fetchDirectory(path, isLocal, showHidden); + fd.format(isWindows, sort: _sortStyle); + if (isLocal) { + _currentLocalDir = fd; + } else { + _currentRemoteDir = fd; + } + notifyListeners(); + } catch (e) { + debugPrint("Failed to openDirectory :$e"); + } + } + + goHome() { + openDirectory(currentHome); + } + + goToParentDirectory() { + final parent = PathUtil.dirname(currentDir.path, currentIsWindows); + openDirectory(parent); + } + + sendFiles(SelectedItems items) { + if (items.isLocal == null) { + debugPrint("Failed to sendFiles ,wrong path state"); + return; + } + _jobProgress.state = JobState.inProgress; + final toPath = + items.isLocal! ? currentRemoteDir.path : currentLocalDir.path; + final isWindows = + items.isLocal! ? _localOption.isWindows : _remoteOption.isWindows; + final showHidden = + items.isLocal! ? _localOption.showHidden : _remoteOption.showHidden; + items.items.forEach((from) { + _jobId++; + final msg = { + "id": _jobId.toString(), + "path": from.path, + "to": PathUtil.join(toPath, from.name, isWindows), + "show_hidden": showHidden.toString(), + "is_remote": (!(items.isLocal!)).toString() + }; + FFI.setByName("send_files", jsonEncode(msg)); + }); + } + + bool removeCheckboxRemember = false; + + removeAction(SelectedItems items) async { + removeCheckboxRemember = false; + if (items.isLocal == null) { + debugPrint("Failed to removeFile, wrong path state"); + return; + } + final isWindows = + items.isLocal! ? _localOption.isWindows : _remoteOption.isWindows; + await Future.forEach(items.items, (Entry item) async { + _jobId++; + var title = ""; + var content = ""; + late final List entries; + if (item.isFile) { + title = translate("Are you sure you want to delete this file?"); + content = "${item.name}"; + entries = [item]; + } else if (item.isDirectory) { + title = translate("Not an empty directory"); + showLoading(translate("Waiting")); + final fd = await _fileFetcher.fetchDirectoryRecursive( + _jobId, item.path, items.isLocal!, true); + if (fd.path.isEmpty) { + fd.path = item.path; + } + fd.format(isWindows); + SmartDialog.dismiss(); + if (fd.entries.isEmpty) { + final confirm = await showRemoveDialog( + translate( + "Are you sure you want to delete this empty directory?"), + item.name, + false); + if (confirm == true) { + sendRemoveEmptyDir(item.path, 0, items.isLocal!); + } + return; + } + entries = fd.entries; + } else { + entries = []; + } + + for (var i = 0; i < entries.length; i++) { + final dirShow = item.isDirectory + ? "${translate("Are you sure you want to delete the file of this directory?")}\n" + : ""; + final count = entries.length > 1 ? "${i + 1}/${entries.length}" : ""; + content = dirShow + "$count \n${entries[i].path}"; + final confirm = + await showRemoveDialog(title, content, item.isDirectory); + try { + if (confirm == true) { + sendRemoveFile(entries[i].path, i, items.isLocal!); + final res = await _jobResultListener.start(); + // handle remove res; + if (item.isDirectory && + res['file_num'] == (entries.length - 1).toString()) { + sendRemoveEmptyDir(item.path, i, items.isLocal!); + } + } + if (removeCheckboxRemember) { + if (confirm == true) { + for (var j = i + 1; j < entries.length; j++) { + sendRemoveFile(entries[j].path, j, items.isLocal!); + final res = await _jobResultListener.start(); + if (item.isDirectory && + res['file_num'] == (entries.length - 1).toString()) { + sendRemoveEmptyDir(item.path, i, items.isLocal!); + } + } + } + break; + } + } catch (e) {} + } + }); + _selectMode = false; + refresh(); + } + + Future showRemoveDialog( + String title, String content, bool showCheckbox) async { + return await DialogManager.show( + (setState, Function(bool v) close) => CustomAlertDialog( + title: Row( + children: [ + Icon(Icons.warning, color: Colors.red), + SizedBox(width: 20), + Text(title) + ], + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(content), + SizedBox(height: 5), + Text(translate("This is irreversible!"), + style: TextStyle(fontWeight: FontWeight.bold)), + showCheckbox + ? CheckboxListTile( + contentPadding: const EdgeInsets.all(0), + dense: true, + controlAffinity: ListTileControlAffinity.leading, + title: Text( + translate("Do this for all conflicts"), + ), + value: removeCheckboxRemember, + onChanged: (v) { + if (v == null) return; + setState(() => removeCheckboxRemember = v); + }, + ) + : SizedBox.shrink() + ]), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () => close(false), + child: Text(translate("Cancel"))), + TextButton( + style: flatButtonStyle, + onPressed: () => close(true), + child: Text(translate("OK"))), + ]), + useAnimation: false); + } + + sendRemoveFile(String path, int fileNum, bool isLocal) { + final msg = { + "id": _jobId.toString(), + "path": path, + "file_num": fileNum.toString(), + "is_remote": (!(isLocal)).toString() + }; + FFI.setByName("remove_file", jsonEncode(msg)); + } + + sendRemoveEmptyDir(String path, int fileNum, bool isLocal) { + final msg = { + "id": _jobId.toString(), + "path": path, + "is_remote": (!isLocal).toString() + }; + FFI.setByName("remove_all_empty_dirs", jsonEncode(msg)); + } + + createDir(String path) { + _jobId++; + final msg = { + "id": _jobId.toString(), + "path": path, + "is_remote": (!isLocal).toString() + }; + FFI.setByName("create_dir", jsonEncode(msg)); + } + + cancelJob(int id) { + FFI.setByName("cancel_job", id.toString()); + jobReset(); + } + + changeSortStyle(SortBy sort) { + _sortStyle = sort; + _currentLocalDir.changeSortStyle(sort); + _currentRemoteDir.changeSortStyle(sort); + notifyListeners(); + } +} + +class JobResultListener { + Completer? _completer; + Timer? _timer; + int _timeoutSecond = 5; + + bool get isListening => _completer != null; + + clear() { + if (_completer != null) { + _timer?.cancel(); + _timer = null; + _completer!.completeError("Cancel manually"); + _completer = null; + return; + } + } + + Future start() { + if (_completer != null) return Future.error("Already start listen"); + _completer = Completer(); + _timer = Timer(Duration(seconds: _timeoutSecond), () { + if (!_completer!.isCompleted) { + _completer!.completeError("Time out"); + } + _completer = null; + }); + return _completer!.future; + } + + complete(T res) { + if (_completer != null) { + _timer?.cancel(); + _timer = null; + _completer!.complete(res); + _completer = null; + return; + } + } +} + +class FileFetcher { + // Map> localTasks = Map(); // now we only use read local dir sync + Map> remoteTasks = Map(); + Map> readRecursiveTasks = Map(); + + Future registerReadTask(bool isLocal, String path) { + // final jobs = isLocal?localJobs:remoteJobs; // maybe we will use read local dir async later + final tasks = remoteTasks; // bypass now + if (tasks.containsKey(path)) { + throw "Failed to registerReadTask, already have same read job"; + } + final c = Completer(); + tasks[path] = c; + + Timer(Duration(seconds: 2), () { + tasks.remove(path); + if (c.isCompleted) return; + c.completeError("Failed to read dir,timeout"); + }); + return c.future; + } + + Future registerReadRecursiveTask(int id) { + final tasks = readRecursiveTasks; + if (tasks.containsKey(id)) { + throw "Failed to registerRemoveTask, already have same ReadRecursive job"; + } + final c = Completer(); + tasks[id] = c; + + Timer(Duration(seconds: 2), () { + tasks.remove(id); + if (c.isCompleted) return; + c.completeError("Failed to read dir,timeout"); + }); + return c.future; + } + + tryCompleteTask(String? msg, String? isLocalStr) { + if (msg == null || isLocalStr == null) return; + late final isLocal; + late final tasks; + if (isLocalStr == "true") { + isLocal = true; + } else if (isLocalStr == "false") { + isLocal = false; + } else { + return; + } + try { + final fd = FileDirectory.fromJson(jsonDecode(msg)); + if (fd.id > 0) { + // fd.id > 0 is result for read recursive + // to-do later,will be better if every fetch use ID,so that there will only one task map for read and recursive read + tasks = readRecursiveTasks; + final completer = tasks.remove(fd.id); + completer?.complete(fd); + } else if (fd.path.isNotEmpty) { + // result for normal read dir + // final jobs = isLocal?localJobs:remoteJobs; // maybe we will use read local dir async later + tasks = remoteTasks; // bypass now + final completer = tasks.remove(fd.path); + completer?.complete(fd); + } + } catch (e) { + debugPrint("tryCompleteJob err :$e"); + } + } + + Future fetchDirectory( + String path, bool isLocal, bool showHidden) async { + try { + final msg = {"path": path, "show_hidden": showHidden.toString()}; + if (isLocal) { + final res = FFI.getByName("read_local_dir_sync", jsonEncode(msg)); + final fd = FileDirectory.fromJson(jsonDecode(res)); + return fd; + } else { + FFI.setByName("read_remote_dir", jsonEncode(msg)); + return registerReadTask(isLocal, path); + } + } catch (e) { + return Future.error(e); + } + } + + Future fetchDirectoryRecursive( + int id, String path, bool isLocal, bool showHidden) async { + // TODO test Recursive is show hidden default? + try { + final msg = { + "id": id.toString(), + "path": path, + "show_hidden": showHidden.toString(), + "is_remote": (!isLocal).toString() + }; + FFI.setByName("read_dir_recursive", jsonEncode(msg)); + return registerReadRecursiveTask(id); + } catch (e) { + return Future.error(e); + } + } +} + +class FileDirectory { + List entries = []; + int id = 0; + String path = ""; + + FileDirectory(); + + FileDirectory.fromJson(Map json) { + id = json['id']; + path = json['path']; + json['entries'].forEach((v) { + entries.add(new Entry.fromJson(v)); + }); + } + + // generate full path for every entry , init sort style if need. + format(bool isWindows, {SortBy? sort}) { + entries.forEach((entry) { + entry.path = PathUtil.join(path, entry.name, isWindows); + }); + if (sort != null) { + changeSortStyle(sort); + } + } + + changeSortStyle(SortBy sort) { + entries = _sortList(entries, sort); + } + + clear() { + entries = []; + id = 0; + path = ""; + } +} + +class Entry { + int entryType = 4; + int modifiedTime = 0; + String name = ""; + String path = ""; + int size = 0; + + Entry(); + + Entry.fromJson(Map json) { + entryType = json['entry_type']; + modifiedTime = json['modified_time']; + name = json['name']; + size = json['size']; + } + + bool get isFile => entryType > 3; + + bool get isDirectory => entryType <= 3; + + DateTime lastModified() { + return DateTime.fromMillisecondsSinceEpoch(modifiedTime * 1000); + } +} + +enum JobState { none, inProgress, done, error } + +class JobProgress { + JobState state = JobState.none; + var id = 0; + var fileNum = 0; + var speed = 0.0; + var finishedSize = 0; + + clear() { + state = JobState.none; + id = 0; + fileNum = 0; + speed = 0; + finishedSize = 0; + } +} + +class _PathStat { + final String path; + final DateTime dateTime; + + _PathStat(this.path, this.dateTime); +} + +class PathUtil { + static final windowsContext = Path.Context(style: Path.Style.windows); + static final posixContext = Path.Context(style: Path.Style.posix); + + static String join(String path1, String path2, bool isWindows) { + final pathUtil = isWindows ? windowsContext : posixContext; + return pathUtil.join(path1, path2); + } + + static List split(String path, bool isWindows) { + final pathUtil = isWindows ? windowsContext : posixContext; + return pathUtil.split(path); + } + + static String dirname(String path, bool isWindows) { + final pathUtil = isWindows ? windowsContext : posixContext; + return pathUtil.dirname(path); + } +} + +class DirectoryOption { + String home; + bool showHidden; + bool isWindows; + + DirectoryOption( + {this.home = "", this.showHidden = false, this.isWindows = false}); + + clear() { + home = ""; + showHidden = false; + isWindows = false; + } +} + +// code from file_manager pkg after edit +List _sortList(List list, SortBy sortType) { + if (sortType == SortBy.Name) { + // making list of only folders. + final dirs = list.where((element) => element.isDirectory).toList(); + // sorting folder list by name. + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); + + // making list of only flies. + final files = list.where((element) => element.isFile).toList(); + // sorting files list by name. + files.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); + + // first folders will go to list (if available) then files will go to list. + return [...dirs, ...files]; + } else if (sortType == SortBy.Modified) { + // making the list of Path & DateTime + List<_PathStat> _pathStat = []; + for (Entry e in list) { + _pathStat.add(_PathStat(e.name, e.lastModified())); + } + + // sort _pathStat according to date + _pathStat.sort((b, a) => a.dateTime.compareTo(b.dateTime)); + + // sorting [list] according to [_pathStat] + list.sort((a, b) => _pathStat + .indexWhere((element) => element.path == a.name) + .compareTo(_pathStat.indexWhere((element) => element.path == b.name))); + return list; + } else if (sortType == SortBy.Type) { + // making list of only folders. + final dirs = list.where((element) => element.isDirectory).toList(); + + // sorting folders by name. + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); + + // making the list of files + final files = list.where((element) => element.isFile).toList(); + + // sorting files list by extension. + files.sort((a, b) => a.name + .toLowerCase() + .split('.') + .last + .compareTo(b.name.toLowerCase().split('.').last)); + return [...dirs, ...files]; + } else if (sortType == SortBy.Size) { + // create list of path and size + Map _sizeMap = {}; + for (Entry e in list) { + _sizeMap[e.name] = e.size; + } + + // making list of only folders. + final dirs = list.where((element) => element.isDirectory).toList(); + // sorting folder list by name. + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); + + // making list of only flies. + final files = list.where((element) => element.isFile).toList(); + + // creating sorted list of [_sizeMapList] by size. + final List> _sizeMapList = _sizeMap.entries.toList(); + _sizeMapList.sort((b, a) => a.value.compareTo(b.value)); + + // sort [list] according to [_sizeMapList] + files.sort((a, b) => _sizeMapList + .indexWhere((element) => element.key == a.name) + .compareTo( + _sizeMapList.indexWhere((element) => element.key == b.name))); + return [...dirs, ...files]; + } + return []; +} diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart new file mode 100644 index 000000000..3a4c9b987 --- /dev/null +++ b/flutter/lib/models/model.dart @@ -0,0 +1,967 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_hbb/models/chat_model.dart'; +import 'package:flutter_hbb/models/file_model.dart'; +import 'package:flutter_hbb/models/server_model.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:math'; +import 'dart:convert'; +import 'dart:typed_data'; +import 'dart:ui' as ui; +import 'package:flutter/material.dart'; +import 'package:tuple/tuple.dart'; +import 'dart:async'; +import '../common.dart'; +import '../widgets/dialog.dart'; +import '../widgets/overlay.dart'; +import 'native_model.dart' if (dart.library.html) 'web_model.dart'; + +typedef HandleMsgBox = void Function(Map evt, String id); + +class FfiModel with ChangeNotifier { + PeerInfo _pi = PeerInfo(); + Display _display = Display(); + var _decoding = false; + bool _waitForImage = false; + var _inputBlocked = false; + final _permissions = Map(); + bool? _secure; + bool? _direct; + bool _touchMode = false; + Timer? _timer; + var _reconnects = 1; + + Map get permissions => _permissions; + + Display get display => _display; + + bool? get secure => _secure; + + bool? get direct => _direct; + + PeerInfo get pi => _pi; + + bool get inputBlocked => _inputBlocked; + + bool get touchMode => _touchMode; + + bool get isPeerAndroid => _pi.platform == "Android"; + + set inputBlocked(v) { + _inputBlocked = v; + } + + FfiModel() { + Translator.call = translate; + clear(); + } + + Future init() async { + await PlatformFFI.init(); + } + + void toggleTouchMode() { + if (!isPeerAndroid) { + _touchMode = !_touchMode; + notifyListeners(); + } + } + + void updatePermission(Map evt) { + evt.forEach((k, v) { + if (k == 'name') return; + _permissions[k] = v == 'true'; + }); + print('$_permissions'); + notifyListeners(); + } + + void updateUser() { + notifyListeners(); + } + + bool keyboard() => _permissions['keyboard'] != false; + + void clear() { + _pi = PeerInfo(); + _display = Display(); + _waitForImage = false; + _secure = null; + _direct = null; + _inputBlocked = false; + _timer?.cancel(); + _timer = null; + clearPermissions(); + } + + void setConnectionType(bool secure, bool direct) { + _secure = secure; + _direct = direct; + } + + Image? getConnectionImage() { + String? icon; + if (secure == true && direct == true) { + icon = 'secure'; + } else if (secure == false && direct == true) { + icon = 'insecure'; + } else if (secure == false && direct == false) { + icon = 'insecure_relay'; + } else if (secure == true && direct == false) { + icon = 'secure_relay'; + } + return icon == null + ? null + : Image.asset('assets/$icon.png', width: 48, height: 48); + } + + void clearPermissions() { + _inputBlocked = false; + _permissions.clear(); + } + + void update(String peerId) { + var pos; + for (;;) { + var evt = FFI.popEvent(); + if (evt == null) break; + var name = evt['name']; + if (name == 'msgbox') { + handleMsgBox(evt, peerId); + } else if (name == 'peer_info') { + handlePeerInfo(evt); + } else if (name == 'connection_ready') { + FFI.ffiModel.setConnectionType( + evt['secure'] == 'true', evt['direct'] == 'true'); + } else if (name == 'switch_display') { + handleSwitchDisplay(evt); + } else if (name == 'cursor_data') { + FFI.cursorModel.updateCursorData(evt); + } else if (name == 'cursor_id') { + FFI.cursorModel.updateCursorId(evt); + } else if (name == 'cursor_position') { + pos = evt; + } else if (name == 'clipboard') { + Clipboard.setData(ClipboardData(text: evt['content'])); + } else if (name == 'permission') { + FFI.ffiModel.updatePermission(evt); + } else if (name == 'chat_client_mode') { + FFI.chatModel.receive(ChatModel.clientModeID, evt['text'] ?? ""); + } else if (name == 'chat_server_mode') { + FFI.chatModel + .receive(int.parse(evt['id'] as String), evt['text'] ?? ""); + } else if (name == 'file_dir') { + FFI.fileModel.receiveFileDir(evt); + } else if (name == 'job_progress') { + FFI.fileModel.tryUpdateJobProgress(evt); + } else if (name == 'job_done') { + FFI.fileModel.jobDone(evt); + } else if (name == 'job_error') { + FFI.fileModel.jobError(evt); + } else if (name == 'try_start_without_auth') { + FFI.serverModel.loginRequest(evt); + } else if (name == 'on_client_authorized') { + FFI.serverModel.onClientAuthorized(evt); + } else if (name == 'on_client_remove') { + FFI.serverModel.onClientRemove(evt); + } + } + if (pos != null) FFI.cursorModel.updateCursorPosition(pos); + if (!_decoding) { + var rgba = PlatformFFI.getRgba(); + if (rgba != null) { + if (_waitForImage) { + _waitForImage = false; + SmartDialog.dismiss(); + } + _decoding = true; + final pid = FFI.id; + ui.decodeImageFromPixels(rgba, _display.width, _display.height, + isWeb ? ui.PixelFormat.rgba8888 : ui.PixelFormat.bgra8888, (image) { + PlatformFFI.clearRgbaFrame(); + _decoding = false; + if (FFI.id != pid) return; + try { + // my throw exception, because the listener maybe already dispose + FFI.imageModel.update(image); + } catch (e) { + print('update image: $e'); + } + }); + } + } + } + + void handleSwitchDisplay(Map evt) { + var old = _pi.currentDisplay; + _pi.currentDisplay = int.parse(evt['display']); + _display.x = double.parse(evt['x']); + _display.y = double.parse(evt['y']); + _display.width = int.parse(evt['width']); + _display.height = int.parse(evt['height']); + if (old != _pi.currentDisplay) + FFI.cursorModel.updateDisplayOrigin(_display.x, _display.y); + notifyListeners(); + } + + void handleMsgBox(Map evt, String id) { + var type = evt['type']; + var title = evt['title']; + var text = evt['text']; + if (type == 're-input-password') { + wrongPasswordDialog(id); + } else if (type == 'input-password') { + enterPasswordDialog(id); + } else { + var hasRetry = evt['hasRetry'] == 'true'; + print(evt); + showMsgBox(type, title, text, hasRetry); + } + } + + void showMsgBox(String type, String title, String text, bool hasRetry) { + msgBox(type, title, text); + if (hasRetry) { + _timer?.cancel(); + _timer = Timer(Duration(seconds: _reconnects), () { + FFI.reconnect(); + showLoading(translate('Connecting...')); + }); + _reconnects *= 2; + } else { + _reconnects = 1; + } + } + + void handlePeerInfo(Map evt) { + SmartDialog.dismiss(); + _pi.version = evt['version']; + _pi.username = evt['username']; + _pi.hostname = evt['hostname']; + _pi.platform = evt['platform']; + _pi.sasEnabled = evt['sas_enabled'] == "true"; + _pi.currentDisplay = int.parse(evt['current_display']); + + if (isPeerAndroid) { + _touchMode = true; + if (FFI.ffiModel.permissions['keyboard'] != false) { + showMobileActionsOverlay(); + } + } else { + _touchMode = FFI.getByName('peer_option', "touch-mode") != ''; + } + + if (evt['is_file_transfer'] == "true") { + FFI.fileModel.onReady(); + } else { + _pi.displays = []; + List displays = json.decode(evt['displays']); + for (int i = 0; i < displays.length; ++i) { + Map d0 = displays[i]; + var d = Display(); + d.x = d0['x'].toDouble(); + d.y = d0['y'].toDouble(); + d.width = d0['width']; + d.height = d0['height']; + _pi.displays.add(d); + } + if (_pi.currentDisplay < _pi.displays.length) { + _display = _pi.displays[_pi.currentDisplay]; + } + if (displays.length > 0) { + showLoading(translate('Connected, waiting for image...')); + _waitForImage = true; + _reconnects = 1; + } + } + notifyListeners(); + } +} + +class ImageModel with ChangeNotifier { + ui.Image? _image; + + ui.Image? get image => _image; + + void update(ui.Image? image) { + if (_image == null && image != null) { + if (isDesktop) { + FFI.canvasModel.updateViewStyle(); + } else { + final size = MediaQueryData.fromWindow(ui.window).size; + final xscale = size.width / image.width; + final yscale = size.height / image.height; + FFI.canvasModel.scale = max(xscale, yscale); + } + initializeCursorAndCanvas(); + Future.delayed(Duration(milliseconds: 1), () { + if (FFI.ffiModel.isPeerAndroid) { + FFI.setByName( + 'peer_option', '{"name": "view-style", "value": "shrink"}'); + FFI.canvasModel.updateViewStyle(); + } + }); + } + _image = image; + if (image != null) notifyListeners(); + } + + double get maxScale { + if (_image == null) return 1.0; + final size = MediaQueryData.fromWindow(ui.window).size; + final xscale = size.width / _image!.width; + final yscale = size.height / _image!.height; + return max(1.0, max(xscale, yscale)); + } + + double get minScale { + if (_image == null) return 1.0; + final size = MediaQueryData.fromWindow(ui.window).size; + final xscale = size.width / _image!.width; + final yscale = size.height / _image!.height; + return min(xscale, yscale); + } +} + +class CanvasModel with ChangeNotifier { + double _x = 0; + double _y = 0; + double _scale = 1.0; + + CanvasModel(); + + double get x => _x; + + double get y => _y; + + double get scale => _scale; + + void updateViewStyle() { + final s = FFI.getByName('peer_option', 'view-style'); + final size = MediaQueryData.fromWindow(ui.window).size; + final s1 = size.width / FFI.ffiModel.display.width; + final s2 = size.height / FFI.ffiModel.display.height; + if (s == 'shrink') { + final s = s1 < s2 ? s1 : s2; + if (s < 1) { + _scale = s; + } + } else if (s == 'stretch') { + final s = s1 > s2 ? s1 : s2; + if (s > 1) { + _scale = s; + } + } else { + _scale = 1; + } + _x = (size.width - FFI.ffiModel.display.width * _scale) / 2; + _y = (size.height - FFI.ffiModel.display.height * _scale) / 2; + notifyListeners(); + } + + void update(double x, double y, double scale) { + _x = x; + _y = y; + _scale = scale; + notifyListeners(); + } + + void moveDesktopMouse(double x, double y) { + final size = MediaQueryData.fromWindow(ui.window).size; + final dw = FFI.ffiModel.display.width * _scale; + final dh = FFI.ffiModel.display.height * _scale; + var dxOffset = 0; + var dyOffset = 0; + if (dw > size.width) { + dxOffset = (x - dw * (x / size.width) - _x).toInt(); + } + if (dh > size.height) { + dyOffset = (y - dh * (y / size.height) - _y).toInt(); + } + _x += dxOffset; + _y += dyOffset; + if (dxOffset != 0 || dyOffset != 0) { + notifyListeners(); + } + FFI.cursorModel.moveLocal(x, y); + } + + set scale(v) { + _scale = v; + notifyListeners(); + } + + void panX(double dx) { + _x += dx; + notifyListeners(); + } + + void resetOffset() { + if (isDesktop) { + updateViewStyle(); + } else { + _x = 0; + _y = 0; + } + notifyListeners(); + } + + void panY(double dy) { + _y += dy; + notifyListeners(); + } + + void updateScale(double v) { + if (FFI.imageModel.image == null) return; + final offset = FFI.cursorModel.offset; + var r = FFI.cursorModel.getVisibleRect(); + final px0 = (offset.dx - r.left) * _scale; + final py0 = (offset.dy - r.top) * _scale; + _scale *= v; + final maxs = FFI.imageModel.maxScale; + final mins = FFI.imageModel.minScale; + if (_scale > maxs) _scale = maxs; + if (_scale < mins) _scale = mins; + r = FFI.cursorModel.getVisibleRect(); + final px1 = (offset.dx - r.left) * _scale; + final py1 = (offset.dy - r.top) * _scale; + _x -= px1 - px0; + _y -= py1 - py0; + notifyListeners(); + } + + void clear([bool notify = false]) { + _x = 0; + _y = 0; + _scale = 1.0; + if (notify) notifyListeners(); + } +} + +class CursorModel with ChangeNotifier { + ui.Image? _image; + final _images = Map>(); + double _x = -10000; + double _y = -10000; + double _hotx = 0; + double _hoty = 0; + double _displayOriginX = 0; + double _displayOriginY = 0; + + ui.Image? get image => _image; + + double get x => _x - _displayOriginX; + + double get y => _y - _displayOriginY; + + Offset get offset => Offset(_x, _y); + + double get hotx => _hotx; + + double get hoty => _hoty; + + // remote physical display coordinate + Rect getVisibleRect() { + final size = MediaQueryData.fromWindow(ui.window).size; + final xoffset = FFI.canvasModel.x; + final yoffset = FFI.canvasModel.y; + final scale = FFI.canvasModel.scale; + final x0 = _displayOriginX - xoffset / scale; + final y0 = _displayOriginY - yoffset / scale; + return Rect.fromLTWH(x0, y0, size.width / scale, size.height / scale); + } + + double adjustForKeyboard() { + final m = MediaQueryData.fromWindow(ui.window); + var keyboardHeight = m.viewInsets.bottom; + final size = m.size; + if (keyboardHeight < 100) return 0; + final s = FFI.canvasModel.scale; + final thresh = (size.height - keyboardHeight) / 2; + var h = (_y - getVisibleRect().top) * s; // local physical display height + return h - thresh; + } + + void touch(double x, double y, MouseButtons button) { + moveLocal(x, y); + FFI.moveMouse(_x, _y); + FFI.tap(button); + } + + void move(double x, double y) { + moveLocal(x, y); + FFI.moveMouse(_x, _y); + } + + void moveLocal(double x, double y) { + final scale = FFI.canvasModel.scale; + final xoffset = FFI.canvasModel.x; + final yoffset = FFI.canvasModel.y; + _x = (x - xoffset) / scale + _displayOriginX; + _y = (y - yoffset) / scale + _displayOriginY; + notifyListeners(); + } + + void reset() { + _x = _displayOriginX; + _y = _displayOriginY; + FFI.moveMouse(_x, _y); + FFI.canvasModel.clear(true); + notifyListeners(); + } + + void updatePan(double dx, double dy, bool touchMode) { + if (FFI.imageModel.image == null) return; + if (touchMode) { + final scale = FFI.canvasModel.scale; + _x += dx / scale; + _y += dy / scale; + FFI.moveMouse(_x, _y); + notifyListeners(); + return; + } + final scale = FFI.canvasModel.scale; + dx /= scale; + dy /= scale; + final r = getVisibleRect(); + var cx = r.center.dx; + var cy = r.center.dy; + var tryMoveCanvasX = false; + if (dx > 0) { + final maxCanvasCanMove = _displayOriginX + + FFI.imageModel.image!.width - + r.right.roundToDouble(); + tryMoveCanvasX = _x + dx > cx && maxCanvasCanMove > 0; + if (tryMoveCanvasX) { + dx = min(dx, maxCanvasCanMove); + } else { + final maxCursorCanMove = r.right - _x; + dx = min(dx, maxCursorCanMove); + } + } else if (dx < 0) { + final maxCanvasCanMove = _displayOriginX - r.left.roundToDouble(); + tryMoveCanvasX = _x + dx < cx && maxCanvasCanMove < 0; + if (tryMoveCanvasX) { + dx = max(dx, maxCanvasCanMove); + } else { + final maxCursorCanMove = r.left - _x; + dx = max(dx, maxCursorCanMove); + } + } + var tryMoveCanvasY = false; + if (dy > 0) { + final mayCanvasCanMove = _displayOriginY + + FFI.imageModel.image!.height - + r.bottom.roundToDouble(); + tryMoveCanvasY = _y + dy > cy && mayCanvasCanMove > 0; + if (tryMoveCanvasY) { + dy = min(dy, mayCanvasCanMove); + } else { + final mayCursorCanMove = r.bottom - _y; + dy = min(dy, mayCursorCanMove); + } + } else if (dy < 0) { + final mayCanvasCanMove = _displayOriginY - r.top.roundToDouble(); + tryMoveCanvasY = _y + dy < cy && mayCanvasCanMove < 0; + if (tryMoveCanvasY) { + dy = max(dy, mayCanvasCanMove); + } else { + final mayCursorCanMove = r.top - _y; + dy = max(dy, mayCursorCanMove); + } + } + + if (dx == 0 && dy == 0) return; + _x += dx; + _y += dy; + if (tryMoveCanvasX && dx != 0) { + FFI.canvasModel.panX(-dx); + } + if (tryMoveCanvasY && dy != 0) { + FFI.canvasModel.panY(-dy); + } + + FFI.moveMouse(_x, _y); + notifyListeners(); + } + + void updateCursorData(Map evt) { + var id = int.parse(evt['id']); + _hotx = double.parse(evt['hotx']); + _hoty = double.parse(evt['hoty']); + var width = int.parse(evt['width']); + var height = int.parse(evt['height']); + List colors = json.decode(evt['colors']); + final rgba = Uint8List.fromList(colors.map((s) => s as int).toList()); + var pid = FFI.id; + ui.decodeImageFromPixels(rgba, width, height, ui.PixelFormat.rgba8888, + (image) { + if (FFI.id != pid) return; + _image = image; + _images[id] = Tuple3(image, _hotx, _hoty); + try { + // my throw exception, because the listener maybe already dispose + notifyListeners(); + } catch (e) { + print('notify cursor: $e'); + } + }); + } + + void updateCursorId(Map evt) { + final tmp = _images[int.parse(evt['id'])]; + if (tmp != null) { + _image = tmp.item1; + _hotx = tmp.item2; + _hoty = tmp.item3; + notifyListeners(); + } + } + + void updateCursorPosition(Map evt) { + _x = double.parse(evt['x']); + _y = double.parse(evt['y']); + notifyListeners(); + } + + void updateDisplayOrigin(double x, double y) { + _displayOriginX = x; + _displayOriginY = y; + _x = x + 1; + _y = y + 1; + FFI.moveMouse(x, y); + FFI.canvasModel.resetOffset(); + notifyListeners(); + } + + void updateDisplayOriginWithCursor( + double x, double y, double xCursor, double yCursor) { + _displayOriginX = x; + _displayOriginY = y; + _x = xCursor; + _y = yCursor; + FFI.moveMouse(x, y); + notifyListeners(); + } + + void clear() { + _x = -10000; + _x = -10000; + _image = null; + _images.clear(); + } +} + +enum MouseButtons { left, right, wheel } + +extension ToString on MouseButtons { + String get value { + switch (this) { + case MouseButtons.left: + return "left"; + case MouseButtons.right: + return "right"; + case MouseButtons.wheel: + return "wheel"; + } + } +} + +class FFI { + static var id = ""; + static var shift = false; + static var ctrl = false; + static var alt = false; + static var command = false; + static var version = ""; + static final imageModel = ImageModel(); + static final ffiModel = FfiModel(); + static final cursorModel = CursorModel(); + static final canvasModel = CanvasModel(); + static final serverModel = ServerModel(); + static final chatModel = ChatModel(); + static final fileModel = FileModel(); + + static String getId() { + return getByName('remote_id'); + } + + static void tap(MouseButtons button) { + sendMouse('down', button); + sendMouse('up', button); + } + + static void scroll(double y) { + var y2 = y.round(); + if (y2 == 0) return; + setByName('send_mouse', + json.encode(modify({'type': 'wheel', 'y': y2.toString()}))); + } + + static void reconnect() { + setByName('reconnect'); + FFI.ffiModel.clearPermissions(); + } + + static void resetModifiers() { + shift = ctrl = alt = command = false; + } + + static Map modify(Map evt) { + if (ctrl) evt['ctrl'] = 'true'; + if (shift) evt['shift'] = 'true'; + if (alt) evt['alt'] = 'true'; + if (command) evt['command'] = 'true'; + return evt; + } + + static void sendMouse(String type, MouseButtons button) { + if (!ffiModel.keyboard()) return; + setByName('send_mouse', + json.encode(modify({'type': type, 'buttons': button.value}))); + } + + static void inputKey(String name, {bool? down, bool? press}) { + if (!ffiModel.keyboard()) return; + setByName( + 'input_key', + json.encode(modify({ + 'name': name, + 'down': (down ?? false).toString(), + 'press': (press ?? true).toString() + }))); + } + + static void moveMouse(double x, double y) { + if (!ffiModel.keyboard()) return; + var x2 = x.toInt(); + var y2 = y.toInt(); + setByName('send_mouse', json.encode(modify({'x': '$x2', 'y': '$y2'}))); + } + + static List peers() { + try { + var str = getByName('peers'); + if (str == "") return []; + List peers = json.decode(str); + return peers + .map((s) => s as List) + .map((s) => + Peer.fromJson(s[0] as String, s[1] as Map)) + .toList(); + } catch (e) { + print('peers(): $e'); + } + return []; + } + + static void connect(String id, {bool isFileTransfer = false}) { + if (isFileTransfer) { + setByName('connect_file_transfer', id); + } else { + setByName('connect', id); + } + FFI.id = id; + } + + static Map? popEvent() { + var s = getByName('event'); + if (s == '') return null; + try { + Map event = json.decode(s); + return event; + } catch (e) { + print('popEvent(): $e'); + } + return null; + } + + static void login(String password, bool remember) { + setByName( + 'login', + json.encode({ + 'password': password, + 'remember': remember ? 'true' : 'false', + })); + } + + static void close() { + chatModel.close(); + if (FFI.imageModel.image != null && !isDesktop) { + savePreference(id, cursorModel.x, cursorModel.y, canvasModel.x, + canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay); + } + id = ""; + setByName('close', ''); + imageModel.update(null); + cursorModel.clear(); + ffiModel.clear(); + canvasModel.clear(); + resetModifiers(); + } + + static String getByName(String name, [String arg = '']) { + return PlatformFFI.getByName(name, arg); + } + + static void setByName(String name, [String value = '']) { + PlatformFFI.setByName(name, value); + } + + static handleMouse(Map evt) { + var type = ''; + var isMove = false; + switch (evt['type']) { + case 'mousedown': + type = 'down'; + break; + case 'mouseup': + type = 'up'; + break; + case 'mousemove': + isMove = true; + break; + default: + return; + } + evt['type'] = type; + var x = evt['x']; + var y = evt['y']; + if (isMove) { + FFI.canvasModel.moveDesktopMouse(x, y); + } + final d = FFI.ffiModel.display; + x -= FFI.canvasModel.x; + y -= FFI.canvasModel.y; + if (!isMove && (x < 0 || x > d.width || y < 0 || y > d.height)) { + return; + } + x /= FFI.canvasModel.scale; + y /= FFI.canvasModel.scale; + x += d.x; + y += d.y; + if (type != '') { + x = 0; + y = 0; + } + evt['x'] = '${x.round()}'; + evt['y'] = '${y.round()}'; + var buttons = ''; + switch (evt['buttons']) { + case 1: + buttons = 'left'; + break; + case 2: + buttons = 'right'; + break; + case 4: + buttons = 'wheel'; + break; + } + evt['buttons'] = buttons; + setByName('send_mouse', json.encode(evt)); + } + + static listenToMouse(bool yesOrNo) { + if (yesOrNo) { + PlatformFFI.startDesktopWebListener(); + } else { + PlatformFFI.stopDesktopWebListener(); + } + } + + static void setMethodCallHandler(FMethod callback) { + PlatformFFI.setMethodCallHandler(callback); + } + + static Future invokeMethod(String method, [dynamic arguments]) async { + return await PlatformFFI.invokeMethod(method, arguments); + } +} + +class Peer { + final String id; + final String username; + final String hostname; + final String platform; + + Peer.fromJson(String id, Map json) + : id = id, + username = json['username'], + hostname = json['hostname'], + platform = json['platform']; +} + +class Display { + double x = 0; + double y = 0; + int width = 0; + int height = 0; +} + +class PeerInfo { + String version = ""; + String username = ""; + String hostname = ""; + String platform = ""; + bool sasEnabled = false; + int currentDisplay = 0; + List displays = []; +} + +void savePreference(String id, double xCursor, double yCursor, double xCanvas, + double yCanvas, double scale, int currentDisplay) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final p = Map(); + p['xCursor'] = xCursor; + p['yCursor'] = yCursor; + p['xCanvas'] = xCanvas; + p['yCanvas'] = yCanvas; + p['scale'] = scale; + p['currentDisplay'] = currentDisplay; + prefs.setString('peer' + id, json.encode(p)); +} + +Future?> getPreference(String id) async { + if (!isDesktop) return null; + SharedPreferences prefs = await SharedPreferences.getInstance(); + var p = prefs.getString('peer' + id); + if (p == null) return null; + Map m = json.decode(p); + return m; +} + +void removePreference(String id) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.remove('peer' + id); +} + +void initializeCursorAndCanvas() async { + var p = await getPreference(FFI.id); + int currentDisplay = 0; + if (p != null) { + currentDisplay = p['currentDisplay']; + } + if (p == null || currentDisplay != FFI.ffiModel.pi.currentDisplay) { + FFI.cursorModel + .updateDisplayOrigin(FFI.ffiModel.display.x, FFI.ffiModel.display.y); + return; + } + double xCursor = p['xCursor']; + double yCursor = p['yCursor']; + double xCanvas = p['xCanvas']; + double yCanvas = p['yCanvas']; + double scale = p['scale']; + FFI.cursorModel.updateDisplayOriginWithCursor( + FFI.ffiModel.display.x, FFI.ffiModel.display.y, xCursor, yCursor); + FFI.canvasModel.update(xCanvas, yCanvas, scale); +} + +String translate(String name) { + if (name.startsWith('Failed to') && name.contains(': ')) { + return name.split(': ').map((x) => translate(x)).join(': '); + } + var a = 'translate'; + var b = '{"locale": "$localeName", "text": "$name"}'; + return FFI.getByName(a, b); +} diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart new file mode 100644 index 000000000..9572a7887 --- /dev/null +++ b/flutter/lib/models/native_model.dart @@ -0,0 +1,136 @@ +import 'dart:io'; +import 'dart:typed_data'; +import 'dart:ffi'; +import 'package:ffi/ffi.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:device_info/device_info.dart'; +import 'package:package_info/package_info.dart'; +import 'package:external_path/external_path.dart'; +import 'package:flutter/services.dart'; +import '../common.dart'; + +class RgbaFrame extends Struct { + @Uint32() + external int len; + external Pointer data; +} + +typedef F2 = Pointer Function(Pointer, Pointer); +typedef F3 = void Function(Pointer, Pointer); +typedef F4 = void Function(Pointer); +typedef F5 = Pointer Function(); + +class PlatformFFI { + static Pointer? _lastRgbaFrame; + static String _dir = ''; + static String _homeDir = ''; + static F2? _getByName; + static F3? _setByName; + static F4? _freeRgba; + static F5? _getRgba; + + static void clearRgbaFrame() { + if (_lastRgbaFrame != null && + _lastRgbaFrame != nullptr && + _freeRgba != null) _freeRgba!(_lastRgbaFrame!); + } + + static Uint8List? getRgba() { + if (_getRgba == null) return null; + _lastRgbaFrame = _getRgba!(); + if (_lastRgbaFrame == null || _lastRgbaFrame == nullptr) return null; + final ref = _lastRgbaFrame!.ref; + return Uint8List.sublistView(ref.data.asTypedList(ref.len)); + } + + static Future getVersion() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + return packageInfo.version; + } + + static String getByName(String name, [String arg = '']) { + if (_getByName == null) return ''; + var a = name.toNativeUtf8(); + var b = arg.toNativeUtf8(); + var p = _getByName!(a, b); + assert(p != nullptr); + var res = p.toDartString(); + calloc.free(p); + calloc.free(a); + calloc.free(b); + return res; + } + + static void setByName(String name, [String value = '']) { + if (_setByName == null) return; + var a = name.toNativeUtf8(); + var b = value.toNativeUtf8(); + _setByName!(a, b); + calloc.free(a); + calloc.free(b); + } + + static Future init() async { + isIOS = Platform.isIOS; + isAndroid = Platform.isAndroid; + final dylib = Platform.isAndroid + ? DynamicLibrary.open('librustdesk.so') + : DynamicLibrary.process(); + print('initializing FFI'); + try { + _getByName = dylib.lookupFunction('get_by_name'); + _setByName = + dylib.lookupFunction, Pointer), F3>( + 'set_by_name'); + _freeRgba = dylib + .lookupFunction), F4>('free_rgba'); + _getRgba = dylib.lookupFunction('get_rgba'); + _dir = (await getApplicationDocumentsDirectory()).path; + try { + _homeDir = (await ExternalPath.getExternalStorageDirectories())[0]; + } catch (e) { + print(e); + } + String id = 'NA'; + String name = 'Flutter'; + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + name = '${androidInfo.brand}-${androidInfo.model}'; + id = androidInfo.id.hashCode.toString(); + androidVersion = androidInfo.version.sdkInt; + } else { + IosDeviceInfo iosInfo = await deviceInfo.iosInfo; + name = iosInfo.utsname.machine; + id = iosInfo.identifierForVendor.hashCode.toString(); + } + print("info1-id:$id,info2-name:$name,dir:$_dir,homeDir:$_homeDir"); + setByName('info1', id); + setByName('info2', name); + setByName('home_dir', _homeDir); + setByName('init', _dir); + } catch (e) { + print(e); + } + version = await getVersion(); + } + + static void startDesktopWebListener() {} + + static void stopDesktopWebListener() {} + + static void setMethodCallHandler(FMethod callback) { + toAndroidChannel.setMethodCallHandler((call) async { + callback(call.method, call.arguments); + return null; + }); + } + + static invokeMethod(String method, [dynamic arguments]) async { + if (!isAndroid) return Future(() => false); + return await toAndroidChannel.invokeMethod(method, arguments); + } +} + +final localeName = Platform.localeName; +final toAndroidChannel = MethodChannel("mChannel"); diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart new file mode 100644 index 000000000..91edba104 --- /dev/null +++ b/flutter/lib/models/server_model.dart @@ -0,0 +1,510 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:dash_chat/dash_chat.dart'; +import 'package:flutter/material.dart'; +import 'package:wakelock/wakelock.dart'; +import '../common.dart'; +import '../pages/server_page.dart'; +import 'model.dart'; + +const loginDialogTag = "LOGIN"; +final _emptyIdShow = translate("Generating ..."); + +class ServerModel with ChangeNotifier { + Timer? _interval; + bool _isStart = false; // Android MainService status + bool _mediaOk = false; + bool _inputOk = false; + bool _audioOk = false; + bool _fileOk = false; + int _connectStatus = 0; // Rendezvous Server status + + final _serverId = TextEditingController(text: _emptyIdShow); + final _serverPasswd = TextEditingController(text: ""); + + Map _clients = {}; + + bool get isStart => _isStart; + + bool get mediaOk => _mediaOk; + + bool get inputOk => _inputOk; + + bool get audioOk => _audioOk; + + bool get fileOk => _fileOk; + + int get connectStatus => _connectStatus; + + TextEditingController get serverId => _serverId; + + TextEditingController get serverPasswd => _serverPasswd; + + Map get clients => _clients; + + final controller = ScrollController(); + + ServerModel() { + () async { + /** + * 1. check android permission + * 2. check config + * audio true by default (if permission on) (false default < Android 10) + * file true by default (if permission on) + * input false by default (it need turning on manually everytime) + */ + await Future.delayed(Duration(seconds: 1)); + + // audio + if (androidVersion < 30 || !await PermissionManager.check("audio")) { + _audioOk = false; + FFI.setByName( + 'option', + jsonEncode(Map() + ..["name"] = "enable-audio" + ..["value"] = "N")); + } else { + final audioOption = FFI.getByName('option', 'enable-audio'); + _audioOk = audioOption.isEmpty; + } + + // file + if (!await PermissionManager.check("file")) { + _fileOk = false; + FFI.setByName( + 'option', + jsonEncode(Map() + ..["name"] = "enable-file-transfer" + ..["value"] = "N")); + } else { + final fileOption = FFI.getByName('option', 'enable-file-transfer'); + _fileOk = fileOption.isEmpty; + } + + // input (mouse control) + Map res = Map() + ..["name"] = "enable-keyboard" + ..["value"] = 'N'; + FFI.setByName('option', jsonEncode(res)); // input false by default + notifyListeners(); + }(); + + Timer.periodic(Duration(seconds: 1), (timer) { + var status = int.tryParse(FFI.getByName('connect_statue')) ?? 0; + if (status > 0) { + status = 1; + } + if (status != _connectStatus) { + _connectStatus = status; + notifyListeners(); + } + final res = + FFI.getByName('check_clients_length', _clients.length.toString()); + if (res.isNotEmpty) { + debugPrint("clients not match!"); + updateClientState(res); + } + }); + } + + toggleAudio() async { + if (!_audioOk && !await PermissionManager.check("audio")) { + final res = await PermissionManager.request("audio"); + if (!res) { + // TODO handle fail + return; + } + } + + _audioOk = !_audioOk; + Map res = Map() + ..["name"] = "enable-audio" + ..["value"] = _audioOk ? '' : 'N'; + FFI.setByName('option', jsonEncode(res)); + notifyListeners(); + } + + toggleFile() async { + if (!_fileOk && !await PermissionManager.check("file")) { + final res = await PermissionManager.request("file"); + if (!res) { + // TODO handle fail + return; + } + } + + _fileOk = !_fileOk; + Map res = Map() + ..["name"] = "enable-file-transfer" + ..["value"] = _fileOk ? '' : 'N'; + FFI.setByName('option', jsonEncode(res)); + notifyListeners(); + } + + toggleInput() { + if (_inputOk) { + FFI.invokeMethod("stop_input"); + } else { + showInputWarnAlert(); + } + } + + toggleService() async { + if (_isStart) { + final res = + await DialogManager.show((setState, close) => CustomAlertDialog( + title: Row(children: [ + Icon(Icons.warning_amber_sharp, + color: Colors.redAccent, size: 28), + SizedBox(width: 10), + Text(translate("Warning")), + ]), + content: Text(translate("android_stop_service_tip")), + actions: [ + TextButton( + onPressed: () => close(), + child: Text(translate("Cancel"))), + ElevatedButton( + onPressed: () => close(true), + child: Text(translate("OK"))), + ], + )); + if (res == true) { + stopService(); + } + } else { + final res = + await DialogManager.show((setState, close) => CustomAlertDialog( + title: Row(children: [ + Icon(Icons.warning_amber_sharp, + color: Colors.redAccent, size: 28), + SizedBox(width: 10), + Text(translate("Warning")), + ]), + content: Text(translate("android_service_will_start_tip")), + actions: [ + TextButton( + onPressed: () => close(), + child: Text(translate("Cancel"))), + ElevatedButton( + onPressed: () => close(true), + child: Text(translate("OK"))), + ], + )); + if (res == true) { + startService(); + } + } + } + + Future startService() async { + _isStart = true; + notifyListeners(); + FFI.setByName("ensure_init_event_queue"); + _interval?.cancel(); + _interval = Timer.periodic(Duration(milliseconds: 30), (timer) { + FFI.ffiModel.update(""); + }); + await FFI.invokeMethod("init_service"); + FFI.setByName("start_service"); + getIDPasswd(); + updateClientState(); + Wakelock.enable(); + } + + Future stopService() async { + _isStart = false; + _interval?.cancel(); + _interval = null; + FFI.serverModel.closeAll(); + await FFI.invokeMethod("stop_service"); + FFI.setByName("stop_service"); + notifyListeners(); + Wakelock.disable(); + } + + Future initInput() async { + await FFI.invokeMethod("init_input"); + } + + Future updatePassword(String pw) async { + final oldPasswd = _serverPasswd.text; + FFI.setByName("update_password", pw); + await Future.delayed(Duration(milliseconds: 500)); + await getIDPasswd(force: true); + + // check result + if (pw == "") { + if (_serverPasswd.text.isNotEmpty && _serverPasswd.text != oldPasswd) { + return true; + } else { + return false; + } + } else { + if (_serverPasswd.text == pw) { + return true; + } else { + return false; + } + } + } + + getIDPasswd({bool force = false}) async { + if (!force && _serverId.text != _emptyIdShow && _serverPasswd.text != "") { + return; + } + var count = 0; + const maxCount = 10; + while (count < maxCount) { + await Future.delayed(Duration(seconds: 1)); + final id = FFI.getByName("server_id"); + final passwd = FFI.getByName("server_password"); + if (id.isEmpty) { + continue; + } else { + _serverId.text = id; + } + + if (passwd.isEmpty) { + continue; + } else { + _serverPasswd.text = passwd; + } + + debugPrint( + "fetch id & passwd again at $count:id:${_serverId.text},passwd:${_serverPasswd.text}"); + count++; + if (_serverId.text != _emptyIdShow && _serverPasswd.text.isNotEmpty) { + break; + } + } + notifyListeners(); + } + + changeStatue(String name, bool value) { + debugPrint("changeStatue value $value"); + switch (name) { + case "media": + _mediaOk = value; + if (value && !_isStart) { + startService(); + } + break; + case "input": + if (_inputOk != value) { + Map res = Map() + ..["name"] = "enable-keyboard" + ..["value"] = value ? '' : 'N'; + FFI.setByName('option', jsonEncode(res)); + } + _inputOk = value; + break; + default: + return; + } + notifyListeners(); + } + + updateClientState([String? json]) { + var res = json ?? FFI.getByName("clients_state"); + try { + final List clientsJson = jsonDecode(res); + for (var clientJson in clientsJson) { + final client = Client.fromJson(clientJson); + _clients[client.id] = client; + } + notifyListeners(); + } catch (e) { + debugPrint("Failed to updateClientState:$e"); + } + } + + void loginRequest(Map evt) { + try { + final client = Client.fromJson(jsonDecode(evt["client"])); + if (_clients.containsKey(client.id)) { + return; + } + _clients[client.id] = client; + scrollToBottom(); + notifyListeners(); + showLoginDialog(client); + } catch (e) { + debugPrint("Failed to call loginRequest,error:$e"); + } + } + + void showLoginDialog(Client client) { + DialogManager.show( + (setState, close) => CustomAlertDialog( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(translate(client.isFileTransfer + ? "File Connection" + : "Screen Connection")), + IconButton( + onPressed: () { + close(); + }, + icon: Icon(Icons.close)) + ]), + content: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(translate("Do you accept?")), + clientInfo(client), + Text( + translate("android_new_connection_tip"), + style: TextStyle(color: Colors.black54), + ), + ], + ), + actions: [ + TextButton( + child: Text(translate("Dismiss")), + onPressed: () { + sendLoginResponse(client, false); + close(); + }), + ElevatedButton( + child: Text(translate("Accept")), + onPressed: () { + sendLoginResponse(client, true); + close(); + }), + ], + ), + tag: getLoginDialogTag(client.id)); + } + + scrollToBottom() { + Future.delayed(Duration(milliseconds: 200), () { + controller.animateTo(controller.position.maxScrollExtent, + duration: Duration(milliseconds: 200), + curve: Curves.fastLinearToSlowEaseIn); + }); + } + + void sendLoginResponse(Client client, bool res) { + final Map response = Map(); + response["id"] = client.id; + response["res"] = res; + if (res) { + FFI.setByName("login_res", jsonEncode(response)); + if (!client.isFileTransfer) { + FFI.invokeMethod("start_capture"); + } + FFI.invokeMethod("cancel_notification", client.id); + _clients[client.id]?.authorized = true; + notifyListeners(); + } else { + FFI.setByName("login_res", jsonEncode(response)); + FFI.invokeMethod("cancel_notification", client.id); + _clients.remove(client.id); + } + } + + void onClientAuthorized(Map evt) { + try { + final client = Client.fromJson(jsonDecode(evt['client'])); + DialogManager.dismissByTag(getLoginDialogTag(client.id)); + _clients[client.id] = client; + scrollToBottom(); + notifyListeners(); + } catch (e) {} + } + + void onClientRemove(Map evt) { + try { + final id = int.parse(evt['id'] as String); + if (_clients.containsKey(id)) { + _clients.remove(id); + DialogManager.dismissByTag(getLoginDialogTag(id)); + FFI.invokeMethod("cancel_notification", id); + } + notifyListeners(); + } catch (e) { + debugPrint("onClientRemove failed,error:$e"); + } + } + + closeAll() { + _clients.forEach((id, client) { + FFI.setByName("close_conn", id.toString()); + }); + _clients.clear(); + } +} + +class Client { + int id = 0; // client connections inner count id + bool authorized = false; + bool isFileTransfer = false; + String name = ""; + String peerId = ""; // peer user's id,show at app + bool keyboard = false; + bool clipboard = false; + bool audio = false; + late ChatUser chatUser; + + Client(this.authorized, this.isFileTransfer, this.name, this.peerId, + this.keyboard, this.clipboard, this.audio); + + Client.fromJson(Map json) { + id = json['id']; + authorized = json['authorized']; + isFileTransfer = json['is_file_transfer']; + name = json['name']; + peerId = json['peer_id']; + keyboard = json['keyboard']; + clipboard = json['clipboard']; + audio = json['audio']; + chatUser = ChatUser( + uid: peerId, + name: name, + ); + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['is_start'] = this.authorized; + data['is_file_transfer'] = this.isFileTransfer; + data['name'] = this.name; + data['peer_id'] = this.peerId; + data['keyboard'] = this.keyboard; + data['clipboard'] = this.clipboard; + data['audio'] = this.audio; + return data; + } +} + +String getLoginDialogTag(int id) { + return loginDialogTag + id.toString(); +} + +showInputWarnAlert() { + DialogManager.show((setState, close) => CustomAlertDialog( + title: Text(translate("How to get Android input permission?")), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(translate("android_input_permission_tip1")), + SizedBox(height: 10), + Text(translate("android_input_permission_tip2")), + ], + ), + actions: [ + TextButton(child: Text(translate("Cancel")), onPressed: close), + ElevatedButton( + child: Text(translate("Open System Setting")), + onPressed: () { + FFI.serverModel.initInput(); + close(); + }), + ], + )); +} diff --git a/flutter/lib/models/web_model.dart b/flutter/lib/models/web_model.dart new file mode 100644 index 000000000..4c64ab96e --- /dev/null +++ b/flutter/lib/models/web_model.dart @@ -0,0 +1,60 @@ +import 'dart:typed_data'; +import 'dart:js' as js; + +import '../common.dart'; +import 'dart:html'; +import 'dart:async'; + +final List> mouseListeners = []; +final List> keyListeners = []; +int lastMouseDownButtons = 0; +bool mouseIn = false; + +class PlatformFFI { + static void clearRgbaFrame() {} + + static Uint8List? getRgba() { + return js.context.callMethod('getRgba'); + } + + static String getByName(String name, [String arg = '']) { + return js.context.callMethod('getByName', [name, arg]); + } + + static void setByName(String name, [String value = '']) { + js.context.callMethod('setByName', [name, value]); + } + + static Future init() async { + isWeb = true; + isDesktop = !js.context.callMethod('isMobile'); + js.context.callMethod('init'); + version = getByName('version'); + } + + static void startDesktopWebListener() { + mouseIn = true; + mouseListeners.add( + window.document.onContextMenu.listen((evt) => evt.preventDefault())); + } + + static void stopDesktopWebListener() { + mouseIn = true; + mouseListeners.forEach((l) { + l.cancel(); + }); + mouseListeners.clear(); + keyListeners.forEach((l) { + l.cancel(); + }); + keyListeners.clear(); + } + + static void setMethodCallHandler(FMethod callback) {} + + static Future invokeMethod(String method, [dynamic arguments]) async { + return true; + } +} + +final localeName = window.navigator.language; diff --git a/flutter/lib/pages/chat_page.dart b/flutter/lib/pages/chat_page.dart new file mode 100644 index 000000000..62c520cce --- /dev/null +++ b/flutter/lib/pages/chat_page.dart @@ -0,0 +1,81 @@ +import 'package:dash_chat/dash_chat.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/models/chat_model.dart'; +import 'package:provider/provider.dart'; +import '../models/model.dart'; +import 'home_page.dart'; + +ChatPage chatPage = ChatPage(); + +class ChatPage extends StatelessWidget implements PageShape { + @override + final title = translate("Chat"); + + @override + final icon = Icon(Icons.chat); + + @override + final appBarActions = [ + PopupMenuButton( + icon: Icon(Icons.group), + itemBuilder: (context) { + final chatModel = FFI.chatModel; + final serverModel = FFI.serverModel; + return chatModel.messages.entries.map((entry) { + final id = entry.key; + final user = serverModel.clients[id]?.chatUser ?? chatModel.me; + return PopupMenuItem( + child: Text("${user.name} ${user.uid}"), + value: id, + ); + }).toList(); + }, + onSelected: (id) { + FFI.chatModel.changeCurrentID(id); + }) + ]; + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider.value( + value: FFI.chatModel, + child: Container( + color: MyTheme.grayBg, + child: Consumer(builder: (context, chatModel, child) { + final currentUser = chatModel.currentUser; + return Stack( + children: [ + DashChat( + inputContainerStyle: BoxDecoration(color: Colors.white70), + sendOnEnter: false, + // if true,reload keyboard everytime,need fix + onSend: (chatMsg) { + chatModel.send(chatMsg); + }, + user: chatModel.me, + messages: chatModel.messages[chatModel.currentID] ?? [], + // default scrollToBottom has bug https://github.com/fayeed/dash_chat/issues/53 + scrollToBottom: false, + scrollController: chatModel.scroller, + ), + chatModel.currentID == ChatModel.clientModeID + ? SizedBox.shrink() + : Padding( + padding: EdgeInsets.all(12), + child: Row( + children: [ + Icon(Icons.account_circle, + color: MyTheme.accent80), + SizedBox(width: 5), + Text( + "${currentUser.name ?? ""} ${currentUser.uid ?? ""}", + style: TextStyle(color: MyTheme.accent50), + ), + ], + )), + ], + ); + }))); + } +} diff --git a/flutter/lib/pages/connection_page.dart b/flutter/lib/pages/connection_page.dart new file mode 100644 index 000000000..1fe4dc6b0 --- /dev/null +++ b/flutter/lib/pages/connection_page.dart @@ -0,0 +1,342 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/pages/file_manager_page.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'dart:async'; +import '../common.dart'; +import '../models/model.dart'; +import 'home_page.dart'; +import 'remote_page.dart'; +import 'settings_page.dart'; +import 'scan_page.dart'; + +class ConnectionPage extends StatefulWidget implements PageShape { + ConnectionPage({Key? key}) : super(key: key); + + @override + final icon = Icon(Icons.connected_tv); + + @override + final title = translate("Connection"); + + @override + final appBarActions = !isAndroid ? [WebMenu()] : []; + + @override + _ConnectionPageState createState() => _ConnectionPageState(); +} + +class _ConnectionPageState extends State { + final _idController = TextEditingController(); + var _updateUrl = ''; + var _menuPos; + + @override + void initState() { + super.initState(); + if (isAndroid) { + Timer(Duration(seconds: 5), () { + _updateUrl = FFI.getByName('software_update_url'); + if (_updateUrl.isNotEmpty) setState(() {}); + }); + } + } + + @override + Widget build(BuildContext context) { + Provider.of(context); + if (_idController.text.isEmpty) _idController.text = FFI.getId(); + return SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getUpdateUI(), + getSearchBarUI(), + Container(height: 12), + getPeers(), + ]), + ); + } + + void onConnect() { + var id = _idController.text.trim(); + connect(id); + } + + void connect(String id, {bool isFileTransfer = false}) async { + if (id == '') return; + id = id.replaceAll(' ', ''); + if (isFileTransfer) { + if (!await PermissionManager.check("file")) { + if (!await PermissionManager.request("file")) { + return; + } + } + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => FileManagerPage(id: id), + ), + ); + } else { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => RemotePage(id: id), + ), + ); + } + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + } + + Widget getUpdateUI() { + return _updateUrl.isEmpty + ? SizedBox(height: 0) + : InkWell( + onTap: () async { + final url = _updateUrl + '.apk'; + if (await canLaunch(url)) { + await launch(url); + } + }, + child: Container( + alignment: AlignmentDirectional.center, + width: double.infinity, + color: Colors.pinkAccent, + padding: EdgeInsets.symmetric(vertical: 12), + child: Text(translate('Download new version'), + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)))); + } + + Widget getSearchBarUI() { + var w = Padding( + padding: const EdgeInsets.fromLTRB(16.0, 8.0, 16.0, 0.0), + child: Container( + height: 84, + child: Padding( + padding: const EdgeInsets.only(top: 8, bottom: 8), + child: Ink( + decoration: BoxDecoration( + color: MyTheme.white, + borderRadius: const BorderRadius.all(Radius.circular(13)), + ), + child: Row( + children: [ + Expanded( + child: Container( + padding: const EdgeInsets.only(left: 16, right: 16), + child: TextField( + autocorrect: false, + enableSuggestions: false, + keyboardType: TextInputType.visiblePassword, + // keyboardType: TextInputType.number, + style: TextStyle( + fontFamily: 'WorkSans', + fontWeight: FontWeight.bold, + fontSize: 30, + color: MyTheme.idColor, + ), + decoration: InputDecoration( + labelText: translate('Remote ID'), + // hintText: 'Enter your remote ID', + border: InputBorder.none, + helperStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: MyTheme.darkGray, + ), + labelStyle: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + letterSpacing: 0.2, + color: MyTheme.darkGray, + ), + ), + controller: _idController, + ), + ), + ), + SizedBox( + width: 60, + height: 60, + child: IconButton( + icon: Icon(Icons.arrow_forward, + color: MyTheme.darkGray, size: 45), + onPressed: onConnect, + ), + ), + ], + ), + ), + ), + ), + ); + return Center( + child: Container(constraints: BoxConstraints(maxWidth: 600), child: w)); + } + + @override + void dispose() { + _idController.dispose(); + super.dispose(); + } + + Widget getPlatformImage(String platform) { + platform = platform.toLowerCase(); + if (platform == 'mac os') + platform = 'mac'; + else if (platform != 'linux' && platform != 'android') platform = 'win'; + return Image.asset('assets/$platform.png', width: 24, height: 24); + } + + Widget getPeers() { + final size = MediaQuery.of(context).size; + final space = 8.0; + var width = size.width - 2 * space; + final minWidth = 320.0; + if (size.width > minWidth + 2 * space) { + final n = (size.width / (minWidth + 2 * space)).floor(); + width = size.width / n - 2 * space; + } + final cards = []; + var peers = FFI.peers(); + peers.forEach((p) { + cards.add(Container( + width: width, + child: Card( + child: GestureDetector( + onTap: !isDesktop ? () => connect('${p.id}') : null, + onDoubleTap: isDesktop ? () => connect('${p.id}') : null, + onLongPressStart: (details) { + final x = details.globalPosition.dx; + final y = details.globalPosition.dy; + _menuPos = RelativeRect.fromLTRB(x, y, x, y); + showPeerMenu(context, p.id); + }, + child: ListTile( + contentPadding: const EdgeInsets.only(left: 12), + subtitle: Text('${p.username}@${p.hostname}'), + title: Text('${p.id}'), + leading: Container( + padding: const EdgeInsets.all(6), + child: getPlatformImage('${p.platform}'), + color: str2color('${p.id}${p.platform}', 0x7f)), + trailing: InkWell( + child: Padding( + padding: const EdgeInsets.all(12), + child: Icon(Icons.more_vert)), + onTapDown: (e) { + final x = e.globalPosition.dx; + final y = e.globalPosition.dy; + _menuPos = RelativeRect.fromLTRB(x, y, x, y); + }, + onTap: () { + showPeerMenu(context, p.id); + }), + ))))); + }); + return Wrap(children: cards, spacing: space, runSpacing: space); + } + + void showPeerMenu(BuildContext context, String id) async { + var value = await showMenu( + context: context, + position: this._menuPos, + items: [ + PopupMenuItem( + child: Text(translate('Remove')), value: 'remove') + ] + + (!isAndroid + ? [] + : [ + PopupMenuItem( + child: Text(translate('File transfer')), value: 'file') + ]), + elevation: 8, + ); + if (value == 'remove') { + setState(() => FFI.setByName('remove', '$id')); + () async { + removePreference(id); + }(); + } else if (value == 'file') { + connect(id, isFileTransfer: true); + } + } +} + +class WebMenu extends StatefulWidget { + @override + _WebMenuState createState() => _WebMenuState(); +} + +class _WebMenuState extends State { + @override + Widget build(BuildContext context) { + Provider.of(context); + final username = getUsername(); + return PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (context) { + return (isIOS + ? [ + PopupMenuItem( + child: Icon(Icons.qr_code_scanner, color: Colors.black), + value: "scan", + ) + ] + : >[]) + + [ + PopupMenuItem( + child: Text(translate('ID/Relay Server')), + value: "server", + ) + ] + + (getUrl().contains('admin.rustdesk.com') + ? >[] + : [ + PopupMenuItem( + child: Text(username == null + ? translate("Login") + : translate("Logout") + ' ($username)'), + value: "login", + ) + ]) + + [ + PopupMenuItem( + child: Text(translate('About') + ' RustDesk'), + value: "about", + ) + ]; + }, + onSelected: (value) { + if (value == 'server') { + showServerSettings(); + } + if (value == 'about') { + showAbout(); + } + if (value == 'login') { + if (username == null) { + showLogin(); + } else { + logout(); + } + } + if (value == 'scan') { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ScanPage(), + ), + ); + } + }); + } +} diff --git a/flutter/lib/pages/file_manager_page.dart b/flutter/lib/pages/file_manager_page.dart new file mode 100644 index 000000000..48205a77e --- /dev/null +++ b/flutter/lib/pages/file_manager_page.dart @@ -0,0 +1,602 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/models/file_model.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_breadcrumb/flutter_breadcrumb.dart'; +import 'package:wakelock/wakelock.dart'; +import 'package:toggle_switch/toggle_switch.dart'; + +import '../common.dart'; +import '../models/model.dart'; +import '../widgets/dialog.dart'; + +class FileManagerPage extends StatefulWidget { + FileManagerPage({Key? key, required this.id}) : super(key: key); + final String id; + + @override + State createState() => _FileManagerPageState(); +} + +class _FileManagerPageState extends State { + final model = FFI.fileModel; + final _selectedItems = SelectedItems(); + Timer? _interval; + final _breadCrumbScroller = ScrollController(); + + @override + void initState() { + super.initState(); + FFI.connect(widget.id, isFileTransfer: true); + WidgetsBinding.instance!.addPostFrameCallback((_) { + showLoading(translate('Connecting...')); + _interval = Timer.periodic(Duration(milliseconds: 30), + (timer) => FFI.ffiModel.update(widget.id)); + }); + Wakelock.enable(); + } + + @override + void dispose() { + model.onClose(); + _interval?.cancel(); + FFI.close(); + SmartDialog.dismiss(); + Wakelock.disable(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChangeNotifierProvider.value( + value: FFI.fileModel, + child: Consumer(builder: (_context, _model, _child) { + return WillPopScope( + onWillPop: () async { + if (model.selectMode) { + model.toggleSelectMode(); + } else { + goBack(); + } + return false; + }, + child: Scaffold( + backgroundColor: MyTheme.grayBg, + appBar: AppBar( + leading: Row(children: [ + IconButton(icon: Icon(Icons.close), onPressed: clientClose), + ]), + centerTitle: true, + title: ToggleSwitch( + initialLabelIndex: model.isLocal ? 0 : 1, + activeBgColor: [MyTheme.idColor], + inactiveBgColor: MyTheme.grayBg, + inactiveFgColor: Colors.black54, + totalSwitches: 2, + minWidth: 100, + fontSize: 15, + iconSize: 18, + labels: [translate("Local"), translate("Remote")], + icons: [Icons.phone_android_sharp, Icons.screen_share], + onToggle: (index) { + final current = model.isLocal ? 0 : 1; + if (index != current) { + model.togglePage(); + } + }, + ), + actions: [ + PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + child: Row( + children: [ + Icon(Icons.refresh, color: Colors.black), + SizedBox(width: 5), + Text(translate("Refresh File")) + ], + ), + value: "refresh", + ), + PopupMenuItem( + child: Row( + children: [ + Icon(Icons.check, color: Colors.black), + SizedBox(width: 5), + Text(translate("Multi Select")) + ], + ), + value: "select", + ), + PopupMenuItem( + child: Row( + children: [ + Icon(Icons.folder_outlined, + color: Colors.black), + SizedBox(width: 5), + Text(translate("Create Folder")) + ], + ), + value: "folder", + ), + PopupMenuItem( + child: Row( + children: [ + Icon( + model.currentShowHidden + ? Icons.check_box_outlined + : Icons.check_box_outline_blank, + color: Colors.black), + SizedBox(width: 5), + Text(translate("Show Hidden Files")) + ], + ), + value: "hidden", + ) + ]; + }, + onSelected: (v) { + if (v == "refresh") { + model.refresh(); + } else if (v == "select") { + _selectedItems.clear(); + model.toggleSelectMode(); + } else if (v == "folder") { + final name = TextEditingController(); + DialogManager.show( + (setState, close) => CustomAlertDialog( + title: Text(translate("Create Folder")), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + decoration: InputDecoration( + labelText: translate( + "Please enter the folder name"), + ), + controller: name, + ), + ], + ), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () => close(false), + child: Text(translate("Cancel"))), + ElevatedButton( + style: flatButtonStyle, + onPressed: () { + if (name.value.text.isNotEmpty) { + model.createDir(PathUtil.join( + model.currentDir.path, + name.value.text, + model.currentIsWindows)); + close(); + } + }, + child: Text(translate("OK"))) + ])); + } else if (v == "hidden") { + model.toggleShowHidden(); + } + }), + ], + ), + body: body(), + bottomSheet: bottomSheet(), + )); + })); + + bool needShowCheckBox() { + if (!model.selectMode) { + return false; + } + return !_selectedItems.isOtherPage(model.isLocal); + } + + Widget body() { + final isLocal = model.isLocal; + final fd = model.currentDir; + final entries = fd.entries; + return Column(children: [ + headTools(), + Expanded( + child: ListView.builder( + itemCount: entries.length + 1, + itemBuilder: (context, index) { + if (index >= entries.length) { + return listTail(); + } + var selected = false; + if (model.selectMode) { + selected = _selectedItems.contains(entries[index]); + } + + final sizeStr = entries[index].isFile + ? readableFileSize(entries[index].size.toDouble()) + : ""; + return Card( + child: ListTile( + leading: Icon( + entries[index].isFile ? Icons.feed_outlined : Icons.folder, + size: 40), + title: Text(entries[index].name), + selected: selected, + subtitle: Text( + entries[index] + .lastModified() + .toString() + .replaceAll(".000", "") + + " " + + sizeStr, + style: TextStyle(fontSize: 12, color: MyTheme.darkGray), + ), + trailing: needShowCheckBox() + ? Checkbox( + value: selected, + onChanged: (v) { + if (v == null) return; + if (v && !selected) { + _selectedItems.add(isLocal, entries[index]); + } else if (!v && selected) { + _selectedItems.remove(entries[index]); + } + setState(() {}); + }) + : PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + child: Text(translate("Delete")), + value: "delete", + ), + PopupMenuItem( + child: Text(translate("Multi Select")), + value: "multi_select", + ), + PopupMenuItem( + child: Text(translate("Properties")), + value: "properties", + enabled: false, + ) + ]; + }, + onSelected: (v) { + if (v == "delete") { + final items = SelectedItems(); + items.add(isLocal, entries[index]); + model.removeAction(items); + } else if (v == "multi_select") { + _selectedItems.clear(); + model.toggleSelectMode(); + } + }), + onTap: () { + if (model.selectMode && !_selectedItems.isOtherPage(isLocal)) { + if (selected) { + _selectedItems.remove(entries[index]); + } else { + _selectedItems.add(isLocal, entries[index]); + } + setState(() {}); + return; + } + if (entries[index].isDirectory) { + model.openDirectory(entries[index].path); + breadCrumbScrollToEnd(); + } else { + // Perform file-related tasks. + } + }, + onLongPress: () { + _selectedItems.clear(); + model.toggleSelectMode(); + if (model.selectMode) { + _selectedItems.add(isLocal, entries[index]); + } + setState(() {}); + }, + ), + ); + }, + )) + ]); + } + + goBack() { + model.goToParentDirectory(); + } + + breadCrumbScrollToEnd() { + Future.delayed(Duration(milliseconds: 200), () { + _breadCrumbScroller.animateTo( + _breadCrumbScroller.position.maxScrollExtent, + duration: Duration(milliseconds: 200), + curve: Curves.fastLinearToSlowEaseIn); + }); + } + + Widget headTools() => Container( + child: Row( + children: [ + Expanded( + child: BreadCrumb( + items: getPathBreadCrumbItems(() => model.goHome(), (list) { + var path = ""; + if (model.currentHome.startsWith(list[0])) { + // absolute path + for (var item in list) { + path = PathUtil.join(path, item, model.currentIsWindows); + } + } else { + path += model.currentHome; + for (var item in list) { + path = PathUtil.join(path, item, model.currentIsWindows); + } + } + model.openDirectory(path); + }), + divider: Icon(Icons.chevron_right), + overflow: ScrollableOverflow(controller: _breadCrumbScroller), + )), + Row( + children: [ + IconButton( + icon: Icon(Icons.arrow_upward), + onPressed: goBack, + ), + PopupMenuButton( + icon: Icon(Icons.sort), + itemBuilder: (context) { + return SortBy.values + .map((e) => PopupMenuItem( + child: + Text(translate(e.toString().split(".").last)), + value: e, + )) + .toList(); + }, + onSelected: model.changeSortStyle), + ], + ) + ], + )); + + Widget listTail() { + return Container( + height: 100, + child: Column( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(30, 5, 30, 0), + child: Text( + model.currentDir.path, + style: TextStyle(color: MyTheme.darkGray), + ), + ), + Padding( + padding: EdgeInsets.all(2), + child: Text( + "${translate("Total")}: ${model.currentDir.entries.length} ${translate("items")}", + style: TextStyle(color: MyTheme.darkGray), + ), + ) + ], + ), + ); + } + + Widget? bottomSheet() { + final state = model.jobState; + final isOtherPage = _selectedItems.isOtherPage(model.isLocal); + final selectedItemsLen = "${_selectedItems.length} ${translate("items")}"; + final local = _selectedItems.isLocal == null + ? "" + : " [${_selectedItems.isLocal! ? translate("Local") : translate("Remote")}]"; + + if (model.selectMode) { + if (_selectedItems.length == 0 || !isOtherPage) { + return BottomSheetBody( + leading: Icon(Icons.check), + title: translate("Selected"), + text: selectedItemsLen + local, + onCanceled: () => model.toggleSelectMode(), + actions: [ + IconButton( + icon: Icon(Icons.compare_arrows), + onPressed: model.togglePage, + ), + IconButton( + icon: Icon(Icons.delete_forever), + onPressed: () { + if (_selectedItems.length > 0) { + model.removeAction(_selectedItems); + } + }, + ) + ]); + } else { + return BottomSheetBody( + leading: Icon(Icons.input), + title: translate("Paste here?"), + text: selectedItemsLen + local, + onCanceled: () => model.toggleSelectMode(), + actions: [ + IconButton( + icon: Icon(Icons.compare_arrows), + onPressed: model.togglePage, + ), + IconButton( + icon: Icon(Icons.paste), + onPressed: () { + model.toggleSelectMode(); + model.sendFiles(_selectedItems); + }, + ) + ]); + } + } + + switch (state) { + case JobState.inProgress: + return BottomSheetBody( + leading: CircularProgressIndicator(), + title: translate("Waiting"), + text: + "${translate("Speed")}: ${readableFileSize(model.jobProgress.speed)}/s", + onCanceled: () => model.cancelJob(model.jobProgress.id), + ); + case JobState.done: + return BottomSheetBody( + leading: Icon(Icons.check), + title: "${translate("Successful")}!", + text: "", + onCanceled: () => model.jobReset(), + ); + case JobState.error: + return BottomSheetBody( + leading: Icon(Icons.error), + title: "${translate("Error")}!", + text: "", + onCanceled: () => model.jobReset(), + ); + case JobState.none: + break; + } + return null; + } + + List getPathBreadCrumbItems( + void Function() onHome, void Function(List) onPressed) { + final path = model.currentShortPath; + final list = PathUtil.split(path, model.currentIsWindows); + final breadCrumbList = [ + BreadCrumbItem( + content: IconButton( + icon: Icon(Icons.home_filled), + onPressed: onHome, + )) + ]; + breadCrumbList.addAll(list.asMap().entries.map((e) => BreadCrumbItem( + content: TextButton( + child: Text(e.value), + style: + ButtonStyle(minimumSize: MaterialStateProperty.all(Size(0, 0))), + onPressed: () => onPressed(list.sublist(0, e.key + 1)))))); + return breadCrumbList; + } +} + +class BottomSheetBody extends StatelessWidget { + BottomSheetBody( + {required this.leading, + required this.title, + required this.text, + this.onCanceled, + this.actions}); + + final Widget leading; + final String title; + final String text; + final VoidCallback? onCanceled; + final List? actions; + + @override + BottomSheet build(BuildContext context) { + final _actions = actions ?? []; + return BottomSheet( + builder: (BuildContext context) { + return Container( + height: 65, + alignment: Alignment.centerLeft, + decoration: BoxDecoration( + color: MyTheme.accent50, + borderRadius: BorderRadius.vertical(top: Radius.circular(10))), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + leading, + SizedBox(width: 16), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: TextStyle(fontSize: 18)), + Text(text, + style: TextStyle( + fontSize: 14, color: MyTheme.grayBg)) + ], + ) + ], + ), + Row(children: () { + _actions.add(IconButton( + icon: Icon(Icons.cancel_outlined), + onPressed: onCanceled, + )); + return _actions; + }()) + ], + ), + )); + }, + onClosing: () {}, + backgroundColor: MyTheme.grayBg, + enableDrag: false, + ); + } +} + +class SelectedItems { + bool? _isLocal; + final List _items = []; + + List get items => _items; + + int get length => _items.length; + + bool? get isLocal => _isLocal; + + add(bool isLocal, Entry e) { + if (_isLocal == null) { + _isLocal = isLocal; + } + if (_isLocal != null && _isLocal != isLocal) { + return; + } + if (!_items.contains(e)) { + _items.add(e); + } + } + + bool contains(Entry e) { + return _items.contains(e); + } + + remove(Entry e) { + _items.remove(e); + if (_items.length == 0) { + _isLocal = null; + } + } + + bool isOtherPage(bool currentIsLocal) { + if (_isLocal == null) { + return false; + } else { + return _isLocal != currentIsLocal; + } + } + + clear() { + _items.clear(); + _isLocal = null; + } +} diff --git a/flutter/lib/pages/home_page.dart b/flutter/lib/pages/home_page.dart new file mode 100644 index 000000000..371aa3f64 --- /dev/null +++ b/flutter/lib/pages/home_page.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/pages/chat_page.dart'; +import 'package:flutter_hbb/pages/server_page.dart'; +import 'package:flutter_hbb/pages/settings_page.dart'; +import '../common.dart'; +import '../widgets/overlay.dart'; +import 'connection_page.dart'; + +abstract class PageShape extends Widget { + final String title = ""; + final Icon icon = Icon(null); + final List appBarActions = []; +} + +class HomePage extends StatefulWidget { + HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + var _selectedIndex = 0; + final List _pages = []; + + @override + void initState() { + super.initState(); + _pages.add(ConnectionPage()); + if (isAndroid) { + _pages.addAll([chatPage, ServerPage()]); + } + _pages.add(SettingsPage()); + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + if (_selectedIndex != 0) { + setState(() { + _selectedIndex = 0; + }); + } else { + return true; + } + return false; + }, + child: Scaffold( + backgroundColor: MyTheme.grayBg, + appBar: AppBar( + centerTitle: true, + title: Text("RustDesk"), + actions: _pages.elementAt(_selectedIndex).appBarActions, + ), + bottomNavigationBar: BottomNavigationBar( + key: navigationBarKey, + items: _pages + .map((page) => + BottomNavigationBarItem(icon: page.icon, label: page.title)) + .toList(), + currentIndex: _selectedIndex, + type: BottomNavigationBarType.fixed, + selectedItemColor: MyTheme.accent, + unselectedItemColor: MyTheme.darkGray, + onTap: (index) => setState(() { + // close chat overlay when go chat page + if (index == 1 && _selectedIndex != index) { + hideChatIconOverlay(); + hideChatWindowOverlay(); + } + _selectedIndex = index; + }), + ), + body: _pages.elementAt(_selectedIndex), + )); + } +} + +class WebHomePage extends StatelessWidget { + final connectionPage = ConnectionPage(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyTheme.grayBg, + appBar: AppBar( + centerTitle: true, + title: Text("RustDesk" + (isWeb ? " (Beta) " : "")), + actions: connectionPage.appBarActions, + ), + body: connectionPage, + ); + } +} diff --git a/flutter/lib/pages/remote_page.dart b/flutter/lib/pages/remote_page.dart new file mode 100644 index 000000000..30e827134 --- /dev/null +++ b/flutter/lib/pages/remote_page.dart @@ -0,0 +1,1327 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/models/chat_model.dart'; +import 'package:flutter_hbb/widgets/gesture_help.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter/services.dart'; +import 'dart:ui' as ui; +import 'dart:async'; +import 'package:wakelock/wakelock.dart'; +import '../common.dart'; +import '../widgets/gestures.dart'; +import '../models/model.dart'; +import '../widgets/dialog.dart'; +import '../widgets/overlay.dart'; + +final initText = '\1' * 1024; + +class RemotePage extends StatefulWidget { + RemotePage({Key? key, required this.id}) : super(key: key); + + final String id; + + @override + _RemotePageState createState() => _RemotePageState(); +} + +class _RemotePageState extends State { + Timer? _interval; + Timer? _timer; + bool _showBar = !isDesktop; + double _bottom = 0; + String _value = ''; + double _scale = 1; + + var _more = true; + var _fn = false; + final FocusNode _mobileFocusNode = FocusNode(); + final FocusNode _physicalFocusNode = FocusNode(); + var _showEdit = false; // use soft keyboard + var _isPhysicalMouse = false; + + @override + void initState() { + super.initState(); + FFI.connect(widget.id); + WidgetsBinding.instance!.addPostFrameCallback((_) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); + showLoading(translate('Connecting...')); + _interval = + Timer.periodic(Duration(milliseconds: 30), (timer) => interval()); + }); + Wakelock.enable(); + _physicalFocusNode.requestFocus(); + FFI.listenToMouse(true); + } + + @override + void dispose() { + hideMobileActionsOverlay(); + FFI.listenToMouse(false); + FFI.invokeMethod("enable_soft_keyboard", true); + _mobileFocusNode.dispose(); + _physicalFocusNode.dispose(); + FFI.close(); + _interval?.cancel(); + _timer?.cancel(); + SmartDialog.dismiss(); + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + Wakelock.disable(); + super.dispose(); + } + + void resetTool() { + FFI.resetModifiers(); + } + + bool isKeyboardShown() { + return _bottom >= 100; + } + + // crash on web before widget initiated. + void intervalUnsafe() { + var v = MediaQuery.of(context).viewInsets.bottom; + if (v != _bottom) { + resetTool(); + setState(() { + _bottom = v; + if (v < 100) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: []); + if (chatWindowOverlayEntry == null) { + FFI.invokeMethod("enable_soft_keyboard", false); + } + } + }); + } + FFI.ffiModel.update(widget.id); + } + + void interval() { + try { + intervalUnsafe(); + } catch (e) {} + } + + // handle mobile virtual keyboard + void handleInput(String newValue) { + var oldValue = _value; + _value = newValue; + if (isIOS) { + var i = newValue.length - 1; + for (; i >= 0 && newValue[i] != '\1'; --i) {} + var j = oldValue.length - 1; + for (; j >= 0 && oldValue[j] != '\1'; --j) {} + if (i < j) j = i; + newValue = newValue.substring(j + 1); + oldValue = oldValue.substring(j + 1); + var common = 0; + for (; + common < oldValue.length && + common < newValue.length && + newValue[common] == oldValue[common]; + ++common); + for (i = 0; i < oldValue.length - common; ++i) { + FFI.inputKey('VK_BACK'); + } + if (newValue.length > common) { + var s = newValue.substring(common); + if (s.length > 1) { + FFI.setByName('input_string', s); + } else { + inputChar(s); + } + } + return; + } + if (oldValue.length > 0 && + newValue.length > 0 && + oldValue[0] == '\1' && + newValue[0] != '\1') { + // clipboard + oldValue = ''; + } + if (newValue.length == oldValue.length) { + // ? + } else if (newValue.length < oldValue.length) { + final char = 'VK_BACK'; + FFI.inputKey(char); + } else { + final content = newValue.substring(oldValue.length); + if (content.length > 1) { + if (oldValue != '' && + content.length == 2 && + (content == '""' || + content == '()' || + content == '[]' || + content == '<>' || + content == "{}" || + content == '”“' || + content == '《》' || + content == '()' || + content == '【】')) { + // can not only input content[0], because when input ], [ are also auo insert, which cause ] never be input + FFI.setByName('input_string', content); + openKeyboard(); + return; + } + FFI.setByName('input_string', content); + } else { + inputChar(content); + } + } + } + + void inputChar(String char) { + if (char == '\n') { + char = 'VK_RETURN'; + } else if (char == ' ') { + char = 'VK_SPACE'; + } + FFI.inputKey(char); + } + + void openKeyboard() { + FFI.invokeMethod("enable_soft_keyboard", true); + // destroy first, so that our _value trick can work + _value = initText; + setState(() => _showEdit = false); + _timer?.cancel(); + _timer = Timer(Duration(milliseconds: 30), () { + // show now, and sleep a while to requestFocus to + // make sure edit ready, so that keyboard wont show/hide/show/hide happen + setState(() => _showEdit = true); + _timer?.cancel(); + _timer = Timer(Duration(milliseconds: 30), () { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + _mobileFocusNode.requestFocus(); + }); + }); + } + + void sendRawKey(RawKeyEvent e, {bool? down, bool? press}) { + // for maximum compatibility + final label = _logicalKeyMap[e.logicalKey.keyId] ?? + _physicalKeyMap[e.physicalKey.usbHidUsage] ?? + e.logicalKey.keyLabel; + FFI.inputKey(label, down: down, press: press ?? false); + } + + @override + Widget build(BuildContext context) { + final pi = Provider.of(context).pi; + final hideKeyboard = isKeyboardShown() && _showEdit; + final showActionButton = !_showBar || hideKeyboard; + final keyboard = FFI.ffiModel.permissions['keyboard'] != false; + + return WillPopScope( + onWillPop: () async { + clientClose(); + return false; + }, + child: getRawPointerAndKeyBody( + keyboard, + Scaffold( + // resizeToAvoidBottomInset: true, + floatingActionButton: !showActionButton + ? null + : FloatingActionButton( + mini: !hideKeyboard, + child: Icon( + hideKeyboard ? Icons.expand_more : Icons.expand_less), + backgroundColor: MyTheme.accent, + onPressed: () { + setState(() { + if (hideKeyboard) { + _showEdit = false; + FFI.invokeMethod("enable_soft_keyboard", false); + _mobileFocusNode.unfocus(); + _physicalFocusNode.requestFocus(); + } else { + _showBar = !_showBar; + } + }); + }), + bottomNavigationBar: _showBar && pi.displays.length > 0 + ? getBottomAppBar(keyboard) + : null, + body: Overlay( + initialEntries: [ + OverlayEntry(builder: (context) { + return Container( + color: Colors.black, + child: isDesktop + ? getBodyForDesktopWithListener(keyboard) + : SafeArea( + child: Container( + color: MyTheme.canvasColor, + child: _isPhysicalMouse + ? getBodyForMobile() + : getBodyForMobileWithGesture()))); + }) + ], + ))), + ); + } + + Widget getRawPointerAndKeyBody(bool keyboard, Widget child) { + return Listener( + onPointerHover: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) return; + if (!_isPhysicalMouse) { + setState(() { + _isPhysicalMouse = true; + }); + } + if (_isPhysicalMouse) { + FFI.handleMouse(getEvent(e, 'mousemove')); + } + }, + onPointerDown: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) { + if (_isPhysicalMouse) { + setState(() { + _isPhysicalMouse = false; + }); + } + } + if (_isPhysicalMouse) { + FFI.handleMouse(getEvent(e, 'mousedown')); + } + }, + onPointerUp: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) return; + if (_isPhysicalMouse) { + FFI.handleMouse(getEvent(e, 'mouseup')); + } + }, + onPointerMove: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) return; + if (_isPhysicalMouse) { + FFI.handleMouse(getEvent(e, 'mousemove')); + } + }, + onPointerSignal: (e) { + if (e is PointerScrollEvent) { + var dx = e.scrollDelta.dx; + var dy = e.scrollDelta.dy; + if (dx > 0) + dx = -1; + else if (dx < 0) dx = 1; + if (dy > 0) + dy = -1; + else if (dy < 0) dy = 1; + FFI.setByName( + 'send_mouse', '{"type": "wheel", "x": "$dx", "y": "$dy"}'); + } + }, + child: MouseRegion( + cursor: keyboard ? SystemMouseCursors.none : MouseCursor.defer, + child: FocusScope( + autofocus: true, + child: Focus( + autofocus: true, + canRequestFocus: true, + focusNode: _physicalFocusNode, + onKey: (data, e) { + final key = e.logicalKey; + if (e is RawKeyDownEvent) { + if (e.repeat) { + sendRawKey(e, press: true); + } else { + if (e.isAltPressed && !FFI.alt) { + FFI.alt = true; + } else if (e.isControlPressed && !FFI.ctrl) { + FFI.ctrl = true; + } else if (e.isShiftPressed && !FFI.shift) { + FFI.shift = true; + } else if (e.isMetaPressed && !FFI.command) { + FFI.command = true; + } + sendRawKey(e, down: true); + } + } + // [!_showEdit] workaround for soft-keyboard's control_key like Backspace / Enter + if (!_showEdit && e is RawKeyUpEvent) { + if (key == LogicalKeyboardKey.altLeft || + key == LogicalKeyboardKey.altRight) { + FFI.alt = false; + } else if (key == LogicalKeyboardKey.controlLeft || + key == LogicalKeyboardKey.controlRight) { + FFI.ctrl = false; + } else if (key == LogicalKeyboardKey.shiftRight || + key == LogicalKeyboardKey.shiftLeft) { + FFI.shift = false; + } else if (key == LogicalKeyboardKey.metaLeft || + key == LogicalKeyboardKey.metaRight) { + FFI.command = false; + } + sendRawKey(e); + } + return KeyEventResult.handled; + }, + child: child)))); + } + + Widget getBottomAppBar(bool keyboard) { + return BottomAppBar( + elevation: 10, + color: MyTheme.accent, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + IconButton( + color: Colors.white, + icon: Icon(Icons.clear), + onPressed: () { + clientClose(); + }, + ) + ] + + [ + IconButton( + color: Colors.white, + icon: Icon(Icons.tv), + onPressed: () { + setState(() => _showEdit = false); + showOptions(); + }, + ) + ] + + (isDesktop + ? [] + : [ + IconButton( + color: Colors.white, + icon: Icon(Icons.keyboard), + onPressed: openKeyboard), + FFI.ffiModel.isPeerAndroid + ? (keyboard + ? IconButton( + color: Colors.white, + icon: Icon(Icons.build), + onPressed: () { + if (mobileActionsOverlayEntry == null) { + showMobileActionsOverlay(); + } else { + hideMobileActionsOverlay(); + } + }, + ) + : SizedBox.shrink()) + : IconButton( + color: Colors.white, + icon: Icon(FFI.ffiModel.touchMode + ? Icons.touch_app + : Icons.mouse), + onPressed: changeTouchMode, + ) + ]) + + (isWeb + ? [] + : [ + IconButton( + color: Colors.white, + icon: Icon(Icons.message), + onPressed: () { + FFI.chatModel + .changeCurrentID(ChatModel.clientModeID); + toggleChatOverlay(); + }, + ) + ]) + + [ + IconButton( + color: Colors.white, + icon: Icon(Icons.more_vert), + onPressed: () { + setState(() => _showEdit = false); + showActions(); + }, + ), + ]), + IconButton( + color: Colors.white, + icon: Icon(Icons.expand_more), + onPressed: () { + setState(() => _showBar = !_showBar); + }), + ], + ), + ); + } + + /// touchMode only: + /// LongPress -> right click + /// OneFingerPan -> start/end -> left down start/end + /// onDoubleTapDown -> move to + /// onLongPressDown => move to + /// + /// mouseMode only: + /// DoubleFiner -> right click + /// HoldDrag -> left drag + + Widget getBodyForMobileWithGesture() { + final touchMode = FFI.ffiModel.touchMode; + return getMixinGestureDetector( + child: getBodyForMobile(), + onTapUp: (d) { + if (touchMode) { + FFI.cursorModel.touch( + d.localPosition.dx, d.localPosition.dy, MouseButtons.left); + } else { + FFI.tap(MouseButtons.left); + } + }, + onDoubleTapDown: (d) { + if (touchMode) { + FFI.cursorModel.move(d.localPosition.dx, d.localPosition.dy); + } + }, + onDoubleTap: () { + FFI.tap(MouseButtons.left); + FFI.tap(MouseButtons.left); + }, + onLongPressDown: (d) { + if (touchMode) { + FFI.cursorModel.move(d.localPosition.dx, d.localPosition.dy); + } + }, + onLongPress: () { + FFI.tap(MouseButtons.right); + }, + onDoubleFinerTap: (d) { + if (!touchMode) { + FFI.tap(MouseButtons.right); + } + }, + onHoldDragStart: (d) { + if (!touchMode) { + FFI.sendMouse('down', MouseButtons.left); + } + }, + onHoldDragUpdate: (d) { + if (!touchMode) { + FFI.cursorModel.updatePan(d.delta.dx, d.delta.dy, touchMode); + } + }, + onHoldDragEnd: (_) { + if (!touchMode) { + FFI.sendMouse('up', MouseButtons.left); + } + }, + onOneFingerPanStart: (d) { + if (touchMode) { + FFI.cursorModel.move(d.localPosition.dx, d.localPosition.dy); + FFI.sendMouse('down', MouseButtons.left); + } + }, + onOneFingerPanUpdate: (d) { + FFI.cursorModel.updatePan(d.delta.dx, d.delta.dy, touchMode); + }, + onOneFingerPanEnd: (d) { + if (touchMode) { + FFI.sendMouse('up', MouseButtons.left); + } + }, + // scale + pan event + onTwoFingerScaleUpdate: (d) { + FFI.canvasModel.updateScale(d.scale / _scale); + _scale = d.scale; + FFI.canvasModel.panX(d.focalPointDelta.dx); + FFI.canvasModel.panY(d.focalPointDelta.dy); + }, + onTwoFingerScaleEnd: (d) { + _scale = 1; + FFI.setByName('peer_option', '{"name": "view-style", "value": ""}'); + }, + onTwoFingerVerticalDragUpdate: FFI.ffiModel.isPeerAndroid + ? null + : (d) { + FFI.scroll(d.delta.dy / 2); + }); + } + + Widget getBodyForMobile() { + return Container( + color: MyTheme.canvasColor, + child: Stack(children: [ + ImagePaint(), + CursorPaint(), + getHelpTools(), + SizedBox( + width: 0, + height: 0, + child: !_showEdit + ? Container() + : TextFormField( + textInputAction: TextInputAction.newline, + autocorrect: false, + enableSuggestions: false, + autofocus: true, + focusNode: _mobileFocusNode, + maxLines: null, + initialValue: _value, + // trick way to make backspace work always + keyboardType: TextInputType.multiline, + onChanged: handleInput, + ), + ), + ])); + } + + Widget getBodyForDesktopWithListener(bool keyboard) { + var paints = [ImagePaint()]; + if (keyboard || + FFI.getByName('toggle_option', 'show-remote-cursor') == 'true') { + paints.add(CursorPaint()); + } + return Container( + color: MyTheme.canvasColor, child: Stack(children: paints)); + } + + int lastMouseDownButtons = 0; + Map getEvent(PointerEvent evt, String type) { + final Map out = {}; + out['type'] = type; + out['x'] = evt.position.dx; + out['y'] = evt.position.dy; + if (FFI.alt) out['alt'] = 'true'; + if (FFI.shift) out['shift'] = 'true'; + if (FFI.ctrl) out['ctrl'] = 'true'; + if (FFI.command) out['command'] = 'true'; + out['buttons'] = evt + .buttons; // left button: 1, right button: 2, middle button: 4, 1 | 2 = 3 (left + right) + if (evt.buttons != 0) { + lastMouseDownButtons = evt.buttons; + } else { + out['buttons'] = lastMouseDownButtons; + } + return out; + } + + void showActions() { + final size = MediaQuery.of(context).size; + final x = 120.0; + final y = size.height; + final more = >[]; + final pi = FFI.ffiModel.pi; + final perms = FFI.ffiModel.permissions; + if (pi.version.isNotEmpty) { + more.add(PopupMenuItem( + child: Text(translate('Refresh')), value: 'refresh')); + } + more.add(PopupMenuItem( + child: Row( + children: ([ + Container(width: 100.0, child: Text(translate('OS Password'))), + TextButton( + style: flatButtonStyle, + onPressed: () { + Navigator.pop(context); + showSetOSPassword(false); + }, + child: Icon(Icons.edit, color: MyTheme.accent), + ) + ])), + value: 'enter_os_password')); + if (!isDesktop) { + if (perms['keyboard'] != false && perms['clipboard'] != false) { + more.add(PopupMenuItem( + child: Text(translate('Paste')), value: 'paste')); + } + more.add(PopupMenuItem( + child: Text(translate('Reset canvas')), value: 'reset_canvas')); + } + if (perms['keyboard'] != false) { + if (pi.platform == 'Linux' || pi.sasEnabled) { + more.add(PopupMenuItem( + child: Text(translate('Insert') + ' Ctrl + Alt + Del'), + value: 'cad')); + } + more.add(PopupMenuItem( + child: Text(translate('Insert Lock')), value: 'lock')); + if (pi.platform == 'Windows' && + FFI.getByName('toggle_option', 'privacy-mode') != 'true') { + more.add(PopupMenuItem( + child: Text(translate( + (FFI.ffiModel.inputBlocked ? 'Unb' : 'B') + 'lock user input')), + value: 'block-input')); + } + } + () async { + var value = await showMenu( + context: context, + position: RelativeRect.fromLTRB(x, y, x, y), + items: more, + elevation: 8, + ); + if (value == 'cad') { + FFI.setByName('ctrl_alt_del'); + } else if (value == 'lock') { + FFI.setByName('lock_screen'); + } else if (value == 'block-input') { + FFI.setByName('toggle_option', + (FFI.ffiModel.inputBlocked ? 'un' : '') + 'block-input'); + FFI.ffiModel.inputBlocked = !FFI.ffiModel.inputBlocked; + } else if (value == 'refresh') { + FFI.setByName('refresh'); + } else if (value == 'paste') { + () async { + ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain); + if (data != null && data.text != null) { + FFI.setByName('input_string', '${data.text}'); + } + }(); + } else if (value == 'enter_os_password') { + var password = FFI.getByName('peer_option', "os-password"); + if (password != "") { + FFI.setByName('input_os_password', password); + } else { + showSetOSPassword(true); + } + } else if (value == 'reset_canvas') { + FFI.cursorModel.reset(); + } + }(); + } + + void changeTouchMode() { + setState(() => _showEdit = false); + showModalBottomSheet( + backgroundColor: MyTheme.grayBg, + isScrollControlled: true, + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(5))), + builder: (context) => DraggableScrollableSheet( + expand: false, + builder: (context, scrollController) { + return SingleChildScrollView( + padding: EdgeInsets.symmetric(vertical: 10), + child: GestureHelp( + touchMode: FFI.ffiModel.touchMode, + onTouchModeChange: (t) { + FFI.ffiModel.toggleTouchMode(); + final v = FFI.ffiModel.touchMode ? 'Y' : ''; + FFI.setByName('peer_option', + '{"name": "touch-mode", "value": "$v"}'); + })); + })); + } + + Widget getHelpTools() { + final keyboard = isKeyboardShown(); + if (!keyboard) { + return SizedBox(); + } + final size = MediaQuery.of(context).size; + var wrap = (String text, void Function() onPressed, + [bool? active, IconData? icon]) { + return TextButton( + style: TextButton.styleFrom( + minimumSize: Size(0, 0), + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 9.75), + //adds padding inside the button + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + //limits the touch area to the button area + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + ), + backgroundColor: active == true ? MyTheme.accent80 : null, + ), + child: icon != null + ? Icon(icon, size: 17, color: Colors.white) + : Text(translate(text), + style: TextStyle(color: Colors.white, fontSize: 11)), + onPressed: onPressed); + }; + final pi = FFI.ffiModel.pi; + final isMac = pi.platform == "Mac OS"; + final modifiers = [ + wrap('Ctrl ', () { + setState(() => FFI.ctrl = !FFI.ctrl); + }, FFI.ctrl), + wrap(' Alt ', () { + setState(() => FFI.alt = !FFI.alt); + }, FFI.alt), + wrap('Shift', () { + setState(() => FFI.shift = !FFI.shift); + }, FFI.shift), + wrap(isMac ? ' Cmd ' : ' Win ', () { + setState(() => FFI.command = !FFI.command); + }, FFI.command), + ]; + final keys = [ + wrap( + ' Fn ', + () => setState( + () { + _fn = !_fn; + if (_fn) { + _more = false; + } + }, + ), + _fn), + wrap( + ' ... ', + () => setState( + () { + _more = !_more; + if (_more) { + _fn = false; + } + }, + ), + _more), + ]; + final fn = [ + SizedBox(width: 9999), + ]; + for (var i = 1; i <= 12; ++i) { + final name = 'F' + i.toString(); + fn.add(wrap(name, () { + FFI.inputKey('VK_' + name); + })); + } + final more = [ + SizedBox(width: 9999), + wrap('Esc', () { + FFI.inputKey('VK_ESCAPE'); + }), + wrap('Tab', () { + FFI.inputKey('VK_TAB'); + }), + wrap('Home', () { + FFI.inputKey('VK_HOME'); + }), + wrap('End', () { + FFI.inputKey('VK_END'); + }), + wrap('Del', () { + FFI.inputKey('VK_DELETE'); + }), + wrap('PgUp', () { + FFI.inputKey('VK_PRIOR'); + }), + wrap('PgDn', () { + FFI.inputKey('VK_NEXT'); + }), + SizedBox(width: 9999), + wrap('', () { + FFI.inputKey('VK_LEFT'); + }, false, Icons.keyboard_arrow_left), + wrap('', () { + FFI.inputKey('VK_UP'); + }, false, Icons.keyboard_arrow_up), + wrap('', () { + FFI.inputKey('VK_DOWN'); + }, false, Icons.keyboard_arrow_down), + wrap('', () { + FFI.inputKey('VK_RIGHT'); + }, false, Icons.keyboard_arrow_right), + wrap(isMac ? 'Cmd+C' : 'Ctrl+C', () { + sendPrompt(isMac, 'VK_C'); + }), + wrap(isMac ? 'Cmd+V' : 'Ctrl+V', () { + sendPrompt(isMac, 'VK_V'); + }), + wrap(isMac ? 'Cmd+S' : 'Ctrl+S', () { + sendPrompt(isMac, 'VK_S'); + }), + ]; + final space = size.width > 320 ? 4.0 : 2.0; + return Container( + color: Color(0xAA000000), + padding: EdgeInsets.only( + top: keyboard ? 24 : 4, left: 0, right: 0, bottom: 8), + child: Wrap( + spacing: space, + runSpacing: space, + children: [SizedBox(width: 9999)] + + (keyboard + ? modifiers + keys + (_fn ? fn : []) + (_more ? more : []) + : modifiers), + )); + } +} + +class ImagePaint extends StatelessWidget { + @override + Widget build(BuildContext context) { + final m = Provider.of(context); + final c = Provider.of(context); + final adjust = FFI.cursorModel.adjustForKeyboard(); + var s = c.scale; + return CustomPaint( + painter: new ImagePainter( + image: m.image, x: c.x / s, y: (c.y - adjust) / s, scale: s), + ); + } +} + +class CursorPaint extends StatelessWidget { + @override + Widget build(BuildContext context) { + final m = Provider.of(context); + final c = Provider.of(context); + final adjust = FFI.cursorModel.adjustForKeyboard(); + var s = c.scale; + return CustomPaint( + painter: new ImagePainter( + image: m.image, + x: m.x * s - m.hotx + c.x, + y: m.y * s - m.hoty + c.y - adjust, + scale: 1), + ); + } +} + +class ImagePainter extends CustomPainter { + ImagePainter({ + required this.image, + required this.x, + required this.y, + required this.scale, + }); + + ui.Image? image; + double x; + double y; + double scale; + + @override + void paint(Canvas canvas, Size size) { + if (image == null) return; + canvas.scale(scale, scale); + canvas.drawImage(image!, new Offset(x, y), new Paint()); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return oldDelegate != this; + } +} + +CheckboxListTile getToggle( + void Function(void Function()) setState, option, name) { + return CheckboxListTile( + value: FFI.getByName('toggle_option', option) == 'true', + onChanged: (v) { + setState(() { + FFI.setByName('toggle_option', option); + }); + }, + dense: true, + title: Text(translate(name))); +} + +RadioListTile getRadio(String name, String toValue, String curValue, + void Function(String?) onChange) { + return RadioListTile( + controlAffinity: ListTileControlAffinity.trailing, + title: Text(translate(name)), + value: toValue, + groupValue: curValue, + onChanged: onChange, + dense: true, + ); +} + +void showOptions() { + String quality = FFI.getByName('image_quality'); + if (quality == '') quality = 'balanced'; + String viewStyle = FFI.getByName('peer_option', 'view-style'); + var displays = []; + final pi = FFI.ffiModel.pi; + final image = FFI.ffiModel.getConnectionImage(); + if (image != null) + displays.add(Padding(padding: const EdgeInsets.only(top: 8), child: image)); + if (pi.displays.length > 1) { + final cur = pi.currentDisplay; + final children = []; + for (var i = 0; i < pi.displays.length; ++i) + children.add(InkWell( + onTap: () { + if (i == cur) return; + FFI.setByName('switch_display', i.toString()); + SmartDialog.dismiss(); + }, + child: Ink( + width: 40, + height: 40, + decoration: BoxDecoration( + border: Border.all(color: Colors.black87), + color: i == cur ? Colors.black87 : Colors.white), + child: Center( + child: Text((i + 1).toString(), + style: TextStyle( + color: i == cur ? Colors.white : Colors.black87)))))); + displays.add(Padding( + padding: const EdgeInsets.only(top: 8), + child: Wrap( + alignment: WrapAlignment.center, + spacing: 8, + children: children, + ))); + } + if (displays.isNotEmpty) { + displays.add(Divider(color: MyTheme.border)); + } + final perms = FFI.ffiModel.permissions; + + DialogManager.show((setState, close) { + final more = []; + if (perms['audio'] != false) { + more.add(getToggle(setState, 'disable-audio', 'Mute')); + } + if (perms['keyboard'] != false) { + if (perms['clipboard'] != false) + more.add(getToggle(setState, 'disable-clipboard', 'Disable clipboard')); + more.add(getToggle( + setState, 'lock-after-session-end', 'Lock after session end')); + if (pi.platform == 'Windows') { + more.add(getToggle(setState, 'privacy-mode', 'Privacy mode')); + } + } + var setQuality = (String? value) { + if (value == null) return; + setState(() { + quality = value; + FFI.setByName('image_quality', value); + }); + }; + var setViewStyle = (String? value) { + if (value == null) return; + setState(() { + viewStyle = value; + FFI.setByName( + 'peer_option', '{"name": "view-style", "value": "$value"}'); + FFI.canvasModel.updateViewStyle(); + }); + }; + return CustomAlertDialog( + title: SizedBox.shrink(), + content: Column( + mainAxisSize: MainAxisSize.min, + children: displays + + [ + getRadio('Original', 'original', viewStyle, setViewStyle), + getRadio('Shrink', 'shrink', viewStyle, setViewStyle), + getRadio('Stretch', 'stretch', viewStyle, setViewStyle), + Divider(color: MyTheme.border), + getRadio('Good image quality', 'best', quality, setQuality), + getRadio('Balanced', 'balanced', quality, setQuality), + getRadio('Optimize reaction time', 'low', quality, setQuality), + Divider(color: MyTheme.border), + getToggle(setState, 'show-remote-cursor', 'Show remote cursor'), + ] + + more), + actions: [], + contentPadding: 0, + ); + }, clickMaskDismiss: true, backDismiss: true); +} + +void showSetOSPassword(bool login) { + final controller = TextEditingController(); + var password = FFI.getByName('peer_option', "os-password"); + var autoLogin = FFI.getByName('peer_option', "auto-login") != ""; + controller.text = password; + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('OS Password')), + content: Column(mainAxisSize: MainAxisSize.min, children: [ + PasswordWidget(controller: controller), + CheckboxListTile( + contentPadding: const EdgeInsets.all(0), + dense: true, + controlAffinity: ListTileControlAffinity.leading, + title: Text( + translate('Auto Login'), + ), + value: autoLogin, + onChanged: (v) { + if (v == null) return; + setState(() => autoLogin = v); + }, + ), + ]), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () { + close(); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: () { + var text = controller.text.trim(); + FFI.setByName( + 'peer_option', '{"name": "os-password", "value": "$text"}'); + FFI.setByName('peer_option', + '{"name": "auto-login", "value": "${autoLogin ? 'Y' : ''}"}'); + if (text != "" && login) { + FFI.setByName('input_os_password', text); + } + close(); + }, + child: Text(translate('OK')), + ), + ]); + }); +} + +void sendPrompt(bool isMac, String key) { + final old = isMac ? FFI.command : FFI.ctrl; + if (isMac) { + FFI.command = true; + } else { + FFI.ctrl = true; + } + FFI.inputKey(key); + if (isMac) { + FFI.command = old; + } else { + FFI.ctrl = old; + } +} + +/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _keyLabels +/// see [LogicalKeyboardKey.keyLabel] +const Map _logicalKeyMap = { + 0x00000000020: 'VK_SPACE', + 0x00000000022: 'VK_QUOTE', + 0x0000000002c: 'VK_COMMA', + 0x0000000002d: 'VK_MINUS', + 0x0000000002f: 'VK_SLASH', + 0x00000000030: 'VK_0', + 0x00000000031: 'VK_1', + 0x00000000032: 'VK_2', + 0x00000000033: 'VK_3', + 0x00000000034: 'VK_4', + 0x00000000035: 'VK_5', + 0x00000000036: 'VK_6', + 0x00000000037: 'VK_7', + 0x00000000038: 'VK_8', + 0x00000000039: 'VK_9', + 0x0000000003b: 'VK_SEMICOLON', + 0x0000000003d: 'VK_PLUS', // it is = + 0x0000000005b: 'VK_LBRACKET', + 0x0000000005c: 'VK_BACKSLASH', + 0x0000000005d: 'VK_RBRACKET', + 0x00000000061: 'VK_A', + 0x00000000062: 'VK_B', + 0x00000000063: 'VK_C', + 0x00000000064: 'VK_D', + 0x00000000065: 'VK_E', + 0x00000000066: 'VK_F', + 0x00000000067: 'VK_G', + 0x00000000068: 'VK_H', + 0x00000000069: 'VK_I', + 0x0000000006a: 'VK_J', + 0x0000000006b: 'VK_K', + 0x0000000006c: 'VK_L', + 0x0000000006d: 'VK_M', + 0x0000000006e: 'VK_N', + 0x0000000006f: 'VK_O', + 0x00000000070: 'VK_P', + 0x00000000071: 'VK_Q', + 0x00000000072: 'VK_R', + 0x00000000073: 'VK_S', + 0x00000000074: 'VK_T', + 0x00000000075: 'VK_U', + 0x00000000076: 'VK_V', + 0x00000000077: 'VK_W', + 0x00000000078: 'VK_X', + 0x00000000079: 'VK_Y', + 0x0000000007a: 'VK_Z', + 0x00100000008: 'VK_BACK', + 0x00100000009: 'VK_TAB', + 0x0010000000d: 'VK_ENTER', + 0x0010000001b: 'VK_ESCAPE', + 0x0010000007f: 'VK_DELETE', + 0x00100000104: 'VK_CAPITAL', + 0x00100000301: 'VK_DOWN', + 0x00100000302: 'VK_LEFT', + 0x00100000303: 'VK_RIGHT', + 0x00100000304: 'VK_UP', + 0x00100000305: 'VK_END', + 0x00100000306: 'VK_HOME', + 0x00100000307: 'VK_NEXT', + 0x00100000308: 'VK_PRIOR', + 0x00100000401: 'VK_CLEAR', + 0x00100000407: 'VK_INSERT', + 0x00100000504: 'VK_CANCEL', + 0x00100000506: 'VK_EXECUTE', + 0x00100000508: 'VK_HELP', + 0x00100000509: 'VK_PAUSE', + 0x0010000050c: 'VK_SELECT', + 0x00100000608: 'VK_PRINT', + 0x00100000705: 'VK_CONVERT', + 0x00100000706: 'VK_FINAL', + 0x00100000711: 'VK_HANGUL', + 0x00100000712: 'VK_HANJA', + 0x00100000713: 'VK_JUNJA', + 0x00100000718: 'VK_KANA', + 0x00100000719: 'VK_KANJI', + 0x00100000801: 'VK_F1', + 0x00100000802: 'VK_F2', + 0x00100000803: 'VK_F3', + 0x00100000804: 'VK_F4', + 0x00100000805: 'VK_F5', + 0x00100000806: 'VK_F6', + 0x00100000807: 'VK_F7', + 0x00100000808: 'VK_F8', + 0x00100000809: 'VK_F9', + 0x0010000080a: 'VK_F10', + 0x0010000080b: 'VK_F11', + 0x0010000080c: 'VK_F12', + 0x00100000d2b: 'Apps', + 0x00200000002: 'VK_SLEEP', + 0x00200000100: 'VK_CONTROL', + 0x00200000101: 'RControl', + 0x00200000102: 'VK_SHIFT', + 0x00200000103: 'RShift', + 0x00200000104: 'VK_MENU', + 0x00200000105: 'RAlt', + 0x002000001f0: 'VK_CONTROL', + 0x002000001f2: 'VK_SHIFT', + 0x002000001f4: 'VK_MENU', + 0x002000001f6: 'Meta', + 0x0020000022a: 'VK_MULTIPLY', + 0x0020000022b: 'VK_ADD', + 0x0020000022d: 'VK_SUBTRACT', + 0x0020000022e: 'VK_DECIMAL', + 0x0020000022f: 'VK_DIVIDE', + 0x00200000230: 'VK_NUMPAD0', + 0x00200000231: 'VK_NUMPAD1', + 0x00200000232: 'VK_NUMPAD2', + 0x00200000233: 'VK_NUMPAD3', + 0x00200000234: 'VK_NUMPAD4', + 0x00200000235: 'VK_NUMPAD5', + 0x00200000236: 'VK_NUMPAD6', + 0x00200000237: 'VK_NUMPAD7', + 0x00200000238: 'VK_NUMPAD8', + 0x00200000239: 'VK_NUMPAD9', +}; + +/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _debugName +/// see [PhysicalKeyboardKey.debugName] -> _debugName +const Map _physicalKeyMap = { + 0x00010082: 'VK_SLEEP', + 0x00070004: 'VK_A', + 0x00070005: 'VK_B', + 0x00070006: 'VK_C', + 0x00070007: 'VK_D', + 0x00070008: 'VK_E', + 0x00070009: 'VK_F', + 0x0007000a: 'VK_G', + 0x0007000b: 'VK_H', + 0x0007000c: 'VK_I', + 0x0007000d: 'VK_J', + 0x0007000e: 'VK_K', + 0x0007000f: 'VK_L', + 0x00070010: 'VK_M', + 0x00070011: 'VK_N', + 0x00070012: 'VK_O', + 0x00070013: 'VK_P', + 0x00070014: 'VK_Q', + 0x00070015: 'VK_R', + 0x00070016: 'VK_S', + 0x00070017: 'VK_T', + 0x00070018: 'VK_U', + 0x00070019: 'VK_V', + 0x0007001a: 'VK_W', + 0x0007001b: 'VK_X', + 0x0007001c: 'VK_Y', + 0x0007001d: 'VK_Z', + 0x0007001e: 'VK_1', + 0x0007001f: 'VK_2', + 0x00070020: 'VK_3', + 0x00070021: 'VK_4', + 0x00070022: 'VK_5', + 0x00070023: 'VK_6', + 0x00070024: 'VK_7', + 0x00070025: 'VK_8', + 0x00070026: 'VK_9', + 0x00070027: 'VK_0', + 0x00070028: 'VK_ENTER', + 0x00070029: 'VK_ESCAPE', + 0x0007002a: 'VK_BACK', + 0x0007002b: 'VK_TAB', + 0x0007002c: 'VK_SPACE', + 0x0007002d: 'VK_MINUS', + 0x0007002e: 'VK_PLUS', // it is = + 0x0007002f: 'VK_LBRACKET', + 0x00070030: 'VK_RBRACKET', + 0x00070033: 'VK_SEMICOLON', + 0x00070034: 'VK_QUOTE', + 0x00070036: 'VK_COMMA', + 0x00070038: 'VK_SLASH', + 0x00070039: 'VK_CAPITAL', + 0x0007003a: 'VK_F1', + 0x0007003b: 'VK_F2', + 0x0007003c: 'VK_F3', + 0x0007003d: 'VK_F4', + 0x0007003e: 'VK_F5', + 0x0007003f: 'VK_F6', + 0x00070040: 'VK_F7', + 0x00070041: 'VK_F8', + 0x00070042: 'VK_F9', + 0x00070043: 'VK_F10', + 0x00070044: 'VK_F11', + 0x00070045: 'VK_F12', + 0x00070049: 'VK_INSERT', + 0x0007004a: 'VK_HOME', + 0x0007004b: 'VK_PRIOR', // Page Up + 0x0007004c: 'VK_DELETE', + 0x0007004d: 'VK_END', + 0x0007004e: 'VK_NEXT', // Page Down + 0x0007004f: 'VK_RIGHT', + 0x00070050: 'VK_LEFT', + 0x00070051: 'VK_DOWN', + 0x00070052: 'VK_UP', + 0x00070053: 'Num Lock', // TODO rust not impl + 0x00070054: 'VK_DIVIDE', // numpad + 0x00070055: 'VK_MULTIPLY', + 0x00070056: 'VK_SUBTRACT', + 0x00070057: 'VK_ADD', + 0x00070058: 'VK_ENTER', // num enter + 0x00070059: 'VK_NUMPAD0', + 0x0007005a: 'VK_NUMPAD1', + 0x0007005b: 'VK_NUMPAD2', + 0x0007005c: 'VK_NUMPAD3', + 0x0007005d: 'VK_NUMPAD4', + 0x0007005e: 'VK_NUMPAD5', + 0x0007005f: 'VK_NUMPAD6', + 0x00070060: 'VK_NUMPAD7', + 0x00070061: 'VK_NUMPAD8', + 0x00070062: 'VK_NUMPAD9', + 0x00070063: 'VK_DECIMAL', + 0x00070075: 'VK_HELP', + 0x00070077: 'VK_SELECT', + 0x00070088: 'VK_KANA', + 0x0007008a: 'VK_CONVERT', + 0x000700e0: 'VK_CONTROL', + 0x000700e1: 'VK_SHIFT', + 0x000700e2: 'VK_MENU', + 0x000700e3: 'Meta', + 0x000700e4: 'RControl', + 0x000700e5: 'RShift', + 0x000700e6: 'RAlt', + 0x000700e7: 'RWin', + 0x000c00b1: 'VK_PAUSE', + 0x000c00cd: 'VK_PAUSE', + 0x000c019e: 'LOCK_SCREEN', + 0x000c0208: 'VK_PRINT', +}; diff --git a/flutter/lib/pages/scan_page.dart b/flutter/lib/pages/scan_page.dart new file mode 100644 index 000000000..0bc6dfb21 --- /dev/null +++ b/flutter/lib/pages/scan_page.dart @@ -0,0 +1,258 @@ +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:image/image.dart' as img; +import 'package:zxing2/qrcode.dart'; +import 'dart:io'; +import 'dart:async'; +import 'dart:convert'; +import '../common.dart'; +import '../models/model.dart'; + +class ScanPage extends StatefulWidget { + @override + _ScanPageState createState() => _ScanPageState(); +} + +class _ScanPageState extends State { + QRViewController? controller; + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + + // In order to get hot reload to work we need to pause the camera if the platform + // is android, or resume the camera if the platform is iOS. + @override + void reassemble() { + super.reassemble(); + if (isAndroid) { + controller!.pauseCamera(); + } + controller!.resumeCamera(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Scan QR'), + actions: [ + IconButton( + color: Colors.white, + icon: Icon(Icons.image_search), + iconSize: 32.0, + onPressed: () async { + final ImagePicker _picker = ImagePicker(); + final XFile? file = + await _picker.pickImage(source: ImageSource.gallery); + if (file != null) { + var image = img.decodeNamedImage( + File(file.path).readAsBytesSync(), file.path)!; + + LuminanceSource source = RGBLuminanceSource( + image.width, + image.height, + image + .getBytes(format: img.Format.abgr) + .buffer + .asInt32List()); + var bitmap = BinaryBitmap(HybridBinarizer(source)); + + var reader = QRCodeReader(); + try { + var result = reader.decode(bitmap); + showServerSettingFromQr(result.text); + } catch (e) { + showToast('No QR code found'); + } + } + }), + IconButton( + color: Colors.yellow, + icon: Icon(Icons.flash_on), + iconSize: 32.0, + onPressed: () async { + await controller?.toggleFlash(); + }), + IconButton( + color: Colors.white, + icon: Icon(Icons.switch_camera), + iconSize: 32.0, + onPressed: () async { + await controller?.flipCamera(); + }, + ), + ], + ), + body: _buildQrView(context)); + } + + Widget _buildQrView(BuildContext context) { + // For this example we check how width or tall the device is and change the scanArea and overlay accordingly. + var scanArea = (MediaQuery.of(context).size.width < 400 || + MediaQuery.of(context).size.height < 400) + ? 150.0 + : 300.0; + // To ensure the Scanner view is properly sizes after rotation + // we need to listen for Flutter SizeChanged notification and update controller + return QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + overlay: QrScannerOverlayShape( + borderColor: Colors.red, + borderRadius: 10, + borderLength: 30, + borderWidth: 10, + cutOutSize: scanArea), + onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p), + ); + } + + void _onQRViewCreated(QRViewController controller) { + setState(() { + this.controller = controller; + }); + controller.scannedDataStream.listen((scanData) { + if (scanData.code != null) { + showServerSettingFromQr(scanData.code!); + } + }); + } + + void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) { + if (!p) { + showToast('No permisssion'); + } + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } + + void showServerSettingFromQr(String data) async { + backToHome(); + await controller?.pauseCamera(); + if (!data.startsWith('config=')) { + showToast('Invalid QR code'); + return; + } + try { + Map values = json.decode(data.substring(7)); + var host = values['host'] != null ? values['host'] as String : ''; + var key = values['key'] != null ? values['key'] as String : ''; + var api = values['api'] != null ? values['api'] as String : ''; + Timer(Duration(milliseconds: 60), () { + showServerSettingsWithValue(host, '', key, api); + }); + } catch (e) { + showToast('Invalid QR code'); + } + } +} + +void showServerSettingsWithValue( + String id, String relay, String key, String api) { + final formKey = GlobalKey(); + final id0 = FFI.getByName('option', 'custom-rendezvous-server'); + final relay0 = FFI.getByName('option', 'relay-server'); + final api0 = FFI.getByName('option', 'api-server'); + final key0 = FFI.getByName('option', 'key'); + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('ID/Relay Server')), + content: Form( + key: formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + initialValue: id, + decoration: InputDecoration( + labelText: translate('ID Server'), + ), + validator: validate, + onSaved: (String? value) { + if (value != null) id = value.trim(); + }, + ) + ] + + (isAndroid + ? [ + TextFormField( + initialValue: relay, + decoration: InputDecoration( + labelText: translate('Relay Server'), + ), + validator: validate, + onSaved: (String? value) { + if (value != null) relay = value.trim(); + }, + ) + ] + : []) + + [ + TextFormField( + initialValue: api, + decoration: InputDecoration( + labelText: translate('API Server'), + ), + validator: validate, + onSaved: (String? value) { + if (value != null) api = value.trim(); + }, + ), + TextFormField( + initialValue: key, + decoration: InputDecoration( + labelText: 'Key', + ), + validator: null, + onSaved: (String? value) { + if (value != null) key = value.trim(); + }, + ), + ])), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () { + close(); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: () { + if (formKey.currentState != null && + formKey.currentState!.validate()) { + formKey.currentState!.save(); + if (id != id0) + FFI.setByName('option', + '{"name": "custom-rendezvous-server", "value": "$id"}'); + if (relay != relay0) + FFI.setByName( + 'option', '{"name": "relay-server", "value": "$relay"}'); + if (key != key0) + FFI.setByName('option', '{"name": "key", "value": "$key"}'); + if (api != api0) + FFI.setByName( + 'option', '{"name": "api-server", "value": "$api"}'); + FFI.ffiModel.updateUser(); + close(); + } + }, + child: Text(translate('OK')), + ), + ], + ); + }); +} + +String? validate(value) { + value = value.trim(); + if (value.isEmpty) { + return null; + } + final res = FFI.getByName('test_if_valid_server', value); + return res.isEmpty ? null : res; +} diff --git a/flutter/lib/pages/server_page.dart b/flutter/lib/pages/server_page.dart new file mode 100644 index 000000000..9377f495d --- /dev/null +++ b/flutter/lib/pages/server_page.dart @@ -0,0 +1,500 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/models/model.dart'; +import 'package:flutter_hbb/widgets/dialog.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:provider/provider.dart'; + +import '../common.dart'; +import '../models/server_model.dart'; +import 'home_page.dart'; +import '../models/model.dart'; + +class ServerPage extends StatelessWidget implements PageShape { + @override + final title = translate("Share Screen"); + + @override + final icon = Icon(Icons.mobile_screen_share); + + @override + final appBarActions = [ + PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + child: Text(translate("Change ID")), + value: "changeID", + enabled: false, + ), + PopupMenuItem( + child: Text(translate("Set your own password")), + value: "changePW", + enabled: FFI.serverModel.isStart, + ), + PopupMenuItem( + child: Text(translate("Refresh random password")), + value: "refreshPW", + enabled: FFI.serverModel.isStart, + ) + ]; + }, + onSelected: (value) { + if (value == "changeID") { + // TODO + } else if (value == "changePW") { + updatePasswordDialog(); + } else if (value == "refreshPW") { + () async { + showLoading(translate("Waiting")); + if (await FFI.serverModel.updatePassword("")) { + showSuccess(); + } else { + showError(); + } + debugPrint("end updatePassword"); + }(); + } + }) + ]; + + @override + Widget build(BuildContext context) { + checkService(); + return ChangeNotifierProvider.value( + value: FFI.serverModel, + child: Consumer( + builder: (context, serverModel, child) => SingleChildScrollView( + controller: FFI.serverModel.controller, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + ServerInfo(), + PermissionChecker(), + ConnectionManager(), + SizedBox.fromSize(size: Size(0, 15.0)), + ], + ), + ), + ))); + } +} + +void checkService() async { + FFI.invokeMethod("check_service"); // jvm + // for Android 10/11,MANAGE_EXTERNAL_STORAGE permission from a system setting page + if (PermissionManager.isWaitingFile() && !FFI.serverModel.fileOk) { + PermissionManager.complete("file", await PermissionManager.check("file")); + debugPrint("file permission finished"); + } +} + +class ServerInfo extends StatefulWidget { + @override + _ServerInfoState createState() => _ServerInfoState(); +} + +class _ServerInfoState extends State { + final model = FFI.serverModel; + var _passwdShow = false; + + @override + Widget build(BuildContext context) { + return model.isStart + ? PaddingCard( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + readOnly: true, + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + color: MyTheme.accent), + controller: model.serverId, + decoration: InputDecoration( + icon: const Icon(Icons.perm_identity), + labelText: translate("ID"), + labelStyle: TextStyle( + fontWeight: FontWeight.bold, color: MyTheme.accent50), + ), + onSaved: (String? value) {}, + ), + TextFormField( + readOnly: true, + obscureText: !_passwdShow, + style: TextStyle( + fontSize: 25.0, + fontWeight: FontWeight.bold, + color: MyTheme.accent), + controller: model.serverPasswd, + decoration: InputDecoration( + icon: const Icon(Icons.lock), + labelText: translate("Password"), + labelStyle: TextStyle( + fontWeight: FontWeight.bold, color: MyTheme.accent50), + suffix: IconButton( + icon: Icon(Icons.visibility), + onPressed: () { + setState(() { + _passwdShow = !_passwdShow; + }); + })), + onSaved: (String? value) {}, + ), + ], + )) + : PaddingCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Row( + children: [ + Icon(Icons.warning_amber_sharp, + color: Colors.redAccent, size: 24), + SizedBox(width: 10), + Text( + translate("Service is not running"), + style: TextStyle( + fontFamily: 'WorkSans', + fontWeight: FontWeight.bold, + fontSize: 18, + color: MyTheme.accent80, + ), + ) + ], + )), + SizedBox(height: 5), + Center( + child: Text( + translate("android_start_service_tip"), + style: TextStyle(fontSize: 12, color: MyTheme.darkGray), + )) + ], + )); + } +} + +class PermissionChecker extends StatefulWidget { + @override + _PermissionCheckerState createState() => _PermissionCheckerState(); +} + +class _PermissionCheckerState extends State { + @override + Widget build(BuildContext context) { + final serverModel = Provider.of(context); + final hasAudioPermission = androidVersion >= 30; + final status; + if (serverModel.connectStatus == -1) { + status = 'not_ready_status'; + } else if (serverModel.connectStatus == 0) { + status = 'connecting_status'; + } else { + status = 'Ready'; + } + return PaddingCard( + title: translate("Permissions"), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PermissionRow(translate("Screen Capture"), serverModel.mediaOk, + serverModel.toggleService), + PermissionRow(translate("Input Control"), serverModel.inputOk, + serverModel.toggleInput), + PermissionRow(translate("File Transfer"), serverModel.fileOk, + serverModel.toggleFile), + hasAudioPermission + ? PermissionRow(translate("Audio Capture"), serverModel.audioOk, + serverModel.toggleAudio) + : Text( + "* ${translate("android_version_audio_tip")}", + style: TextStyle(color: MyTheme.darkGray), + ), + SizedBox(height: 8), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 0, + child: serverModel.mediaOk + ? ElevatedButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.red)), + icon: Icon(Icons.stop), + onPressed: serverModel.toggleService, + label: Text(translate("Stop service"))) + : ElevatedButton.icon( + icon: Icon(Icons.play_arrow), + onPressed: serverModel.toggleService, + label: Text(translate("Start Service")))), + Expanded( + child: serverModel.mediaOk + ? Row( + children: [ + Expanded( + flex: 0, + child: Padding( + padding: + EdgeInsets.only(left: 20, right: 5), + child: Icon(Icons.circle, + color: serverModel.connectStatus > 0 + ? Colors.greenAccent + : Colors.deepOrangeAccent, + size: 10))), + Expanded( + child: Text(translate(status), + softWrap: true, + style: TextStyle( + fontSize: 14.0, + color: MyTheme.accent50))) + ], + ) + : SizedBox.shrink()) + ], + ), + ], + )); + } +} + +class PermissionRow extends StatelessWidget { + PermissionRow(this.name, this.isOk, this.onPressed); + + final String name; + final bool isOk; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 140, + child: Text(name, + style: TextStyle(fontSize: 16.0, color: MyTheme.accent50))), + SizedBox( + width: 50, + child: Text(isOk ? translate("ON") : translate("OFF"), + style: TextStyle( + fontSize: 16.0, + color: isOk ? Colors.green : Colors.grey)), + ) + ], + ), + TextButton( + onPressed: onPressed, + child: Text( + translate(isOk ? "CLOSE" : "OPEN"), + style: TextStyle(fontWeight: FontWeight.bold), + )), + const Divider(height: 0) + ], + ); + } +} + +class ConnectionManager extends StatelessWidget { + @override + Widget build(BuildContext context) { + final serverModel = Provider.of(context); + return Column( + children: serverModel.clients.entries + .map((entry) => PaddingCard( + title: translate(entry.value.isFileTransfer + ? "File Connection" + : "Screen Connection"), + titleIcon: entry.value.isFileTransfer + ? Icons.folder_outlined + : Icons.mobile_screen_share, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: clientInfo(entry.value)), + Expanded( + flex: -1, + child: entry.value.isFileTransfer || + !entry.value.authorized + ? SizedBox.shrink() + : IconButton( + onPressed: () { + FFI.chatModel + .changeCurrentID(entry.value.id); + final bar = + navigationBarKey.currentWidget; + if (bar != null) { + bar as BottomNavigationBar; + bar.onTap!(1); + } + }, + icon: Icon( + Icons.chat, + color: MyTheme.accent80, + ))) + ], + ), + entry.value.authorized + ? SizedBox.shrink() + : Text( + translate("android_new_connection_tip"), + style: TextStyle(color: Colors.black54), + ), + entry.value.authorized + ? ElevatedButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.red)), + icon: Icon(Icons.close), + onPressed: () { + FFI.setByName("close_conn", entry.key.toString()); + FFI.invokeMethod( + "cancel_notification", entry.key); + }, + label: Text(translate("Close"))) + : Row(children: [ + TextButton( + child: Text(translate("Dismiss")), + onPressed: () { + serverModel.sendLoginResponse( + entry.value, false); + }), + SizedBox(width: 20), + ElevatedButton( + child: Text(translate("Accept")), + onPressed: () { + serverModel.sendLoginResponse( + entry.value, true); + }), + ]), + ], + ))) + .toList()); + } +} + +class PaddingCard extends StatelessWidget { + PaddingCard({required this.child, this.title, this.titleIcon}); + + final String? title; + final IconData? titleIcon; + final Widget child; + + @override + Widget build(BuildContext context) { + final children = [child]; + if (title != null) { + children.insert( + 0, + Padding( + padding: EdgeInsets.symmetric(vertical: 5.0), + child: Row( + children: [ + titleIcon != null + ? Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(titleIcon, + color: MyTheme.accent80, size: 30)) + : SizedBox.shrink(), + Text( + title!, + style: TextStyle( + fontFamily: 'WorkSans', + fontWeight: FontWeight.bold, + fontSize: 20, + color: MyTheme.accent80, + ), + ) + ], + ))); + } + return Container( + width: double.maxFinite, + child: Card( + margin: EdgeInsets.fromLTRB(15.0, 15.0, 15.0, 0), + child: Padding( + padding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 30.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: children, + ), + ), + )); + } +} + +Widget clientInfo(Client client) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + children: [ + Expanded( + flex: -1, + child: Padding( + padding: EdgeInsets.only(right: 12), + child: CircleAvatar( + child: Text(client.name[0]), + backgroundColor: MyTheme.border))), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(client.name, + style: TextStyle(color: MyTheme.idColor, fontSize: 18)), + SizedBox(width: 8), + Text(client.peerId, + style: TextStyle(color: MyTheme.idColor, fontSize: 10)) + ])) + ], + ), + ])); +} + +void toAndroidChannelInit() { + FFI.setMethodCallHandler((method, arguments) { + debugPrint("flutter got android msg,$method,$arguments"); + try { + switch (method) { + case "start_capture": + { + SmartDialog.dismiss(); + FFI.serverModel.updateClientState(); + break; + } + case "on_state_changed": + { + var name = arguments["name"] as String; + var value = arguments["value"] as String == "true"; + debugPrint("from jvm:on_state_changed,$name:$value"); + FFI.serverModel.changeStatue(name, value); + break; + } + case "on_android_permission_result": + { + var type = arguments["type"] as String; + var result = arguments["result"] as bool; + PermissionManager.complete(type, result); + break; + } + case "on_media_projection_canceled": + { + FFI.serverModel.stopService(); + break; + } + } + } catch (e) { + debugPrint("MethodCallHandler err:$e"); + } + return ""; + }); +} diff --git a/flutter/lib/pages/settings_page.dart b/flutter/lib/pages/settings_page.dart new file mode 100644 index 000000000..90ff0d564 --- /dev/null +++ b/flutter/lib/pages/settings_page.dart @@ -0,0 +1,357 @@ +import 'package:settings_ui/settings_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:provider/provider.dart'; +import 'dart:convert'; +import 'package:http/http.dart' as http; +import '../common.dart'; +import '../widgets/dialog.dart'; +import '../models/model.dart'; +import 'home_page.dart'; +import 'scan_page.dart'; + +class SettingsPage extends StatefulWidget implements PageShape { + @override + final title = translate("Settings"); + + @override + final icon = Icon(Icons.settings); + + @override + final appBarActions = [ScanButton()]; + + @override + _SettingsState createState() => _SettingsState(); +} + +class _SettingsState extends State { + static const url = 'https://rustdesk.com/'; + + @override + Widget build(BuildContext context) { + Provider.of(context); + final username = getUsername(); + return SettingsList( + sections: [ + SettingsSection( + title: Text(translate("Account")), + tiles: [ + SettingsTile.navigation( + title: Text(username == null + ? translate("Login") + : translate("Logout") + ' ($username)'), + leading: Icon(Icons.person), + onPressed: (context) { + if (username == null) { + showLogin(); + } else { + logout(); + } + }, + ), + ], + ), + SettingsSection( + title: Text(translate("Settings")), + tiles: [ + SettingsTile.navigation( + title: Text(translate('ID/Relay Server')), + leading: Icon(Icons.cloud), + onPressed: (context) { + showServerSettings(); + }, + ), + ], + ), + SettingsSection( + title: Text(translate("About")), + tiles: [ + SettingsTile.navigation( + onPressed: (context) async { + if (await canLaunch(url)) { + await launch(url); + } + }, + title: Text(translate("Version: ") + version), + value: Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: Text('rustdesk.com', + style: TextStyle( + decoration: TextDecoration.underline, + )), + ), + leading: Icon(Icons.info)), + ], + ), + ], + ); + } +} + +void showServerSettings() { + final id = FFI.getByName('option', 'custom-rendezvous-server'); + final relay = FFI.getByName('option', 'relay-server'); + final api = FFI.getByName('option', 'api-server'); + final key = FFI.getByName('option', 'key'); + showServerSettingsWithValue(id, relay, key, api); +} + +void showAbout() { + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('About') + ' RustDesk'), + content: Wrap(direction: Axis.vertical, spacing: 12, children: [ + Text('Version: $version'), + InkWell( + onTap: () async { + const url = 'https://rustdesk.com/'; + if (await canLaunch(url)) { + await launch(url); + } + }, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: Text('rustdesk.com', + style: TextStyle( + decoration: TextDecoration.underline, + )), + )), + ]), + actions: [], + ); + }, clickMaskDismiss: true, backDismiss: true); +} + +Future login(String name, String pass) async { +/* js test CORS +const data = { username: 'example', password: 'xx' }; + +fetch('http://localhost:21114/api/login', { + method: 'POST', // or 'PUT' + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), +}) +.then(response => response.json()) +.then(data => { + console.log('Success:', data); +}) +.catch((error) => { + console.error('Error:', error); +}); +*/ + final url = getUrl(); + final body = { + 'username': name, + 'password': pass, + 'id': FFI.getByName('server_id'), + 'uuid': FFI.getByName('uuid') + }; + try { + final response = await http.post(Uri.parse('${url}/api/login'), + headers: {"Content-Type": "application/json"}, body: json.encode(body)); + return parseResp(response.body); + } catch (e) { + print(e); + return 'Failed to access $url'; + } +} + +String parseResp(String body) { + final data = json.decode(body); + final error = data['error']; + if (error != null) { + return error!; + } + final token = data['access_token']; + if (token != null) { + FFI.setByName('option', '{"name": "access_token", "value": "$token"}'); + } + final info = data['user']; + if (info != null) { + final value = json.encode(info); + FFI.setByName('option', json.encode({"name": "user_info", "value": value})); + FFI.ffiModel.updateUser(); + } + return ''; +} + +void refreshCurrentUser() async { + final token = FFI.getByName("option", "access_token"); + if (token == '') return; + final url = getUrl(); + final body = { + 'id': FFI.getByName('server_id'), + 'uuid': FFI.getByName('uuid') + }; + try { + final response = await http.post(Uri.parse('${url}/api/currentUser'), + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer $token" + }, + body: json.encode(body)); + final status = response.statusCode; + if (status == 401 || status == 400) { + resetToken(); + return; + } + parseResp(response.body); + } catch (e) { + print('$e'); + } +} + +void logout() async { + final token = FFI.getByName("option", "access_token"); + if (token == '') return; + final url = getUrl(); + final body = { + 'id': FFI.getByName('server_id'), + 'uuid': FFI.getByName('uuid') + }; + try { + await http.post(Uri.parse('${url}/api/logout'), + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer $token" + }, + body: json.encode(body)); + } catch (e) { + showToast('Failed to access $url'); + } + resetToken(); +} + +void resetToken() { + FFI.setByName('option', '{"name": "access_token", "value": ""}'); + FFI.setByName('option', '{"name": "user_info", "value": ""}'); + FFI.ffiModel.updateUser(); +} + +String getUrl() { + var url = FFI.getByName('option', 'api-server'); + if (url == '') { + url = FFI.getByName('option', 'custom-rendezvous-server'); + if (url != '') { + if (url.contains(':')) { + final tmp = url.split(':'); + if (tmp.length == 2) { + var port = int.parse(tmp[1]) - 2; + url = 'http://${tmp[0]}:$port'; + } + } else { + url = 'http://${url}:21114'; + } + } + } + if (url == '') { + url = 'https://admin.rustdesk.com'; + } + return url; +} + +void showLogin() { + final passwordController = TextEditingController(); + final nameController = TextEditingController(); + var loading = false; + var error = ''; + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('Login')), + content: Column(mainAxisSize: MainAxisSize.min, children: [ + TextField( + autofocus: true, + autocorrect: false, + enableSuggestions: false, + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: translate('Username'), + ), + controller: nameController, + ), + PasswordWidget(controller: passwordController), + ]), + actions: (loading + ? [CircularProgressIndicator()] + : (error != "" + ? [ + Text(translate(error), + style: TextStyle(color: Colors.red)) + ] + : [])) + + [ + TextButton( + style: flatButtonStyle, + onPressed: loading + ? null + : () { + close(); + setState(() { + loading = false; + }); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: loading + ? null + : () async { + final name = nameController.text.trim(); + final pass = passwordController.text.trim(); + if (name != "" && pass != "") { + setState(() { + loading = true; + }); + final e = await login(name, pass); + setState(() { + loading = false; + error = e; + }); + if (e == "") { + close(); + } + } + }, + child: Text(translate('OK')), + ), + ], + ); + }); +} + +String? getUsername() { + final token = FFI.getByName("option", "access_token"); + String? username; + if (token != "") { + final info = FFI.getByName("option", "user_info"); + if (info != "") { + try { + Map tmp = json.decode(info); + username = tmp["name"]; + } catch (e) { + print('$e'); + } + } + } + return username; +} + +class ScanButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return IconButton( + icon: Icon(Icons.qr_code_scanner), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ScanPage(), + ), + ); + }, + ); + } +} diff --git a/flutter/lib/widgets/dialog.dart b/flutter/lib/widgets/dialog.dart new file mode 100644 index 000000000..7781cfe40 --- /dev/null +++ b/flutter/lib/widgets/dialog.dart @@ -0,0 +1,228 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import '../common.dart'; +import '../models/model.dart'; + +void clientClose() { + msgBox('', 'Close', 'Are you sure to close the connection?'); +} + +const SEC1 = Duration(seconds: 1); +void showSuccess({Duration duration = SEC1}) { + SmartDialog.dismiss(); + showToast(translate("Successful"), duration: SEC1); +} + +void showError({Duration duration = SEC1}) { + SmartDialog.dismiss(); + showToast(translate("Error"), duration: SEC1); +} + +void updatePasswordDialog() { + final p0 = TextEditingController(); + final p1 = TextEditingController(); + var validateLength = false; + var validateSame = false; + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('Set your own password')), + content: Form( + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Column(mainAxisSize: MainAxisSize.min, children: [ + TextFormField( + autofocus: true, + obscureText: true, + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: translate('Password'), + ), + controller: p0, + validator: (v) { + if (v == null) return null; + final val = v.trim().length > 5; + if (validateLength != val) { + // use delay to make setState success + Future.delayed(Duration(microseconds: 1), + () => setState(() => validateLength = val)); + } + return val + ? null + : translate('Too short, at least 6 characters.'); + }, + ), + TextFormField( + obscureText: true, + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: translate('Confirmation'), + ), + controller: p1, + validator: (v) { + if (v == null) return null; + final val = p0.text == v; + if (validateSame != val) { + Future.delayed(Duration(microseconds: 1), + () => setState(() => validateSame = val)); + } + return val + ? null + : translate('The confirmation is not identical.'); + }, + ), + ])), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () { + close(); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: (validateLength && validateSame) + ? () async { + close(); + showLoading(translate("Waiting")); + if (await FFI.serverModel.updatePassword(p0.text)) { + showSuccess(); + } else { + showError(); + } + } + : null, + child: Text(translate('OK')), + ), + ], + ); + }); +} + +void enterPasswordDialog(String id) { + final controller = TextEditingController(); + var remember = FFI.getByName('remember', id) == 'true'; + DialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate('Password Required')), + content: Column(mainAxisSize: MainAxisSize.min, children: [ + PasswordWidget(controller: controller), + CheckboxListTile( + contentPadding: const EdgeInsets.all(0), + dense: true, + controlAffinity: ListTileControlAffinity.leading, + title: Text( + translate('Remember password'), + ), + value: remember, + onChanged: (v) { + if (v != null) { + setState(() => remember = v); + } + }, + ), + ]), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () { + close(); + backToHome(); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: () { + var text = controller.text.trim(); + if (text == '') return; + FFI.login(text, remember); + close(); + showLoading(translate('Logging in...')); + }, + child: Text(translate('OK')), + ), + ], + ); + }); +} + +void wrongPasswordDialog(String id) { + DialogManager.show((setState, close) => CustomAlertDialog( + title: Text(translate('Wrong Password')), + content: Text(translate('Do you want to enter again?')), + actions: [ + TextButton( + style: flatButtonStyle, + onPressed: () { + close(); + backToHome(); + }, + child: Text(translate('Cancel')), + ), + TextButton( + style: flatButtonStyle, + onPressed: () { + enterPasswordDialog(id); + }, + child: Text(translate('Retry')), + ), + ])); +} + +class PasswordWidget extends StatefulWidget { + PasswordWidget({Key? key, required this.controller}) : super(key: key); + + final TextEditingController controller; + + @override + _PasswordWidgetState createState() => _PasswordWidgetState(); +} + +class _PasswordWidgetState extends State { + bool _passwordVisible = false; + final _focusNode = FocusNode(); + + @override + void initState() { + super.initState(); + Timer(Duration(milliseconds: 50), () => _focusNode.requestFocus()); + } + + @override + void dispose() { + _focusNode.unfocus(); + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return TextField( + focusNode: _focusNode, + controller: widget.controller, + obscureText: !_passwordVisible, + //This will obscure text dynamically + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: Translator.call('Password'), + hintText: Translator.call('Enter your password'), + // Here is key idea + suffixIcon: IconButton( + icon: Icon( + // Based on passwordVisible state choose the icon + _passwordVisible ? Icons.visibility : Icons.visibility_off, + color: Theme.of(context).primaryColorDark, + ), + onPressed: () { + // Update the state i.e. toogle the state of passwordVisible variable + setState(() { + _passwordVisible = !_passwordVisible; + }); + }, + ), + ), + ); + } +} diff --git a/flutter/lib/widgets/gesture_help.dart b/flutter/lib/widgets/gesture_help.dart new file mode 100644 index 000000000..b2a2141c5 --- /dev/null +++ b/flutter/lib/widgets/gesture_help.dart @@ -0,0 +1,208 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; +import 'package:toggle_switch/toggle_switch.dart'; + +import '../models/model.dart'; + +class GestureIcons { + static const String _family = 'gestureicons'; + + GestureIcons._(); + + static const IconData icon_mouse = IconData(0xe65c, fontFamily: _family); + static const IconData icon_Tablet_Touch = + IconData(0xe9ce, fontFamily: _family); + static const IconData icon_gesture_f_drag = + IconData(0xe686, fontFamily: _family); + static const IconData icon_Mobile_Touch = + IconData(0xe9cd, fontFamily: _family); + static const IconData icon_gesture_press = + IconData(0xe66c, fontFamily: _family); + static const IconData icon_gesture_tap = + IconData(0xe66f, fontFamily: _family); + static const IconData icon_gesture_pinch = + IconData(0xe66a, fontFamily: _family); + static const IconData icon_gesture_press_hold = + IconData(0xe66b, fontFamily: _family); + static const IconData icon_gesture_f_drag_up_down_ = + IconData(0xe685, fontFamily: _family); + static const IconData icon_gesture_f_tap_ = + IconData(0xe68e, fontFamily: _family); + static const IconData icon_gesture_f_swipe_right = + IconData(0xe68f, fontFamily: _family); + static const IconData icon_gesture_f_double_tap = + IconData(0xe691, fontFamily: _family); +} + +typedef OnTouchModeChange = void Function(bool); + +class GestureHelp extends StatefulWidget { + GestureHelp( + {Key? key, required this.touchMode, required this.onTouchModeChange}) + : super(key: key); + final bool touchMode; + final OnTouchModeChange onTouchModeChange; + + @override + State createState() => _GestureHelpState(); +} + +class _GestureHelpState extends State { + var _selectedIndex; + var _touchMode; + + @override + void initState() { + _touchMode = widget.touchMode; + _selectedIndex = _touchMode ? 1 : 0; + super.initState(); + } + + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final space = 12.0; + var width = size.width - 2 * space; + final minWidth = 90; + if (size.width > minWidth + 2 * space) { + final n = (size.width / (minWidth + 2 * space)).floor(); + width = size.width / n - 2 * space; + } + return Center( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ToggleSwitch( + initialLabelIndex: _selectedIndex, + inactiveBgColor: MyTheme.darkGray, + totalSwitches: 2, + minWidth: 150, + fontSize: 15, + iconSize: 18, + labels: [translate("Mouse mode"), translate("Touch mode")], + icons: [Icons.mouse, Icons.touch_app], + onToggle: (index) { + setState(() { + if (_selectedIndex != index) { + _selectedIndex = index ?? 0; + _touchMode = index == 0 ? false : true; + widget.onTouchModeChange(_touchMode); + } + }); + }, + ), + const SizedBox(height: 30), + Container( + child: Wrap( + spacing: space, + runSpacing: 2 * space, + children: _touchMode + ? [ + GestureInfo( + width, + GestureIcons.icon_Mobile_Touch, + translate("One-Finger Tap"), + translate("Left Mouse")), + GestureInfo( + width, + GestureIcons.icon_gesture_press_hold, + translate("One-Long Tap"), + translate("Right Mouse")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_swipe_right, + translate("One-Finger Move"), + translate("Mouse Drag")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_drag_up_down_, + translate("Two-Finger vertically"), + translate("Mouse Wheel")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_drag, + translate("Two-Finger Move"), + translate("Canvas Move")), + GestureInfo( + width, + GestureIcons.icon_gesture_pinch, + translate("Pinch to Zoom"), + translate("Canvas Zoom")), + ] + : [ + GestureInfo( + width, + GestureIcons.icon_Mobile_Touch, + translate("One-Finger Tap"), + translate("Left Mouse")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_tap_, + translate("Two-Finger Tap"), + translate("Right Mouse")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_swipe_right, + translate("Double Tap & Move"), + translate("Mouse Drag")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_drag_up_down_, + translate("Two-Finger vertically"), + translate("Mouse Wheel")), + GestureInfo( + width, + GestureIcons.icon_gesture_f_drag, + translate("Two-Finger Move"), + translate("Canvas Move")), + GestureInfo( + width, + GestureIcons.icon_gesture_pinch, + translate("Pinch to Zoom"), + translate("Canvas Zoom")), + ], + )), + ], + ))); + } +} + +class GestureInfo extends StatelessWidget { + const GestureInfo(this.width, this.icon, this.fromText, this.toText, + {Key? key}) + : super(key: key); + + final String fromText; + final String toText; + final IconData icon; + final double width; + + final iconSize = 35.0; + final iconColor = MyTheme.accent; + + @override + Widget build(BuildContext context) { + return Container( + width: this.width, + child: Column( + children: [ + Icon( + icon, + size: iconSize, + color: iconColor, + ), + SizedBox(height: 6), + Text(fromText, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 9, color: Colors.grey)), + SizedBox(height: 3), + Text(toText, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 12, color: Colors.black)) + ], + )); + } +} diff --git a/flutter/lib/widgets/gestures.dart b/flutter/lib/widgets/gestures.dart new file mode 100644 index 000000000..639b000f4 --- /dev/null +++ b/flutter/lib/widgets/gestures.dart @@ -0,0 +1,789 @@ +import 'dart:async'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +enum CustomTouchGestureState { + none, + oneFingerPan, + twoFingerScale, + twoFingerVerticalDrag, + twoFingerHorizontalDrag, +} + +// Adjust Carefully! balance vertical and pan +const kScaleSlop = kPrecisePointerPanSlop / 28; + +class CustomTouchGestureRecognizer extends ScaleGestureRecognizer { + CustomTouchGestureRecognizer({ + Object? debugOwner, + Set? supportedDevices, + }) : super( + debugOwner: debugOwner, + supportedDevices: supportedDevices, + ) { + _init(); + } + + // oneFingerPan + GestureDragStartCallback? onOneFingerPanStart; + GestureDragUpdateCallback? onOneFingerPanUpdate; + GestureDragEndCallback? onOneFingerPanEnd; + + // twoFingerScale : scale + pan event + GestureScaleStartCallback? onTwoFingerScaleStart; + GestureScaleUpdateCallback? onTwoFingerScaleUpdate; + GestureScaleEndCallback? onTwoFingerScaleEnd; + + // twoFingerVerticalDrag + GestureDragStartCallback? onTwoFingerVerticalDragStart; + GestureDragUpdateCallback? onTwoFingerVerticalDragUpdate; + GestureDragEndCallback? onTwoFingerVerticalDragEnd; + + // twoFingerHorizontalDrag + GestureDragStartCallback? onTwoFingerHorizontalDragStart; + GestureDragUpdateCallback? onTwoFingerHorizontalDragUpdate; + GestureDragEndCallback? onTwoFingerHorizontalDragEnd; + + void _init() { + debugPrint("CustomTouchGestureRecognizer init"); + onStart = (d) { + if (d.pointerCount == 1) { + _currentState = CustomTouchGestureState.oneFingerPan; + if (onOneFingerPanStart != null) { + onOneFingerPanStart!(DragStartDetails( + localPosition: d.localFocalPoint, globalPosition: d.focalPoint)); + } + debugPrint("start pan"); + } else if (d.pointerCount == 2) { + _currentState = CustomTouchGestureState.none; + startWatchTimer(); + } else { + _currentState = CustomTouchGestureState.none; + _reset(); + } + }; + onUpdate = (d) { + if (_isWatch) { + _updateCompute(d); + return; + } + if (_currentState != CustomTouchGestureState.none) { + switch (_currentState) { + case CustomTouchGestureState.oneFingerPan: + if (onOneFingerPanUpdate != null) { + onOneFingerPanUpdate!(_getDragUpdateDetails(d)); + } + break; + case CustomTouchGestureState.twoFingerScale: + if (onTwoFingerScaleUpdate != null) { + onTwoFingerScaleUpdate!(d); + } + break; + case CustomTouchGestureState.twoFingerHorizontalDrag: + if (onTwoFingerHorizontalDragUpdate != null) { + onTwoFingerHorizontalDragUpdate!(_getDragUpdateDetails(d)); + } + break; + case CustomTouchGestureState.twoFingerVerticalDrag: + if (onTwoFingerVerticalDragUpdate != null) { + onTwoFingerVerticalDragUpdate!(_getDragUpdateDetails(d)); + } + break; + default: + break; + } + return; + } + }; + onEnd = (d) { + debugPrint("ScaleGestureRecognizer onEnd"); + // end + switch (_currentState) { + case CustomTouchGestureState.oneFingerPan: + debugPrint("TwoFingerState.pan onEnd"); + if (onOneFingerPanEnd != null) { + onOneFingerPanEnd!(_getDragEndDetails(d)); + } + break; + case CustomTouchGestureState.twoFingerScale: + debugPrint("TwoFingerState.scale onEnd"); + if (onTwoFingerScaleEnd != null) { + onTwoFingerScaleEnd!(d); + } + break; + case CustomTouchGestureState.twoFingerHorizontalDrag: + debugPrint("TwoFingerState.horizontal onEnd"); + if (onTwoFingerHorizontalDragEnd != null) { + onTwoFingerHorizontalDragEnd!(_getDragEndDetails(d)); + } + break; + case CustomTouchGestureState.twoFingerVerticalDrag: + debugPrint("TwoFingerState.vertical onEnd"); + if (onTwoFingerVerticalDragEnd != null) { + onTwoFingerVerticalDragEnd!(_getDragEndDetails(d)); + } + break; + default: + break; + } + _currentState = CustomTouchGestureState.none; + _reset(); + }; + } + + var _currentState = CustomTouchGestureState.none; + var _isWatch = false; + + Timer? _timer; + double _sumScale = 0; + double _sumVertical = 0; + double _sumHorizontal = 0; + + void _clearSum() { + _sumScale = 0; + _sumVertical = 0; + _sumHorizontal = 0; + } + + void _reset() { + _isWatch = false; + _clearSum(); + if (_timer != null) _timer!.cancel(); + } + + void _updateCompute(ScaleUpdateDetails d) { + _sumScale += d.scale - 1; + _sumHorizontal += d.focalPointDelta.dx; + _sumVertical += d.focalPointDelta.dy; + // start , order is important + if (onTwoFingerScaleUpdate != null && _sumScale.abs() > kScaleSlop) { + debugPrint("start Scale"); + _currentState = CustomTouchGestureState.twoFingerScale; + if (onTwoFingerScaleStart != null) { + onTwoFingerScaleStart!(ScaleStartDetails( + localFocalPoint: d.localFocalPoint, focalPoint: d.focalPoint)); + } + _reset(); + } else if (onTwoFingerVerticalDragUpdate != null && + _sumVertical.abs() > kPrecisePointerPanSlop && + _sumHorizontal.abs() < kPrecisePointerPanSlop) { + debugPrint("start Vertical"); + if (onTwoFingerVerticalDragStart != null) { + onTwoFingerVerticalDragStart!(_getDragStartDetails(d)); + } + _currentState = CustomTouchGestureState.twoFingerVerticalDrag; + _reset(); + } + } + + void startWatchTimer() { + debugPrint("startWatchTimer"); + _isWatch = true; + _clearSum(); + if (_timer != null) _timer!.cancel(); + _timer = Timer(const Duration(milliseconds: 200), _reset); + } + + DragStartDetails _getDragStartDetails(ScaleUpdateDetails d) => + DragStartDetails( + globalPosition: d.focalPoint, + localPosition: d.localFocalPoint, + ); + + DragUpdateDetails _getDragUpdateDetails(ScaleUpdateDetails d) => + DragUpdateDetails( + globalPosition: d.focalPoint, + localPosition: d.localFocalPoint, + delta: d.focalPointDelta); + + DragEndDetails _getDragEndDetails(ScaleEndDetails d) => + DragEndDetails(velocity: d.velocity); +} + +class HoldTapMoveGestureRecognizer extends GestureRecognizer { + HoldTapMoveGestureRecognizer({ + Object? debugOwner, + Set? supportedDevices, + }) : super( + debugOwner: debugOwner, + supportedDevices: supportedDevices, + ); + + GestureDragStartCallback? onHoldDragStart; + GestureDragUpdateCallback? onHoldDragUpdate; + GestureDragDownCallback? onHoldDragDown; + GestureDragCancelCallback? onHoldDragCancel; + GestureDragEndCallback? onHoldDragEnd; + + bool _isStart = false; + + Timer? _firstTapUpTimer; + Timer? _secondTapDownTimer; + _TapTracker? _firstTap; + _TapTracker? _secondTap; + + final Map _trackers = {}; + + @override + bool isPointerAllowed(PointerDownEvent event) { + if (_firstTap == null) { + switch (event.buttons) { + case kPrimaryButton: + if (onHoldDragStart == null && + onHoldDragUpdate == null && + onHoldDragCancel == null && + onHoldDragEnd == null) { + return false; + } + break; + default: + return false; + } + } + return super.isPointerAllowed(event); + } + + @override + void addAllowedPointer(PointerDownEvent event) { + if (_firstTap != null) { + if (!_firstTap!.isWithinGlobalTolerance(event, kDoubleTapSlop)) { + // Ignore out-of-bounds second taps. + return; + } else if (!_firstTap!.hasElapsedMinTime() || + !_firstTap!.hasSameButton(event)) { + // Restart when the second tap is too close to the first (touch screens + // often detect touches intermittently), or when buttons mismatch. + _reset(); + return _trackTap(event); + } else if (onHoldDragDown != null) { + invokeCallback( + 'onHoldDragDown', + () => onHoldDragDown!(DragDownDetails( + globalPosition: event.position, + localPosition: event.localPosition))); + } + } + _trackTap(event); + } + + void _trackTap(PointerDownEvent event) { + _stopFirstTapUpTimer(); + _stopSecondTapDownTimer(); + final _TapTracker tracker = _TapTracker( + event: event, + entry: GestureBinding.instance!.gestureArena.add(event.pointer, this), + doubleTapMinTime: kDoubleTapMinTime, + gestureSettings: gestureSettings, + ); + _trackers[event.pointer] = tracker; + tracker.startTrackingPointer(_handleEvent, event.transform); + } + + void _handleEvent(PointerEvent event) { + final _TapTracker tracker = _trackers[event.pointer]!; + if (event is PointerUpEvent) { + if (_firstTap == null && _secondTap == null) { + _registerFirstTap(tracker); + } else if (_secondTap != null) { + if (event.pointer == _secondTap!.pointer) { + if (onHoldDragEnd != null) onHoldDragEnd!(DragEndDetails()); + } + } else { + _reject(tracker); + } + } else if (event is PointerDownEvent) { + if (_firstTap != null && _secondTap == null) { + _registerSecondTap(tracker); + } + } else if (event is PointerMoveEvent) { + if (!tracker.isWithinGlobalTolerance(event, kDoubleTapTouchSlop)) { + if (_firstTap != null && _firstTap!.pointer == event.pointer) { + // first tap move + _reject(tracker); + } else if (_secondTap != null && _secondTap!.pointer == event.pointer) { + // debugPrint("_secondTap move"); + // second tap move + if (!_isStart) { + _resolve(); + } + if (onHoldDragUpdate != null) + onHoldDragUpdate!(DragUpdateDetails( + globalPosition: event.position, + localPosition: event.localPosition, + delta: event.delta)); + } + } + } else if (event is PointerCancelEvent) { + _reject(tracker); + } + } + + @override + void acceptGesture(int pointer) {} + + @override + void rejectGesture(int pointer) { + _TapTracker? tracker = _trackers[pointer]; + // If tracker isn't in the list, check if this is the first tap tracker + if (tracker == null && _firstTap != null && _firstTap!.pointer == pointer) { + tracker = _firstTap; + } + // If tracker is still null, we rejected ourselves already + if (tracker != null) { + _reject(tracker); + } + } + + void _resolve() { + _stopSecondTapDownTimer(); + _firstTap?.entry.resolve(GestureDisposition.accepted); + _secondTap?.entry.resolve(GestureDisposition.accepted); + _isStart = true; + // TODO start details + if (onHoldDragStart != null) onHoldDragStart!(DragStartDetails()); + } + + void _reject(_TapTracker tracker) { + _checkCancel(); + + _isStart = false; + _trackers.remove(tracker.pointer); + tracker.entry.resolve(GestureDisposition.rejected); + _freezeTracker(tracker); + _reset(); + } + + @override + void dispose() { + _reset(); + super.dispose(); + } + + void _reset() { + _isStart = false; + // debugPrint("reset"); + _stopFirstTapUpTimer(); + _stopSecondTapDownTimer(); + if (_firstTap != null) { + if (_trackers.isNotEmpty) { + _checkCancel(); + } + // Note, order is important below in order for the resolve -> reject logic + // to work properly. + final _TapTracker tracker = _firstTap!; + _firstTap = null; + _reject(tracker); + GestureBinding.instance!.gestureArena.release(tracker.pointer); + + if (_secondTap != null) { + final _TapTracker tracker = _secondTap!; + _secondTap = null; + _reject(tracker); + GestureBinding.instance!.gestureArena.release(tracker.pointer); + } + } + _firstTap = null; + _secondTap = null; + _clearTrackers(); + } + + void _registerFirstTap(_TapTracker tracker) { + _startFirstTapUpTimer(); + GestureBinding.instance!.gestureArena.hold(tracker.pointer); + // Note, order is important below in order for the clear -> reject logic to + // work properly. + _freezeTracker(tracker); + _trackers.remove(tracker.pointer); + _firstTap = tracker; + } + + void _registerSecondTap(_TapTracker tracker) { + if (_firstTap != null) { + _stopFirstTapUpTimer(); + _freezeTracker(_firstTap!); + _firstTap = null; + } + + _startSecondTapDownTimer(); + GestureBinding.instance!.gestureArena.hold(tracker.pointer); + + _secondTap = tracker; + + // TODO + } + + void _clearTrackers() { + _trackers.values.toList().forEach(_reject); + assert(_trackers.isEmpty); + } + + void _freezeTracker(_TapTracker tracker) { + tracker.stopTrackingPointer(_handleEvent); + } + + void _startFirstTapUpTimer() { + _firstTapUpTimer ??= Timer(kDoubleTapTimeout, _reset); + } + + void _startSecondTapDownTimer() { + _secondTapDownTimer ??= Timer(kDoubleTapTimeout, _resolve); + } + + void _stopFirstTapUpTimer() { + if (_firstTapUpTimer != null) { + _firstTapUpTimer!.cancel(); + _firstTapUpTimer = null; + } + } + + void _stopSecondTapDownTimer() { + if (_secondTapDownTimer != null) { + _secondTapDownTimer!.cancel(); + _secondTapDownTimer = null; + } + } + + void _checkCancel() { + if (onHoldDragCancel != null) { + invokeCallback('onHoldDragCancel', onHoldDragCancel!); + } + } + + @override + String get debugDescription => 'double tap'; +} + +class DoubleFinerTapGestureRecognizer extends GestureRecognizer { + DoubleFinerTapGestureRecognizer({ + Object? debugOwner, + Set? supportedDevices, + }) : super( + debugOwner: debugOwner, + supportedDevices: supportedDevices, + ); + + GestureTapDownCallback? onDoubleFinerTapDown; + GestureTapDownCallback? onDoubleFinerTap; + GestureTapCancelCallback? onDoubleFinerTapCancel; + + Timer? _firstTapTimer; + _TapTracker? _firstTap; + + var _isStart = false; + + final Set _upTap = {}; + + final Map _trackers = {}; + + @override + bool isPointerAllowed(PointerDownEvent event) { + if (_firstTap == null) { + switch (event.buttons) { + case kPrimaryButton: + if (onDoubleFinerTapDown == null && + onDoubleFinerTap == null && + onDoubleFinerTapCancel == null) { + return false; + } + break; + default: + return false; + } + } + return super.isPointerAllowed(event); + } + + @override + void addAllowedPointer(PointerDownEvent event) { + debugPrint("addAllowedPointer"); + if (_isStart) { + // second + if (onDoubleFinerTapDown != null) { + final TapDownDetails details = TapDownDetails( + globalPosition: event.position, + localPosition: event.localPosition, + kind: getKindForPointer(event.pointer), + ); + invokeCallback( + 'onDoubleFinerTapDown', () => onDoubleFinerTapDown!(details)); + } + } else { + // first tap + _isStart = true; + _startFirstTapDownTimer(); + } + _trackTap(event); + } + + void _trackTap(PointerDownEvent event) { + final _TapTracker tracker = _TapTracker( + event: event, + entry: GestureBinding.instance!.gestureArena.add(event.pointer, this), + doubleTapMinTime: kDoubleTapMinTime, + gestureSettings: gestureSettings, + ); + _trackers[event.pointer] = tracker; + // debugPrint("_trackers:$_trackers"); + tracker.startTrackingPointer(_handleEvent, event.transform); + + _registerTap(tracker); + } + + void _handleEvent(PointerEvent event) { + final _TapTracker tracker = _trackers[event.pointer]!; + if (event is PointerUpEvent) { + debugPrint("PointerUpEvent"); + _upTap.add(tracker.pointer); + } else if (event is PointerMoveEvent) { + if (!tracker.isWithinGlobalTolerance(event, kDoubleTapTouchSlop)) + _reject(tracker); + } else if (event is PointerCancelEvent) { + _reject(tracker); + } + } + + @override + void acceptGesture(int pointer) {} + + @override + void rejectGesture(int pointer) { + _TapTracker? tracker = _trackers[pointer]; + // If tracker isn't in the list, check if this is the first tap tracker + if (tracker == null && _firstTap != null && _firstTap!.pointer == pointer) { + tracker = _firstTap; + } + // If tracker is still null, we rejected ourselves already + if (tracker != null) { + _reject(tracker); + } + } + + void _reject(_TapTracker tracker) { + _trackers.remove(tracker.pointer); + tracker.entry.resolve(GestureDisposition.rejected); + _freezeTracker(tracker); + if (_firstTap != null) { + if (tracker == _firstTap) { + _reset(); + } else { + _checkCancel(); + if (_trackers.isEmpty) { + _reset(); + } + } + } + } + + @override + void dispose() { + _reset(); + super.dispose(); + } + + void _reset() { + _stopFirstTapUpTimer(); + _firstTap = null; + _clearTrackers(); + } + + void _registerTap(_TapTracker tracker) { + GestureBinding.instance!.gestureArena.hold(tracker.pointer); + // Note, order is important below in order for the clear -> reject logic to + // work properly. + } + + void _clearTrackers() { + _trackers.values.toList().forEach(_reject); + assert(_trackers.isEmpty); + } + + void _freezeTracker(_TapTracker tracker) { + tracker.stopTrackingPointer(_handleEvent); + } + + void _startFirstTapDownTimer() { + _firstTapTimer ??= Timer(kDoubleTapTimeout, _timeoutCheck); + } + + void _stopFirstTapUpTimer() { + if (_firstTapTimer != null) { + _firstTapTimer!.cancel(); + _firstTapTimer = null; + } + } + + void _timeoutCheck() { + _isStart = false; + if (_upTap.length == 2) { + _resolve(); + } else { + _reset(); + } + _upTap.clear(); + } + + void _resolve() { + // TODO tap down details + if (onDoubleFinerTap != null) onDoubleFinerTap!(TapDownDetails()); + _trackers.forEach((key, value) { + value.entry.resolve(GestureDisposition.accepted); + }); + _reset(); + } + + void _checkCancel() { + if (onDoubleFinerTapCancel != null) { + invokeCallback('onHoldDragCancel', onDoubleFinerTapCancel!); + } + } + + @override + String get debugDescription => 'double tap'; +} + +/// TapTracker helps track individual tap sequences as part of a +/// larger gesture. +class _TapTracker { + _TapTracker({ + required PointerDownEvent event, + required this.entry, + required Duration doubleTapMinTime, + required this.gestureSettings, + }) : assert(doubleTapMinTime != null), + assert(event != null), + assert(event.buttons != null), + pointer = event.pointer, + _initialGlobalPosition = event.position, + initialButtons = event.buttons, + _doubleTapMinTimeCountdown = + _CountdownZoned(duration: doubleTapMinTime); + + final DeviceGestureSettings? gestureSettings; + final int pointer; + final GestureArenaEntry entry; + final Offset _initialGlobalPosition; + final int initialButtons; + final _CountdownZoned _doubleTapMinTimeCountdown; + + bool _isTrackingPointer = false; + + void startTrackingPointer(PointerRoute route, Matrix4? transform) { + if (!_isTrackingPointer) { + _isTrackingPointer = true; + GestureBinding.instance!.pointerRouter + .addRoute(pointer, route, transform); + } + } + + void stopTrackingPointer(PointerRoute route) { + if (_isTrackingPointer) { + _isTrackingPointer = false; + GestureBinding.instance!.pointerRouter.removeRoute(pointer, route); + } + } + + bool isWithinGlobalTolerance(PointerEvent event, double tolerance) { + final Offset offset = event.position - _initialGlobalPosition; + return offset.distance <= tolerance; + } + + bool hasElapsedMinTime() { + return _doubleTapMinTimeCountdown.timeout; + } + + bool hasSameButton(PointerDownEvent event) { + return event.buttons == initialButtons; + } +} + +/// CountdownZoned tracks whether the specified duration has elapsed since +/// creation, honoring [Zone]. +class _CountdownZoned { + _CountdownZoned({required Duration duration}) : assert(duration != null) { + Timer(duration, _onTimeout); + } + + bool _timeout = false; + + bool get timeout => _timeout; + + void _onTimeout() { + _timeout = true; + } +} + +RawGestureDetector getMixinGestureDetector({ + Widget? child, + GestureTapUpCallback? onTapUp, + GestureTapDownCallback? onDoubleTapDown, + GestureDoubleTapCallback? onDoubleTap, + GestureLongPressDownCallback? onLongPressDown, + GestureLongPressCallback? onLongPress, + GestureDragStartCallback? onHoldDragStart, + GestureDragUpdateCallback? onHoldDragUpdate, + GestureDragCancelCallback? onHoldDragCancel, + GestureDragEndCallback? onHoldDragEnd, + GestureTapDownCallback? onDoubleFinerTap, + GestureDragStartCallback? onOneFingerPanStart, + GestureDragUpdateCallback? onOneFingerPanUpdate, + GestureDragEndCallback? onOneFingerPanEnd, + GestureScaleUpdateCallback? onTwoFingerScaleUpdate, + GestureScaleEndCallback? onTwoFingerScaleEnd, + GestureDragUpdateCallback? onTwoFingerHorizontalDragUpdate, + GestureDragUpdateCallback? onTwoFingerVerticalDragUpdate, + GestureDragStartCallback? onTwoFingerPanStart, + GestureDragUpdateCallback? onTwoFingerPanUpdate, +}) { + return RawGestureDetector( + child: child, + gestures: { + // Official + TapGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => TapGestureRecognizer(), (instance) { + instance.onTapUp = onTapUp; + }), + DoubleTapGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => DoubleTapGestureRecognizer(), (instance) { + instance + ..onDoubleTapDown = onDoubleTapDown + ..onDoubleTap = onDoubleTap; + }), + LongPressGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => LongPressGestureRecognizer(), (instance) { + instance + ..onLongPressDown = onLongPressDown + ..onLongPress = onLongPress; + }), + // Customized + HoldTapMoveGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => HoldTapMoveGestureRecognizer(), + (instance) => { + instance + ..onHoldDragStart = onHoldDragStart + ..onHoldDragUpdate = onHoldDragUpdate + ..onHoldDragCancel = onHoldDragCancel + ..onHoldDragEnd = onHoldDragEnd + }), + DoubleFinerTapGestureRecognizer: GestureRecognizerFactoryWithHandlers< + DoubleFinerTapGestureRecognizer>( + () => DoubleFinerTapGestureRecognizer(), (instance) { + instance.onDoubleFinerTap = onDoubleFinerTap; + }), + CustomTouchGestureRecognizer: + GestureRecognizerFactoryWithHandlers( + () => CustomTouchGestureRecognizer(), (instance) { + instance + ..onOneFingerPanStart = onOneFingerPanStart + ..onOneFingerPanUpdate = onOneFingerPanUpdate + ..onOneFingerPanEnd = onOneFingerPanEnd + ..onTwoFingerScaleUpdate = onTwoFingerScaleUpdate + ..onTwoFingerScaleEnd = onTwoFingerScaleEnd + ..onTwoFingerHorizontalDragUpdate = onTwoFingerHorizontalDragUpdate + ..onTwoFingerVerticalDragUpdate = onTwoFingerVerticalDragUpdate; + }) + }); +} diff --git a/flutter/lib/widgets/overlay.dart b/flutter/lib/widgets/overlay.dart new file mode 100644 index 000000000..8861321eb --- /dev/null +++ b/flutter/lib/widgets/overlay.dart @@ -0,0 +1,378 @@ +import 'package:draggable_float_widget/draggable_float_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; + +import '../models/model.dart'; +import '../pages/chat_page.dart'; + +OverlayEntry? chatIconOverlayEntry; +OverlayEntry? chatWindowOverlayEntry; + +OverlayEntry? mobileActionsOverlayEntry; + +class DraggableChatWindow extends StatelessWidget { + DraggableChatWindow( + {this.position = Offset.zero, required this.width, required this.height}); + + final Offset position; + final double width; + final double height; + + @override + Widget build(BuildContext context) { + return Draggable( + checkKeyboard: true, + position: position, + width: width, + height: height, + builder: (_, onPanUpdate) { + return isIOS + ? chatPage + : Scaffold( + resizeToAvoidBottomInset: false, + appBar: CustomAppBar( + onPanUpdate: onPanUpdate, + appBar: Container( + color: MyTheme.accent50, + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Text( + translate("Chat"), + style: TextStyle( + color: Colors.white, + fontFamily: 'WorkSans', + fontWeight: FontWeight.bold, + fontSize: 20), + )), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IconButton( + onPressed: () { + hideChatWindowOverlay(); + }, + icon: Icon(Icons.keyboard_arrow_down)), + IconButton( + onPressed: () { + hideChatWindowOverlay(); + hideChatIconOverlay(); + }, + icon: Icon(Icons.close)) + ], + ) + ], + ), + ), + ), + body: chatPage, + ); + }); + } +} + +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + final GestureDragUpdateCallback onPanUpdate; + final Widget appBar; + + const CustomAppBar( + {Key? key, required this.onPanUpdate, required this.appBar}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return GestureDetector(onPanUpdate: onPanUpdate, child: appBar); + } + + @override + Size get preferredSize => new Size.fromHeight(kToolbarHeight); +} + +showChatIconOverlay({Offset offset = const Offset(200, 50)}) { + if (chatIconOverlayEntry != null) { + chatIconOverlayEntry!.remove(); + } + if (globalKey.currentState == null || globalKey.currentState!.overlay == null) + return; + final globalOverlayState = globalKey.currentState!.overlay!; + + final overlay = OverlayEntry(builder: (context) { + return DraggableFloatWidget( + config: DraggableFloatWidgetBaseConfig( + initPositionYInTop: false, + initPositionYMarginBorder: 100, + borderTopContainTopBar: true, + ), + child: FloatingActionButton( + onPressed: () { + if (chatWindowOverlayEntry == null) { + showChatWindowOverlay(); + } else { + hideChatWindowOverlay(); + } + }, + child: Icon(Icons.message))); + }); + globalOverlayState.insert(overlay); + chatIconOverlayEntry = overlay; + debugPrint("created"); +} + +hideChatIconOverlay() { + if (chatIconOverlayEntry != null) { + chatIconOverlayEntry!.remove(); + chatIconOverlayEntry = null; + } +} + +showChatWindowOverlay() { + if (chatWindowOverlayEntry != null) return; + if (globalKey.currentState == null || globalKey.currentState!.overlay == null) + return; + final globalOverlayState = globalKey.currentState!.overlay!; + + final overlay = OverlayEntry(builder: (context) { + return DraggableChatWindow( + position: Offset(20, 80), width: 250, height: 350); + }); + globalOverlayState.insert(overlay); + chatWindowOverlayEntry = overlay; + debugPrint("chatEntry created"); +} + +hideChatWindowOverlay() { + if (chatWindowOverlayEntry != null) { + chatWindowOverlayEntry!.remove(); + chatWindowOverlayEntry = null; + return; + } +} + +toggleChatOverlay() { + if (chatIconOverlayEntry == null || chatWindowOverlayEntry == null) { + FFI.invokeMethod("enable_soft_keyboard", true); + showChatIconOverlay(); + showChatWindowOverlay(); + } else { + hideChatIconOverlay(); + hideChatWindowOverlay(); + } +} + +/// floating buttons of back/home/recent actions for android +class DraggableMobileActions extends StatelessWidget { + DraggableMobileActions( + {this.position = Offset.zero, + this.onBackPressed, + this.onRecentPressed, + this.onHomePressed, + required this.width, + required this.height}); + + final Offset position; + final double width; + final double height; + final VoidCallback? onBackPressed; + final VoidCallback? onHomePressed; + final VoidCallback? onRecentPressed; + + @override + Widget build(BuildContext context) { + return Draggable( + position: position, + width: width, + height: height, + builder: (_, onPanUpdate) { + return GestureDetector( + onPanUpdate: onPanUpdate, + child: Container( + decoration: BoxDecoration( + color: MyTheme.accent.withOpacity(0.4), + borderRadius: BorderRadius.all(Radius.circular(15))), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + IconButton( + color: MyTheme.white, + onPressed: onBackPressed, + icon: Icon(Icons.arrow_back)), + IconButton( + color: MyTheme.white, + onPressed: onHomePressed, + icon: Icon(Icons.home)), + IconButton( + color: MyTheme.white, + onPressed: onRecentPressed, + icon: Icon(Icons.more_horiz)), + VerticalDivider( + width: 0, + thickness: 2, + indent: 10, + endIndent: 10, + ), + IconButton( + color: MyTheme.white, + onPressed: hideMobileActionsOverlay, + icon: Icon(Icons.keyboard_arrow_down)), + ], + ), + )); + }); + } +} + +showMobileActionsOverlay() { + if (mobileActionsOverlayEntry != null) return; + if (globalKey.currentContext == null || + globalKey.currentState == null || + globalKey.currentState!.overlay == null) return; + final globalOverlayState = globalKey.currentState!.overlay!; + + // compute overlay position + final screenW = MediaQuery.of(globalKey.currentContext!).size.width; + final screenH = MediaQuery.of(globalKey.currentContext!).size.height; + final double overlayW = 200; + final double overlayH = 45; + final left = (screenW - overlayW) / 2; + final top = screenH - overlayH - 60; + debugPrint("left top : $left,$top"); + + final overlay = OverlayEntry(builder: (context) { + return DraggableMobileActions( + position: Offset(left, top), + width: overlayW, + height: overlayH, + onBackPressed: () => FFI.tap(MouseButtons.right), + onHomePressed: () => FFI.tap(MouseButtons.wheel), + onRecentPressed: () async { + FFI.sendMouse('down', MouseButtons.wheel); + await Future.delayed(Duration(milliseconds: 500)); + FFI.sendMouse('up', MouseButtons.wheel); + }, + ); + }); + globalOverlayState.insert(overlay); + mobileActionsOverlayEntry = overlay; + debugPrint("mobileActionsOverlay created"); +} + +hideMobileActionsOverlay() { + if (mobileActionsOverlayEntry != null) { + mobileActionsOverlayEntry!.remove(); + mobileActionsOverlayEntry = null; + return; + } +} + +class Draggable extends StatefulWidget { + Draggable( + {this.checkKeyboard = false, + this.checkScreenSize = false, + this.position = Offset.zero, + required this.width, + required this.height, + required this.builder}); + + final bool checkKeyboard; + final bool checkScreenSize; + final Offset position; + final double width; + final double height; + final Widget Function(BuildContext, GestureDragUpdateCallback) builder; + + @override + State createState() => _DraggableState(); +} + +class _DraggableState extends State { + late Offset _position; + bool _keyboardVisible = false; + double _saveHeight = 0; + double _lastBottomHeight = 0; + + @override + void initState() { + super.initState(); + _position = widget.position; + } + + void onPanUpdate(DragUpdateDetails d) { + final offset = d.delta; + final size = MediaQuery.of(context).size; + double x = 0; + double y = 0; + + if (_position.dx + offset.dx + widget.width > size.width) { + x = size.width - widget.width; + } else if (_position.dx + offset.dx < 0) { + x = 0; + } else { + x = _position.dx + offset.dx; + } + + if (_position.dy + offset.dy + widget.height > size.height) { + y = size.height - widget.height; + } else if (_position.dy + offset.dy < 0) { + y = 0; + } else { + y = _position.dy + offset.dy; + } + setState(() { + _position = Offset(x, y); + }); + } + + checkScreenSize() {} + + checkKeyboard() { + final bottomHeight = MediaQuery.of(context).viewInsets.bottom; + final currentVisible = bottomHeight != 0; + + debugPrint(bottomHeight.toString() + currentVisible.toString()); + // save + if (!_keyboardVisible && currentVisible) { + _saveHeight = _position.dy; + } + + // reset + if (_lastBottomHeight > 0 && bottomHeight == 0) { + setState(() { + _position = Offset(_position.dx, _saveHeight); + }); + } + + // onKeyboardVisible + if (_keyboardVisible && currentVisible) { + final sumHeight = bottomHeight + widget.height; + final contextHeight = MediaQuery.of(context).size.height; + if (sumHeight + _position.dy > contextHeight) { + final y = contextHeight - sumHeight; + setState(() { + _position = Offset(_position.dx, y); + }); + } + } + + _keyboardVisible = currentVisible; + _lastBottomHeight = bottomHeight; + } + + @override + Widget build(BuildContext context) { + if (widget.checkKeyboard) { + checkKeyboard(); + } + if (widget.checkKeyboard) { + checkScreenSize(); + } + return Positioned( + top: _position.dy, + left: _position.dx, + width: widget.width, + height: widget.height, + child: widget.builder(context, onPanUpdate)); + } +} diff --git a/flutter/ndk_arm64.sh b/flutter/ndk_arm64.sh new file mode 100755 index 000000000..d28009f6c --- /dev/null +++ b/flutter/ndk_arm64.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +cargo ndk --platform 21 --target aarch64-linux-android build --release diff --git a/flutter/ndk_x64.sh b/flutter/ndk_x64.sh new file mode 100755 index 000000000..6272b0390 --- /dev/null +++ b/flutter/ndk_x64.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +cargo ndk --platform 21 --target x86_64-linux-android build --release diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock new file mode 100644 index 000000000..825bd92a0 --- /dev/null +++ b/flutter/pubspec.lock @@ -0,0 +1,742 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.2" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + cross_file: + dependency: transitive + description: + name: cross_file + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + dash_chat: + dependency: "direct main" + description: + name: dash_chat + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.16" + device_info: + dependency: "direct main" + description: + name: device_info + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + device_info_platform_interface: + dependency: transitive + description: + name: device_info_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + draggable_float_widget: + dependency: "direct main" + description: + name: draggable_float_widget + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2" + event_bus: + dependency: transitive + description: + name: event_bus + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + external_path: + dependency: "direct main" + description: + name: external_path + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + ffi: + dependency: "direct main" + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + firebase_analytics: + dependency: "direct main" + description: + name: firebase_analytics + url: "https://pub.dartlang.org" + source: hosted + version: "9.1.5" + firebase_analytics_platform_interface: + dependency: transitive + description: + name: firebase_analytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + firebase_analytics_web: + dependency: transitive + description: + name: firebase_analytics_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0+10" + firebase_core: + dependency: transitive + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.1" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.5" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_breadcrumb: + dependency: "direct main" + description: + name: flutter_breadcrumb + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.2" + flutter_parsed_text: + dependency: transitive + description: + name: flutter_parsed_text + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + flutter_smart_dialog: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: c89ce60664cbc206cb98c1f407e86b8a766f4c0e + url: "https://github.com/Heap-Hop/flutter_smart_dialog.git" + source: git + version: "4.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + image: + dependency: "direct main" + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.5" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.4+11" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.4+11" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.4" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + package_info: + dependency: "direct main" + description: + name: package_info + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.12" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" + qr_code_scanner: + dependency: "direct main" + description: + name: qr_code_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1+1" + settings_ui: + dependency: "direct main" + description: + name: settings_ui + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.8" + toggle_switch: + dependency: "direct main" + description: + name: toggle_switch + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + transparent_image: + dependency: transitive + description: + name: transparent_image + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + tuple: + dependency: "direct main" + description: + name: tuple + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.20" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.15" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.15" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + wakelock: + dependency: "direct main" + description: + name: wakelock + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.6" + wakelock_macos: + dependency: transitive + description: + name: wakelock_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + wakelock_platform_interface: + dependency: transitive + description: + name: wakelock_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" + wakelock_web: + dependency: transitive + description: + name: wakelock_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + wakelock_windows: + dependency: transitive + description: + name: wakelock_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + zxing2: + dependency: "direct main" + description: + name: zxing2 + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" +sdks: + dart: ">=2.16.0 <3.0.0" + flutter: ">=2.10.0" diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml new file mode 100644 index 000000000..8fb5ef289 --- /dev/null +++ b/flutter/pubspec.yaml @@ -0,0 +1,111 @@ +name: flutter_hbb +description: Your Remote Desktop Software + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.1.9+24 + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.3 + ffi: ^1.1.2 + path_provider: ^2.0.2 + external_path: ^1.0.1 + provider: ^5.0.0 + tuple: ^2.0.0 + wakelock: ^0.5.2 + device_info: ^2.0.2 + firebase_analytics: ^9.1.5 + package_info: ^2.0.2 + url_launcher: ^6.0.9 + shared_preferences: ^2.0.6 + toggle_switch: ^1.4.0 + dash_chat: ^1.1.16 + draggable_float_widget: ^0.0.2 + settings_ui: ^2.0.2 + flutter_breadcrumb: ^1.0.1 + http: ^0.13.4 + qr_code_scanner: ^0.7.0 + zxing2: ^0.1.0 + image_picker: ^0.8.5 + image: ^3.1.3 + flutter_smart_dialog: + git: + url: https://github.com/Heap-Hop/flutter_smart_dialog.git + +dev_dependencies: + flutter_launcher_icons: ^0.9.1 + flutter_test: + sdk: flutter + +# rerun: flutter pub run flutter_launcher_icons:main +flutter_icons: + android: "ic_launcher" + ios: true + image_path: "../1024-rec.png" + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - assets/ + + fonts: + - family: GestureIcons + fonts: + - asset: assets/gestures.ttf + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/flutter/test/widget_test.dart b/flutter/test/widget_test.dart new file mode 100644 index 000000000..3e7534740 --- /dev/null +++ b/flutter/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:flutter_hbb/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(App()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/flutter/web/assets/favicon.71be6127.svg b/flutter/web/assets/favicon.71be6127.svg new file mode 100644 index 000000000..0234ca69e --- /dev/null +++ b/flutter/web/assets/favicon.71be6127.svg @@ -0,0 +1 @@ + diff --git a/flutter/web/assets/firebase-analytics.js b/flutter/web/assets/firebase-analytics.js new file mode 100644 index 000000000..9b9a02b09 --- /dev/null +++ b/flutter/web/assets/firebase-analytics.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("@firebase/app")):"function"==typeof define&&define.amd?define(["@firebase/app"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).firebase)}(this,function(mt){"use strict";try{!function(){function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=e(mt),r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var s=function(){return(s=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function u(e,t){for(var n=0,r=t.length,i=e.length;n"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new f(o,e,i)},n);function n(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var y=/\{\$([^}]+)}/g,b=1e3,w=2,I=144e5,_=.5;function E(e,t,n){void 0===n&&(n=w);n=(t=void 0===t?b:t)*Math.pow(n,e),e=Math.round(_*n*(Math.random()-.5)*2);return Math.min(I,n+e)}var T=(S.prototype.setInstantiationMode=function(e){return this.instantiationMode=e,this},S.prototype.setMultipleInstances=function(e){return this.multipleInstances=e,this},S.prototype.setServiceProps=function(e){return this.serviceProps=e,this},S.prototype.setInstanceCreatedCallback=function(e){return this.onInstanceCreated=e,this},S);function S(e,t,n){this.name=e,this.instanceFactory=t,this.type=n,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}function C(n){return new Promise(function(e,t){n.onsuccess=function(){e(n.result)},n.onerror=function(){t(n.error)}})}function O(n,r,i){var o,e=new Promise(function(e,t){C(o=n[r].apply(n,i)).then(e,t)});return e.request=o,e}function N(e,n,t){t.forEach(function(t){Object.defineProperty(e.prototype,t,{get:function(){return this[n][t]},set:function(e){this[n][t]=e}})})}function D(t,n,r,e){e.forEach(function(e){e in r.prototype&&(t.prototype[e]=function(){return O(this[n],e,arguments)})})}function P(t,n,r,e){e.forEach(function(e){e in r.prototype&&(t.prototype[e]=function(){return this[n][e].apply(this[n],arguments)})})}function A(e,r,t,n){n.forEach(function(n){n in t.prototype&&(e.prototype[n]=function(){return e=this[r],(t=O(e,n,arguments)).then(function(e){if(e)return new k(e,t.request)});var e,t})})}function x(e){this._index=e}function k(e,t){this._cursor=e,this._request=t}function j(e){this._store=e}function L(n){this._tx=n,this.complete=new Promise(function(e,t){n.oncomplete=function(){e()},n.onerror=function(){t(n.error)},n.onabort=function(){t(n.error)}})}function R(e,t,n){this._db=e,this.oldVersion=t,this.transaction=new L(n)}function F(e){this._db=e}N(x,"_index",["name","keyPath","multiEntry","unique"]),D(x,"_index",IDBIndex,["get","getKey","getAll","getAllKeys","count"]),A(x,"_index",IDBIndex,["openCursor","openKeyCursor"]),N(k,"_cursor",["direction","key","primaryKey","value"]),D(k,"_cursor",IDBCursor,["update","delete"]),["advance","continue","continuePrimaryKey"].forEach(function(n){n in IDBCursor.prototype&&(k.prototype[n]=function(){var t=this,e=arguments;return Promise.resolve().then(function(){return t._cursor[n].apply(t._cursor,e),C(t._request).then(function(e){if(e)return new k(e,t._request)})})})}),j.prototype.createIndex=function(){return new x(this._store.createIndex.apply(this._store,arguments))},j.prototype.index=function(){return new x(this._store.index.apply(this._store,arguments))},N(j,"_store",["name","keyPath","indexNames","autoIncrement"]),D(j,"_store",IDBObjectStore,["put","add","delete","clear","get","getAll","getKey","getAllKeys","count"]),A(j,"_store",IDBObjectStore,["openCursor","openKeyCursor"]),P(j,"_store",IDBObjectStore,["deleteIndex"]),L.prototype.objectStore=function(){return new j(this._tx.objectStore.apply(this._tx,arguments))},N(L,"_tx",["objectStoreNames","mode"]),P(L,"_tx",IDBTransaction,["abort"]),R.prototype.createObjectStore=function(){return new j(this._db.createObjectStore.apply(this._db,arguments))},N(R,"_db",["name","version","objectStoreNames"]),P(R,"_db",IDBDatabase,["deleteObjectStore","close"]),F.prototype.transaction=function(){return new L(this._db.transaction.apply(this._db,arguments))},N(F,"_db",["name","version","objectStoreNames"]),P(F,"_db",IDBDatabase,["close"]),["openCursor","openKeyCursor"].forEach(function(i){[j,x].forEach(function(e){i in e.prototype&&(e.prototype[i.replace("open","iterate")]=function(){var e=(n=arguments,Array.prototype.slice.call(n)),t=e[e.length-1],n=this._store||this._index,r=n[i].apply(n,e.slice(0,-1));r.onsuccess=function(){t(r.result)}})})}),[x,j].forEach(function(e){e.prototype.getAll||(e.prototype.getAll=function(e,n){var r=this,i=[];return new Promise(function(t){r.iterateCursor(e,function(e){e?(i.push(e.value),void 0===n||i.length!=n?e.continue():t(i)):t(i)})})})});var M="0.4.32",B=1e4,H="w:"+M,q="FIS_v2",V="https://firebaseinstallations.googleapis.com/v1",G=36e5,K=((Re={})["missing-app-config-values"]='Missing App configuration value: "{$valueName}"',Re["not-registered"]="Firebase Installation is not registered.",Re["installation-not-found"]="Firebase Installation not found.",Re["request-failed"]='{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',Re["app-offline"]="Could not process request. Application offline.",Re["delete-pending-registration"]="Can't delete installation while there is a pending registration request.",Re),U=new m("installations","Installations",K);function W(e){return e instanceof f&&e.code.includes("request-failed")}function $(e){e=e.projectId;return V+"/projects/"+e+"/installations"}function z(e){return{token:e.token,requestStatus:2,expiresIn:(e=e.expiresIn,Number(e.replace("s","000"))),creationTime:Date.now()}}function J(n,r){return p(this,void 0,void 0,function(){var t;return h(this,function(e){switch(e.label){case 0:return[4,r.json()];case 1:return t=e.sent(),t=t.error,[2,U.create("request-failed",{requestName:n,serverCode:t.code,serverMessage:t.message,serverStatus:t.status})]}})})}function Y(e){e=e.apiKey;return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function X(e,t){t=t.refreshToken,e=Y(e);return e.append("Authorization",q+" "+t),e}function Z(n){return p(this,void 0,void 0,function(){var t;return h(this,function(e){switch(e.label){case 0:return[4,n()];case 1:return 500<=(t=e.sent()).status&&t.status<600?[2,n()]:[2,t]}})})}function Q(t){return new Promise(function(e){setTimeout(e,t)})}function ee(e){return btoa(String.fromCharCode.apply(String,u([],function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0a[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new c(o,e,i)},v);function v(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var m=/\{\$([^}]+)}/g;function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){t=new b(e,t);return t.subscribe.bind(t)}var b=(I.prototype.next=function(t){this.forEachObserver(function(e){e.next(t)})},I.prototype.error=function(t){this.forEachObserver(function(e){e.error(t)}),this.close(t)},I.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},I.prototype.subscribe=function(e,t,n){var r,i=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n=(null!=o?o:e.logLevel)&&a({level:R[t].toLowerCase(),message:i,args:n,type:e.name})}}(n[e])}var H=((H={})["no-app"]="No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()",H["bad-app-name"]="Illegal App name: '{$appName}",H["duplicate-app"]="Firebase App named '{$appName}' already exists",H["app-deleted"]="Firebase App named '{$appName}' already deleted",H["invalid-app-argument"]="firebase.{$appName}() takes either no argument or a Firebase App instance.",H["invalid-log-argument"]="First argument to `onLog` must be null or a function.",H),V=new d("app","Firebase",H),B="@firebase/app",M="[DEFAULT]",U=((H={})[B]="fire-core",H["@firebase/analytics"]="fire-analytics",H["@firebase/app-check"]="fire-app-check",H["@firebase/auth"]="fire-auth",H["@firebase/database"]="fire-rtdb",H["@firebase/functions"]="fire-fn",H["@firebase/installations"]="fire-iid",H["@firebase/messaging"]="fire-fcm",H["@firebase/performance"]="fire-perf",H["@firebase/remote-config"]="fire-rc",H["@firebase/storage"]="fire-gcs",H["@firebase/firestore"]="fire-fst",H["fire-js"]="fire-js",H["firebase-wrapper"]="fire-js-all",H),W=new z("@firebase/app"),G=(Object.defineProperty($.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this.automaticDataCollectionEnabled_},set:function(e){this.checkDestroyed_(),this.automaticDataCollectionEnabled_=e},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!1,configurable:!0}),$.prototype.delete=function(){var t=this;return new Promise(function(e){t.checkDestroyed_(),e()}).then(function(){return t.firebase_.INTERNAL.removeApp(t.name_),Promise.all(t.container.getProviders().map(function(e){return e.delete()}))}).then(function(){t.isDeleted_=!0})},$.prototype._getService=function(e,t){void 0===t&&(t=M),this.checkDestroyed_();var n=this.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(e=n.getComponent())||void 0===e?void 0:e.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})},$.prototype._removeServiceInstance=function(e,t){void 0===t&&(t=M),this.container.getProvider(e).clearInstance(t)},$.prototype._addComponent=function(t){try{this.container.addComponent(t)}catch(e){W.debug("Component "+t.name+" failed to register with FirebaseApp "+this.name,e)}},$.prototype._addOrOverwriteComponent=function(e){this.container.addOrOverwriteComponent(e)},$.prototype.toJSON=function(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}},$.prototype.checkDestroyed_=function(){if(this.isDeleted_)throw V.create("app-deleted",{appName:this.name_})},$);function $(e,t,n){var r=this;this.firebase_=n,this.isDeleted_=!1,this.name_=t.name,this.automaticDataCollectionEnabled_=t.automaticDataCollectionEnabled||!1,this.options_=h(void 0,e),this.container=new S(t.name),this._addComponent(new O("app",function(){return r},"PUBLIC")),this.firebase_.INTERNAL.components.forEach(function(e){return r._addComponent(e)})}G.prototype.name&&G.prototype.options||G.prototype.delete||console.log("dc");var K="8.10.1";function Y(a){var s={},l=new Map,c={__esModule:!0,initializeApp:function(e,t){void 0===t&&(t={});"object"==typeof t&&null!==t||(t={name:t});var n=t;void 0===n.name&&(n.name=M);t=n.name;if("string"!=typeof t||!t)throw V.create("bad-app-name",{appName:String(t)});if(y(s,t))throw V.create("duplicate-app",{appName:t});n=new a(e,n,c);return s[t]=n},app:u,registerVersion:function(e,t,n){var r=null!==(i=U[e])&&void 0!==i?i:e;n&&(r+="-"+n);var i=r.match(/\s|\//),e=t.match(/\s|\//);i||e?(n=['Unable to register library "'+r+'" with version "'+t+'":'],i&&n.push('library name "'+r+'" contains illegal characters (whitespace or "/")'),i&&e&&n.push("and"),e&&n.push('version name "'+t+'" contains illegal characters (whitespace or "/")'),W.warn(n.join(" "))):o(new O(r+"-version",function(){return{library:r,version:t}},"VERSION"))},setLogLevel:T,onLog:function(e,t){if(null!==e&&"function"!=typeof e)throw V.create("invalid-log-argument");x(e,t)},apps:null,SDK_VERSION:K,INTERNAL:{registerComponent:o,removeApp:function(e){delete s[e]},components:l,useAsService:function(e,t){return"serverAuth"!==t?t:null}}};function u(e){if(!y(s,e=e||M))throw V.create("no-app",{appName:e});return s[e]}function o(n){var e,r=n.name;if(l.has(r))return W.debug("There were multiple attempts to register component "+r+"."),"PUBLIC"===n.type?c[r]:null;l.set(r,n),"PUBLIC"===n.type&&(e=function(e){if("function"!=typeof(e=void 0===e?u():e)[r])throw V.create("invalid-app-argument",{appName:r});return e[r]()},void 0!==n.serviceProps&&h(e,n.serviceProps),c[r]=e,a.prototype[r]=function(){for(var e=[],t=0;tu in e?vi(e,u,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[u]=r;var _=(e,u,r)=>(Ei(e,typeof u!="symbol"?u+"":u,r),r);import{m as o,l as $e,s as hi,Q as mi,a as Fi,b as Nu,P as Di}from"./vendor.32e42528.js";const Ai=function(){const u=document.createElement("link").relList;if(u&&u.supports&&u.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const t of i)if(t.type==="childList")for(const s of t.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function r(i){const t={};return i.integrity&&(t.integrity=i.integrity),i.referrerpolicy&&(t.referrerPolicy=i.referrerpolicy),i.crossorigin==="use-credentials"?t.credentials="include":i.crossorigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function n(i){if(i.ep)return;i.ep=!0;const t=r(i);fetch(i.href,t)}};Ai();var y;(function(e){e[e.Unknown=0]="Unknown",e[e.Alt=1]="Alt",e[e.Backspace=2]="Backspace",e[e.CapsLock=3]="CapsLock",e[e.Control=4]="Control",e[e.Delete=5]="Delete",e[e.DownArrow=6]="DownArrow",e[e.End=7]="End",e[e.Escape=8]="Escape",e[e.F1=9]="F1",e[e.F10=10]="F10",e[e.F11=11]="F11",e[e.F12=12]="F12",e[e.F2=13]="F2",e[e.F3=14]="F3",e[e.F4=15]="F4",e[e.F5=16]="F5",e[e.F6=17]="F6",e[e.F7=18]="F7",e[e.F8=19]="F8",e[e.F9=20]="F9",e[e.Home=21]="Home",e[e.LeftArrow=22]="LeftArrow",e[e.Meta=23]="Meta",e[e.Option=24]="Option",e[e.PageDown=25]="PageDown",e[e.PageUp=26]="PageUp",e[e.Return=27]="Return",e[e.RightArrow=28]="RightArrow",e[e.Shift=29]="Shift",e[e.Space=30]="Space",e[e.Tab=31]="Tab",e[e.UpArrow=32]="UpArrow",e[e.Numpad0=33]="Numpad0",e[e.Numpad1=34]="Numpad1",e[e.Numpad2=35]="Numpad2",e[e.Numpad3=36]="Numpad3",e[e.Numpad4=37]="Numpad4",e[e.Numpad5=38]="Numpad5",e[e.Numpad6=39]="Numpad6",e[e.Numpad7=40]="Numpad7",e[e.Numpad8=41]="Numpad8",e[e.Numpad9=42]="Numpad9",e[e.Cancel=43]="Cancel",e[e.Clear=44]="Clear",e[e.Menu=45]="Menu",e[e.Pause=46]="Pause",e[e.Kana=47]="Kana",e[e.Hangul=48]="Hangul",e[e.Junja=49]="Junja",e[e.Final=50]="Final",e[e.Hanja=51]="Hanja",e[e.Kanji=52]="Kanji",e[e.Convert=53]="Convert",e[e.Select=54]="Select",e[e.Print=55]="Print",e[e.Execute=56]="Execute",e[e.Snapshot=57]="Snapshot",e[e.Insert=58]="Insert",e[e.Help=59]="Help",e[e.Sleep=60]="Sleep",e[e.Separator=61]="Separator",e[e.Scroll=62]="Scroll",e[e.NumLock=63]="NumLock",e[e.RWin=64]="RWin",e[e.Apps=65]="Apps",e[e.Multiply=66]="Multiply",e[e.Add=67]="Add",e[e.Subtract=68]="Subtract",e[e.Decimal=69]="Decimal",e[e.Divide=70]="Divide",e[e.Equals=71]="Equals",e[e.NumpadEnter=72]="NumpadEnter",e[e.RShift=73]="RShift",e[e.RControl=74]="RControl",e[e.RAlt=75]="RAlt",e[e.CtrlAltDel=100]="CtrlAltDel",e[e.LockScreen=101]="LockScreen",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(y||(y={}));function je(e){switch(e){case 0:case"Unknown":return 0;case 1:case"Alt":return 1;case 2:case"Backspace":return 2;case 3:case"CapsLock":return 3;case 4:case"Control":return 4;case 5:case"Delete":return 5;case 6:case"DownArrow":return 6;case 7:case"End":return 7;case 8:case"Escape":return 8;case 9:case"F1":return 9;case 10:case"F10":return 10;case 11:case"F11":return 11;case 12:case"F12":return 12;case 13:case"F2":return 13;case 14:case"F3":return 14;case 15:case"F4":return 15;case 16:case"F5":return 16;case 17:case"F6":return 17;case 18:case"F7":return 18;case 19:case"F8":return 19;case 20:case"F9":return 20;case 21:case"Home":return 21;case 22:case"LeftArrow":return 22;case 23:case"Meta":return 23;case 24:case"Option":return 24;case 25:case"PageDown":return 25;case 26:case"PageUp":return 26;case 27:case"Return":return 27;case 28:case"RightArrow":return 28;case 29:case"Shift":return 29;case 30:case"Space":return 30;case 31:case"Tab":return 31;case 32:case"UpArrow":return 32;case 33:case"Numpad0":return 33;case 34:case"Numpad1":return 34;case 35:case"Numpad2":return 35;case 36:case"Numpad3":return 36;case 37:case"Numpad4":return 37;case 38:case"Numpad5":return 38;case 39:case"Numpad6":return 39;case 40:case"Numpad7":return 40;case 41:case"Numpad8":return 41;case 42:case"Numpad9":return 42;case 43:case"Cancel":return 43;case 44:case"Clear":return 44;case 45:case"Menu":return 45;case 46:case"Pause":return 46;case 47:case"Kana":return 47;case 48:case"Hangul":return 48;case 49:case"Junja":return 49;case 50:case"Final":return 50;case 51:case"Hanja":return 51;case 52:case"Kanji":return 52;case 53:case"Convert":return 53;case 54:case"Select":return 54;case 55:case"Print":return 55;case 56:case"Execute":return 56;case 57:case"Snapshot":return 57;case 58:case"Insert":return 58;case 59:case"Help":return 59;case 60:case"Sleep":return 60;case 61:case"Separator":return 61;case 62:case"Scroll":return 62;case 63:case"NumLock":return 63;case 64:case"RWin":return 64;case 65:case"Apps":return 65;case 66:case"Multiply":return 66;case 67:case"Add":return 67;case 68:case"Subtract":return 68;case 69:case"Decimal":return 69;case 70:case"Divide":return 70;case 71:case"Equals":return 71;case 72:case"NumpadEnter":return 72;case 73:case"RShift":return 73;case 74:case"RControl":return 74;case 75:case"RAlt":return 75;case 100:case"CtrlAltDel":return 100;case 101:case"LockScreen":return 101;case-1:case"UNRECOGNIZED":default:return-1}}function ou(e){switch(e){case 0:return"Unknown";case 1:return"Alt";case 2:return"Backspace";case 3:return"CapsLock";case 4:return"Control";case 5:return"Delete";case 6:return"DownArrow";case 7:return"End";case 8:return"Escape";case 9:return"F1";case 10:return"F10";case 11:return"F11";case 12:return"F12";case 13:return"F2";case 14:return"F3";case 15:return"F4";case 16:return"F5";case 17:return"F6";case 18:return"F7";case 19:return"F8";case 20:return"F9";case 21:return"Home";case 22:return"LeftArrow";case 23:return"Meta";case 24:return"Option";case 25:return"PageDown";case 26:return"PageUp";case 27:return"Return";case 28:return"RightArrow";case 29:return"Shift";case 30:return"Space";case 31:return"Tab";case 32:return"UpArrow";case 33:return"Numpad0";case 34:return"Numpad1";case 35:return"Numpad2";case 36:return"Numpad3";case 37:return"Numpad4";case 38:return"Numpad5";case 39:return"Numpad6";case 40:return"Numpad7";case 41:return"Numpad8";case 42:return"Numpad9";case 43:return"Cancel";case 44:return"Clear";case 45:return"Menu";case 46:return"Pause";case 47:return"Kana";case 48:return"Hangul";case 49:return"Junja";case 50:return"Final";case 51:return"Hanja";case 52:return"Kanji";case 53:return"Convert";case 54:return"Select";case 55:return"Print";case 56:return"Execute";case 57:return"Snapshot";case 58:return"Insert";case 59:return"Help";case 60:return"Sleep";case 61:return"Separator";case 62:return"Scroll";case 63:return"NumLock";case 64:return"RWin";case 65:return"Apps";case 66:return"Multiply";case 67:return"Add";case 68:return"Subtract";case 69:return"Decimal";case 70:return"Divide";case 71:return"Equals";case 72:return"NumpadEnter";case 73:return"RShift";case 74:return"RControl";case 75:return"RAlt";case 100:return"CtrlAltDel";case 101:return"LockScreen";default:return"UNKNOWN"}}var xu;(function(e){e[e.Dir=0]="Dir",e[e.DirLink=2]="DirLink",e[e.DirDrive=3]="DirDrive",e[e.File=4]="File",e[e.FileLink=5]="FileLink",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(xu||(xu={}));function ki(e){switch(e){case 0:case"Dir":return 0;case 2:case"DirLink":return 2;case 3:case"DirDrive":return 3;case 4:case"File":return 4;case 5:case"FileLink":return 5;case-1:case"UNRECOGNIZED":default:return-1}}function yi(e){switch(e){case 0:return"Dir";case 2:return"DirLink";case 3:return"DirDrive";case 4:return"File";case 5:return"FileLink";default:return"UNKNOWN"}}var H;(function(e){e[e.NotSet=0]="NotSet",e[e.Low=2]="Low",e[e.Balanced=3]="Balanced",e[e.Best=4]="Best",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(H||(H={}));function Ci(e){switch(e){case 0:case"NotSet":return 0;case 2:case"Low":return 2;case 3:case"Balanced":return 3;case 4:case"Best":return 4;case-1:case"UNRECOGNIZED":default:return-1}}function Bi(e){switch(e){case 0:return"NotSet";case 2:return"Low";case 3:return"Balanced";case 4:return"Best";default:return"UNKNOWN"}}var Z;(function(e){e[e.Keyboard=0]="Keyboard",e[e.Clipboard=2]="Clipboard",e[e.Audio=3]="Audio",e[e.File=4]="File",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(Z||(Z={}));function Si(e){switch(e){case 0:case"Keyboard":return 0;case 2:case"Clipboard":return 2;case 3:case"Audio":return 3;case 4:case"File":return 4;case-1:case"UNRECOGNIZED":default:return-1}}function wi(e){switch(e){case 0:return"Keyboard";case 2:return"Clipboard";case 3:return"Audio";case 4:return"File";default:return"UNKNOWN"}}var x;(function(e){e[e.NotSet=0]="NotSet",e[e.No=1]="No",e[e.Yes=2]="Yes",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(x||(x={}));function R(e){switch(e){case 0:case"NotSet":return 0;case 1:case"No":return 1;case 2:case"Yes":return 2;case-1:case"UNRECOGNIZED":default:return-1}}function P(e){switch(e){case 0:return"NotSet";case 1:return"No";case 2:return"Yes";default:return"UNKNOWN"}}function Ru(){return{data:new Uint8Array,key:!1,pts:0}}const G={encode(e,u=o.Writer.create()){return e.data.length!==0&&u.uint32(10).bytes(e.data),e.key===!0&&u.uint32(16).bool(e.key),e.pts!==0&&u.uint32(24).int64(e.pts),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ru();for(;r.pos>>3){case 1:i.data=r.bytes();break;case 2:i.key=r.bool();break;case 3:i.pts=z(r.int64());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{data:a(e.data)?h(e.data):new Uint8Array,key:a(e.key)?Boolean(e.key):!1,pts:a(e.pts)?Number(e.pts):0}},toJSON(e){const u={};return e.data!==void 0&&(u.data=m(e.data!==void 0?e.data:new Uint8Array)),e.key!==void 0&&(u.key=e.key),e.pts!==void 0&&(u.pts=Math.round(e.pts)),u},fromPartial(e){var r,n,i;const u=Ru();return u.data=(r=e.data)!=null?r:new Uint8Array,u.key=(n=e.key)!=null?n:!1,u.pts=(i=e.pts)!=null?i:0,u}};function Pu(){return{frames:[]}}const K={encode(e,u=o.Writer.create()){for(const r of e.frames)G.encode(r,u.uint32(10).fork()).ldelim();return u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Pu();for(;r.pos>>3){case 1:i.frames.push(G.decode(r,r.uint32()));break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{frames:Array.isArray(e==null?void 0:e.frames)?e.frames.map(u=>G.fromJSON(u)):[]}},toJSON(e){const u={};return e.frames?u.frames=e.frames.map(r=>r?G.toJSON(r):void 0):u.frames=[],u},fromPartial(e){var r;const u=Pu();return u.frames=((r=e.frames)==null?void 0:r.map(n=>G.fromPartial(n)))||[],u}};function bu(){return{compress:!1}}const Y={encode(e,u=o.Writer.create()){return e.compress===!0&&u.uint32(8).bool(e.compress),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=bu();for(;r.pos>>3){case 1:i.compress=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{compress:a(e.compress)?Boolean(e.compress):!1}},toJSON(e){const u={};return e.compress!==void 0&&(u.compress=e.compress),u},fromPartial(e){var r;const u=bu();return u.compress=(r=e.compress)!=null?r:!1,u}};function Ou(){return{compress:!1,stride:0}}const Q={encode(e,u=o.Writer.create()){return e.compress===!0&&u.uint32(8).bool(e.compress),e.stride!==0&&u.uint32(16).int32(e.stride),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ou();for(;r.pos>>3){case 1:i.compress=r.bool();break;case 2:i.stride=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{compress:a(e.compress)?Boolean(e.compress):!1,stride:a(e.stride)?Number(e.stride):0}},toJSON(e){const u={};return e.compress!==void 0&&(u.compress=e.compress),e.stride!==void 0&&(u.stride=Math.round(e.stride)),u},fromPartial(e){var r,n;const u=Ou();return u.compress=(r=e.compress)!=null?r:!1,u.stride=(n=e.stride)!=null?n:0,u}};function Iu(){return{vp9s:void 0,rgb:void 0,yuv:void 0}}const X={encode(e,u=o.Writer.create()){return e.vp9s!==void 0&&K.encode(e.vp9s,u.uint32(50).fork()).ldelim(),e.rgb!==void 0&&Y.encode(e.rgb,u.uint32(58).fork()).ldelim(),e.yuv!==void 0&&Q.encode(e.yuv,u.uint32(66).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Iu();for(;r.pos>>3){case 6:i.vp9s=K.decode(r,r.uint32());break;case 7:i.rgb=Y.decode(r,r.uint32());break;case 8:i.yuv=Q.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{vp9s:a(e.vp9s)?K.fromJSON(e.vp9s):void 0,rgb:a(e.rgb)?Y.fromJSON(e.rgb):void 0,yuv:a(e.yuv)?Q.fromJSON(e.yuv):void 0}},toJSON(e){const u={};return e.vp9s!==void 0&&(u.vp9s=e.vp9s?K.toJSON(e.vp9s):void 0),e.rgb!==void 0&&(u.rgb=e.rgb?Y.toJSON(e.rgb):void 0),e.yuv!==void 0&&(u.yuv=e.yuv?Q.toJSON(e.yuv):void 0),u},fromPartial(e){const u=Iu();return u.vp9s=e.vp9s!==void 0&&e.vp9s!==null?K.fromPartial(e.vp9s):void 0,u.rgb=e.rgb!==void 0&&e.rgb!==null?Y.fromPartial(e.rgb):void 0,u.yuv=e.yuv!==void 0&&e.yuv!==null?Q.fromPartial(e.yuv):void 0,u}};function Tu(){return{id:"",pk:new Uint8Array}}const Mu={encode(e,u=o.Writer.create()){return e.id!==""&&u.uint32(10).string(e.id),e.pk.length!==0&&u.uint32(18).bytes(e.pk),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Tu();for(;r.pos>>3){case 1:i.id=r.string();break;case 2:i.pk=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?String(e.id):"",pk:a(e.pk)?h(e.pk):new Uint8Array}},toJSON(e){const u={};return e.id!==void 0&&(u.id=e.id),e.pk!==void 0&&(u.pk=m(e.pk!==void 0?e.pk:new Uint8Array)),u},fromPartial(e){var r,n;const u=Tu();return u.id=(r=e.id)!=null?r:"",u.pk=(n=e.pk)!=null?n:new Uint8Array,u}};function qu(){return{x:0,y:0,width:0,height:0,name:"",online:!1}}const $={encode(e,u=o.Writer.create()){return e.x!==0&&u.uint32(8).sint32(e.x),e.y!==0&&u.uint32(16).sint32(e.y),e.width!==0&&u.uint32(24).int32(e.width),e.height!==0&&u.uint32(32).int32(e.height),e.name!==""&&u.uint32(42).string(e.name),e.online===!0&&u.uint32(48).bool(e.online),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=qu();for(;r.pos>>3){case 1:i.x=r.sint32();break;case 2:i.y=r.sint32();break;case 3:i.width=r.int32();break;case 4:i.height=r.int32();break;case 5:i.name=r.string();break;case 6:i.online=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{x:a(e.x)?Number(e.x):0,y:a(e.y)?Number(e.y):0,width:a(e.width)?Number(e.width):0,height:a(e.height)?Number(e.height):0,name:a(e.name)?String(e.name):"",online:a(e.online)?Boolean(e.online):!1}},toJSON(e){const u={};return e.x!==void 0&&(u.x=Math.round(e.x)),e.y!==void 0&&(u.y=Math.round(e.y)),e.width!==void 0&&(u.width=Math.round(e.width)),e.height!==void 0&&(u.height=Math.round(e.height)),e.name!==void 0&&(u.name=e.name),e.online!==void 0&&(u.online=e.online),u},fromPartial(e){var r,n,i,t,s,l;const u=qu();return u.x=(r=e.x)!=null?r:0,u.y=(n=e.y)!=null?n:0,u.width=(i=e.width)!=null?i:0,u.height=(t=e.height)!=null?t:0,u.name=(s=e.name)!=null?s:"",u.online=(l=e.online)!=null?l:!1,u}};function zu(){return{host:"",port:0}}const j={encode(e,u=o.Writer.create()){return e.host!==""&&u.uint32(10).string(e.host),e.port!==0&&u.uint32(16).int32(e.port),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=zu();for(;r.pos>>3){case 1:i.host=r.string();break;case 2:i.port=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{host:a(e.host)?String(e.host):"",port:a(e.port)?Number(e.port):0}},toJSON(e){const u={};return e.host!==void 0&&(u.host=e.host),e.port!==void 0&&(u.port=Math.round(e.port)),u},fromPartial(e){var r,n;const u=zu();return u.host=(r=e.host)!=null?r:"",u.port=(n=e.port)!=null?n:0,u}};function Ju(){return{dir:"",show_hidden:!1}}const ee={encode(e,u=o.Writer.create()){return e.dir!==""&&u.uint32(10).string(e.dir),e.show_hidden===!0&&u.uint32(16).bool(e.show_hidden),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ju();for(;r.pos>>3){case 1:i.dir=r.string();break;case 2:i.show_hidden=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{dir:a(e.dir)?String(e.dir):"",show_hidden:a(e.show_hidden)?Boolean(e.show_hidden):!1}},toJSON(e){const u={};return e.dir!==void 0&&(u.dir=e.dir),e.show_hidden!==void 0&&(u.show_hidden=e.show_hidden),u},fromPartial(e){var r,n;const u=Ju();return u.dir=(r=e.dir)!=null?r:"",u.show_hidden=(n=e.show_hidden)!=null?n:!1,u}};function Lu(){return{username:"",password:new Uint8Array,my_id:"",my_name:"",option:void 0,file_transfer:void 0,port_forward:void 0,video_ack_required:!1}}const T={encode(e,u=o.Writer.create()){return e.username!==""&&u.uint32(10).string(e.username),e.password.length!==0&&u.uint32(18).bytes(e.password),e.my_id!==""&&u.uint32(34).string(e.my_id),e.my_name!==""&&u.uint32(42).string(e.my_name),e.option!==void 0&&f.encode(e.option,u.uint32(50).fork()).ldelim(),e.file_transfer!==void 0&&ee.encode(e.file_transfer,u.uint32(58).fork()).ldelim(),e.port_forward!==void 0&&j.encode(e.port_forward,u.uint32(66).fork()).ldelim(),e.video_ack_required===!0&&u.uint32(72).bool(e.video_ack_required),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Lu();for(;r.pos>>3){case 1:i.username=r.string();break;case 2:i.password=r.bytes();break;case 4:i.my_id=r.string();break;case 5:i.my_name=r.string();break;case 6:i.option=f.decode(r,r.uint32());break;case 7:i.file_transfer=ee.decode(r,r.uint32());break;case 8:i.port_forward=j.decode(r,r.uint32());break;case 9:i.video_ack_required=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{username:a(e.username)?String(e.username):"",password:a(e.password)?h(e.password):new Uint8Array,my_id:a(e.my_id)?String(e.my_id):"",my_name:a(e.my_name)?String(e.my_name):"",option:a(e.option)?f.fromJSON(e.option):void 0,file_transfer:a(e.file_transfer)?ee.fromJSON(e.file_transfer):void 0,port_forward:a(e.port_forward)?j.fromJSON(e.port_forward):void 0,video_ack_required:a(e.video_ack_required)?Boolean(e.video_ack_required):!1}},toJSON(e){const u={};return e.username!==void 0&&(u.username=e.username),e.password!==void 0&&(u.password=m(e.password!==void 0?e.password:new Uint8Array)),e.my_id!==void 0&&(u.my_id=e.my_id),e.my_name!==void 0&&(u.my_name=e.my_name),e.option!==void 0&&(u.option=e.option?f.toJSON(e.option):void 0),e.file_transfer!==void 0&&(u.file_transfer=e.file_transfer?ee.toJSON(e.file_transfer):void 0),e.port_forward!==void 0&&(u.port_forward=e.port_forward?j.toJSON(e.port_forward):void 0),e.video_ack_required!==void 0&&(u.video_ack_required=e.video_ack_required),u},fromPartial(e){var r,n,i,t,s;const u=Lu();return u.username=(r=e.username)!=null?r:"",u.password=(n=e.password)!=null?n:new Uint8Array,u.my_id=(i=e.my_id)!=null?i:"",u.my_name=(t=e.my_name)!=null?t:"",u.option=e.option!==void 0&&e.option!==null?f.fromPartial(e.option):void 0,u.file_transfer=e.file_transfer!==void 0&&e.file_transfer!==null?ee.fromPartial(e.file_transfer):void 0,u.port_forward=e.port_forward!==void 0&&e.port_forward!==null?j.fromPartial(e.port_forward):void 0,u.video_ack_required=(s=e.video_ack_required)!=null?s:!1,u}};function Uu(){return{text:""}}const ue={encode(e,u=o.Writer.create()){return e.text!==""&&u.uint32(10).string(e.text),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Uu();for(;r.pos>>3){case 1:i.text=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{text:a(e.text)?String(e.text):""}},toJSON(e){const u={};return e.text!==void 0&&(u.text=e.text),u},fromPartial(e){var r;const u=Uu();return u.text=(r=e.text)!=null?r:"",u}};function Vu(){return{username:"",hostname:"",platform:"",displays:[],current_display:0,sas_enabled:!1,version:"",conn_id:0}}const re={encode(e,u=o.Writer.create()){e.username!==""&&u.uint32(10).string(e.username),e.hostname!==""&&u.uint32(18).string(e.hostname),e.platform!==""&&u.uint32(26).string(e.platform);for(const r of e.displays)$.encode(r,u.uint32(34).fork()).ldelim();return e.current_display!==0&&u.uint32(40).int32(e.current_display),e.sas_enabled===!0&&u.uint32(48).bool(e.sas_enabled),e.version!==""&&u.uint32(58).string(e.version),e.conn_id!==0&&u.uint32(64).int32(e.conn_id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Vu();for(;r.pos>>3){case 1:i.username=r.string();break;case 2:i.hostname=r.string();break;case 3:i.platform=r.string();break;case 4:i.displays.push($.decode(r,r.uint32()));break;case 5:i.current_display=r.int32();break;case 6:i.sas_enabled=r.bool();break;case 7:i.version=r.string();break;case 8:i.conn_id=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{username:a(e.username)?String(e.username):"",hostname:a(e.hostname)?String(e.hostname):"",platform:a(e.platform)?String(e.platform):"",displays:Array.isArray(e==null?void 0:e.displays)?e.displays.map(u=>$.fromJSON(u)):[],current_display:a(e.current_display)?Number(e.current_display):0,sas_enabled:a(e.sas_enabled)?Boolean(e.sas_enabled):!1,version:a(e.version)?String(e.version):"",conn_id:a(e.conn_id)?Number(e.conn_id):0}},toJSON(e){const u={};return e.username!==void 0&&(u.username=e.username),e.hostname!==void 0&&(u.hostname=e.hostname),e.platform!==void 0&&(u.platform=e.platform),e.displays?u.displays=e.displays.map(r=>r?$.toJSON(r):void 0):u.displays=[],e.current_display!==void 0&&(u.current_display=Math.round(e.current_display)),e.sas_enabled!==void 0&&(u.sas_enabled=e.sas_enabled),e.version!==void 0&&(u.version=e.version),e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),u},fromPartial(e){var r,n,i,t,s,l,c,p;const u=Vu();return u.username=(r=e.username)!=null?r:"",u.hostname=(n=e.hostname)!=null?n:"",u.platform=(i=e.platform)!=null?i:"",u.displays=((t=e.displays)==null?void 0:t.map(v=>$.fromPartial(v)))||[],u.current_display=(s=e.current_display)!=null?s:0,u.sas_enabled=(l=e.sas_enabled)!=null?l:!1,u.version=(c=e.version)!=null?c:"",u.conn_id=(p=e.conn_id)!=null?p:0,u}};function Wu(){return{error:void 0,peer_info:void 0}}const ie={encode(e,u=o.Writer.create()){return e.error!==void 0&&u.uint32(10).string(e.error),e.peer_info!==void 0&&re.encode(e.peer_info,u.uint32(18).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Wu();for(;r.pos>>3){case 1:i.error=r.string();break;case 2:i.peer_info=re.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{error:a(e.error)?String(e.error):void 0,peer_info:a(e.peer_info)?re.fromJSON(e.peer_info):void 0}},toJSON(e){const u={};return e.error!==void 0&&(u.error=e.error),e.peer_info!==void 0&&(u.peer_info=e.peer_info?re.toJSON(e.peer_info):void 0),u},fromPartial(e){var r;const u=Wu();return u.error=(r=e.error)!=null?r:void 0,u.peer_info=e.peer_info!==void 0&&e.peer_info!==null?re.fromPartial(e.peer_info):void 0,u}};function Hu(){return{mask:0,x:0,y:0,modifiers:[]}}const M={encode(e,u=o.Writer.create()){e.mask!==0&&u.uint32(8).int32(e.mask),e.x!==0&&u.uint32(16).sint32(e.x),e.y!==0&&u.uint32(24).sint32(e.y),u.uint32(34).fork();for(const r of e.modifiers)u.int32(r);return u.ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Hu();for(;r.pos>>3){case 1:i.mask=r.int32();break;case 2:i.x=r.sint32();break;case 3:i.y=r.sint32();break;case 4:if((t&7)==2){const s=r.uint32()+r.pos;for(;r.posje(u)):[]}},toJSON(e){const u={};return e.mask!==void 0&&(u.mask=Math.round(e.mask)),e.x!==void 0&&(u.x=Math.round(e.x)),e.y!==void 0&&(u.y=Math.round(e.y)),e.modifiers?u.modifiers=e.modifiers.map(r=>ou(r)):u.modifiers=[],u},fromPartial(e){var r,n,i,t;const u=Hu();return u.mask=(r=e.mask)!=null?r:0,u.x=(n=e.x)!=null?n:0,u.y=(i=e.y)!=null?i:0,u.modifiers=((t=e.modifiers)==null?void 0:t.map(s=>s))||[],u}};function Zu(){return{down:!1,press:!1,control_key:void 0,chr:void 0,unicode:void 0,seq:void 0,modifiers:[]}}const E={encode(e,u=o.Writer.create()){e.down===!0&&u.uint32(8).bool(e.down),e.press===!0&&u.uint32(16).bool(e.press),e.control_key!==void 0&&u.uint32(24).int32(e.control_key),e.chr!==void 0&&u.uint32(32).uint32(e.chr),e.unicode!==void 0&&u.uint32(40).uint32(e.unicode),e.seq!==void 0&&u.uint32(50).string(e.seq),u.uint32(66).fork();for(const r of e.modifiers)u.int32(r);return u.ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Zu();for(;r.pos>>3){case 1:i.down=r.bool();break;case 2:i.press=r.bool();break;case 3:i.control_key=r.int32();break;case 4:i.chr=r.uint32();break;case 5:i.unicode=r.uint32();break;case 6:i.seq=r.string();break;case 8:if((t&7)==2){const s=r.uint32()+r.pos;for(;r.posje(u)):[]}},toJSON(e){const u={};return e.down!==void 0&&(u.down=e.down),e.press!==void 0&&(u.press=e.press),e.control_key!==void 0&&(u.control_key=e.control_key!==void 0?ou(e.control_key):void 0),e.chr!==void 0&&(u.chr=Math.round(e.chr)),e.unicode!==void 0&&(u.unicode=Math.round(e.unicode)),e.seq!==void 0&&(u.seq=e.seq),e.modifiers?u.modifiers=e.modifiers.map(r=>ou(r)):u.modifiers=[],u},fromPartial(e){var r,n,i,t,s,l,c;const u=Zu();return u.down=(r=e.down)!=null?r:!1,u.press=(n=e.press)!=null?n:!1,u.control_key=(i=e.control_key)!=null?i:void 0,u.chr=(t=e.chr)!=null?t:void 0,u.unicode=(s=e.unicode)!=null?s:void 0,u.seq=(l=e.seq)!=null?l:void 0,u.modifiers=((c=e.modifiers)==null?void 0:c.map(p=>p))||[],u}};function Gu(){return{id:0,hotx:0,hoty:0,width:0,height:0,colors:new Uint8Array}}const ne={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).uint64(e.id),e.hotx!==0&&u.uint32(16).sint32(e.hotx),e.hoty!==0&&u.uint32(24).sint32(e.hoty),e.width!==0&&u.uint32(32).int32(e.width),e.height!==0&&u.uint32(40).int32(e.height),e.colors.length!==0&&u.uint32(50).bytes(e.colors),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Gu();for(;r.pos>>3){case 1:i.id=z(r.uint64());break;case 2:i.hotx=r.sint32();break;case 3:i.hoty=r.sint32();break;case 4:i.width=r.int32();break;case 5:i.height=r.int32();break;case 6:i.colors=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,hotx:a(e.hotx)?Number(e.hotx):0,hoty:a(e.hoty)?Number(e.hoty):0,width:a(e.width)?Number(e.width):0,height:a(e.height)?Number(e.height):0,colors:a(e.colors)?h(e.colors):new Uint8Array}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.hotx!==void 0&&(u.hotx=Math.round(e.hotx)),e.hoty!==void 0&&(u.hoty=Math.round(e.hoty)),e.width!==void 0&&(u.width=Math.round(e.width)),e.height!==void 0&&(u.height=Math.round(e.height)),e.colors!==void 0&&(u.colors=m(e.colors!==void 0?e.colors:new Uint8Array)),u},fromPartial(e){var r,n,i,t,s,l;const u=Gu();return u.id=(r=e.id)!=null?r:0,u.hotx=(n=e.hotx)!=null?n:0,u.hoty=(i=e.hoty)!=null?i:0,u.width=(t=e.width)!=null?t:0,u.height=(s=e.height)!=null?s:0,u.colors=(l=e.colors)!=null?l:new Uint8Array,u}};function Ku(){return{x:0,y:0}}const te={encode(e,u=o.Writer.create()){return e.x!==0&&u.uint32(8).sint32(e.x),e.y!==0&&u.uint32(16).sint32(e.y),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ku();for(;r.pos>>3){case 1:i.x=r.sint32();break;case 2:i.y=r.sint32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{x:a(e.x)?Number(e.x):0,y:a(e.y)?Number(e.y):0}},toJSON(e){const u={};return e.x!==void 0&&(u.x=Math.round(e.x)),e.y!==void 0&&(u.y=Math.round(e.y)),u},fromPartial(e){var r,n;const u=Ku();return u.x=(r=e.x)!=null?r:0,u.y=(n=e.y)!=null?n:0,u}};function Yu(){return{salt:"",challenge:""}}const oe={encode(e,u=o.Writer.create()){return e.salt!==""&&u.uint32(10).string(e.salt),e.challenge!==""&&u.uint32(18).string(e.challenge),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Yu();for(;r.pos>>3){case 1:i.salt=r.string();break;case 2:i.challenge=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{salt:a(e.salt)?String(e.salt):"",challenge:a(e.challenge)?String(e.challenge):""}},toJSON(e){const u={};return e.salt!==void 0&&(u.salt=e.salt),e.challenge!==void 0&&(u.challenge=e.challenge),u},fromPartial(e){var r,n;const u=Yu();return u.salt=(r=e.salt)!=null?r:"",u.challenge=(n=e.challenge)!=null?n:"",u}};function Qu(){return{compress:!1,content:new Uint8Array}}const ae={encode(e,u=o.Writer.create()){return e.compress===!0&&u.uint32(8).bool(e.compress),e.content.length!==0&&u.uint32(18).bytes(e.content),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Qu();for(;r.pos>>3){case 1:i.compress=r.bool();break;case 2:i.content=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{compress:a(e.compress)?Boolean(e.compress):!1,content:a(e.content)?h(e.content):new Uint8Array}},toJSON(e){const u={};return e.compress!==void 0&&(u.compress=e.compress),e.content!==void 0&&(u.content=m(e.content!==void 0?e.content:new Uint8Array)),u},fromPartial(e){var r,n;const u=Qu();return u.compress=(r=e.compress)!=null?r:!1,u.content=(n=e.content)!=null?n:new Uint8Array,u}};function Xu(){return{entry_type:0,name:"",is_hidden:!1,size:0,modified_time:0}}const C={encode(e,u=o.Writer.create()){return e.entry_type!==0&&u.uint32(8).int32(e.entry_type),e.name!==""&&u.uint32(18).string(e.name),e.is_hidden===!0&&u.uint32(24).bool(e.is_hidden),e.size!==0&&u.uint32(32).uint64(e.size),e.modified_time!==0&&u.uint32(40).uint64(e.modified_time),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Xu();for(;r.pos>>3){case 1:i.entry_type=r.int32();break;case 2:i.name=r.string();break;case 3:i.is_hidden=r.bool();break;case 4:i.size=z(r.uint64());break;case 5:i.modified_time=z(r.uint64());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{entry_type:a(e.entry_type)?ki(e.entry_type):0,name:a(e.name)?String(e.name):"",is_hidden:a(e.is_hidden)?Boolean(e.is_hidden):!1,size:a(e.size)?Number(e.size):0,modified_time:a(e.modified_time)?Number(e.modified_time):0}},toJSON(e){const u={};return e.entry_type!==void 0&&(u.entry_type=yi(e.entry_type)),e.name!==void 0&&(u.name=e.name),e.is_hidden!==void 0&&(u.is_hidden=e.is_hidden),e.size!==void 0&&(u.size=Math.round(e.size)),e.modified_time!==void 0&&(u.modified_time=Math.round(e.modified_time)),u},fromPartial(e){var r,n,i,t,s;const u=Xu();return u.entry_type=(r=e.entry_type)!=null?r:0,u.name=(n=e.name)!=null?n:"",u.is_hidden=(i=e.is_hidden)!=null?i:!1,u.size=(t=e.size)!=null?t:0,u.modified_time=(s=e.modified_time)!=null?s:0,u}};function $u(){return{id:0,path:"",entries:[]}}const se={encode(e,u=o.Writer.create()){e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path);for(const r of e.entries)C.encode(r,u.uint32(26).fork()).ldelim();return u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=$u();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.entries.push(C.decode(r,r.uint32()));break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",entries:Array.isArray(e==null?void 0:e.entries)?e.entries.map(u=>C.fromJSON(u)):[]}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.entries?u.entries=e.entries.map(r=>r?C.toJSON(r):void 0):u.entries=[],u},fromPartial(e){var r,n,i;const u=$u();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.entries=((i=e.entries)==null?void 0:i.map(t=>C.fromPartial(t)))||[],u}};function ju(){return{path:"",include_hidden:!1}}const de={encode(e,u=o.Writer.create()){return e.path!==""&&u.uint32(10).string(e.path),e.include_hidden===!0&&u.uint32(16).bool(e.include_hidden),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=ju();for(;r.pos>>3){case 1:i.path=r.string();break;case 2:i.include_hidden=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{path:a(e.path)?String(e.path):"",include_hidden:a(e.include_hidden)?Boolean(e.include_hidden):!1}},toJSON(e){const u={};return e.path!==void 0&&(u.path=e.path),e.include_hidden!==void 0&&(u.include_hidden=e.include_hidden),u},fromPartial(e){var r,n;const u=ju();return u.path=(r=e.path)!=null?r:"",u.include_hidden=(n=e.include_hidden)!=null?n:!1,u}};function er(){return{id:0,path:"",include_hidden:!1}}const le={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path),e.include_hidden===!0&&u.uint32(24).bool(e.include_hidden),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=er();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.include_hidden=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",include_hidden:a(e.include_hidden)?Boolean(e.include_hidden):!1}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.include_hidden!==void 0&&(u.include_hidden=e.include_hidden),u},fromPartial(e){var r,n,i;const u=er();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.include_hidden=(i=e.include_hidden)!=null?i:!1,u}};function ur(){return{read_dir:void 0,send:void 0,receive:void 0,create:void 0,remove_dir:void 0,remove_file:void 0,all_files:void 0,cancel:void 0}}const ce={encode(e,u=o.Writer.create()){return e.read_dir!==void 0&&de.encode(e.read_dir,u.uint32(10).fork()).ldelim(),e.send!==void 0&&Ee.encode(e.send,u.uint32(18).fork()).ldelim(),e.receive!==void 0&&me.encode(e.receive,u.uint32(26).fork()).ldelim(),e.create!==void 0&&Ae.encode(e.create,u.uint32(34).fork()).ldelim(),e.remove_dir!==void 0&&Fe.encode(e.remove_dir,u.uint32(42).fork()).ldelim(),e.remove_file!==void 0&&De.encode(e.remove_file,u.uint32(50).fork()).ldelim(),e.all_files!==void 0&&le.encode(e.all_files,u.uint32(58).fork()).ldelim(),e.cancel!==void 0&&pe.encode(e.cancel,u.uint32(66).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=ur();for(;r.pos>>3){case 1:i.read_dir=de.decode(r,r.uint32());break;case 2:i.send=Ee.decode(r,r.uint32());break;case 3:i.receive=me.decode(r,r.uint32());break;case 4:i.create=Ae.decode(r,r.uint32());break;case 5:i.remove_dir=Fe.decode(r,r.uint32());break;case 6:i.remove_file=De.decode(r,r.uint32());break;case 7:i.all_files=le.decode(r,r.uint32());break;case 8:i.cancel=pe.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{read_dir:a(e.read_dir)?de.fromJSON(e.read_dir):void 0,send:a(e.send)?Ee.fromJSON(e.send):void 0,receive:a(e.receive)?me.fromJSON(e.receive):void 0,create:a(e.create)?Ae.fromJSON(e.create):void 0,remove_dir:a(e.remove_dir)?Fe.fromJSON(e.remove_dir):void 0,remove_file:a(e.remove_file)?De.fromJSON(e.remove_file):void 0,all_files:a(e.all_files)?le.fromJSON(e.all_files):void 0,cancel:a(e.cancel)?pe.fromJSON(e.cancel):void 0}},toJSON(e){const u={};return e.read_dir!==void 0&&(u.read_dir=e.read_dir?de.toJSON(e.read_dir):void 0),e.send!==void 0&&(u.send=e.send?Ee.toJSON(e.send):void 0),e.receive!==void 0&&(u.receive=e.receive?me.toJSON(e.receive):void 0),e.create!==void 0&&(u.create=e.create?Ae.toJSON(e.create):void 0),e.remove_dir!==void 0&&(u.remove_dir=e.remove_dir?Fe.toJSON(e.remove_dir):void 0),e.remove_file!==void 0&&(u.remove_file=e.remove_file?De.toJSON(e.remove_file):void 0),e.all_files!==void 0&&(u.all_files=e.all_files?le.toJSON(e.all_files):void 0),e.cancel!==void 0&&(u.cancel=e.cancel?pe.toJSON(e.cancel):void 0),u},fromPartial(e){const u=ur();return u.read_dir=e.read_dir!==void 0&&e.read_dir!==null?de.fromPartial(e.read_dir):void 0,u.send=e.send!==void 0&&e.send!==null?Ee.fromPartial(e.send):void 0,u.receive=e.receive!==void 0&&e.receive!==null?me.fromPartial(e.receive):void 0,u.create=e.create!==void 0&&e.create!==null?Ae.fromPartial(e.create):void 0,u.remove_dir=e.remove_dir!==void 0&&e.remove_dir!==null?Fe.fromPartial(e.remove_dir):void 0,u.remove_file=e.remove_file!==void 0&&e.remove_file!==null?De.fromPartial(e.remove_file):void 0,u.all_files=e.all_files!==void 0&&e.all_files!==null?le.fromPartial(e.all_files):void 0,u.cancel=e.cancel!==void 0&&e.cancel!==null?pe.fromPartial(e.cancel):void 0,u}};function rr(){return{id:0}}const pe={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=rr();for(;r.pos>>3){case 1:i.id=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),u},fromPartial(e){var r;const u=rr();return u.id=(r=e.id)!=null?r:0,u}};function ir(){return{dir:void 0,block:void 0,error:void 0,done:void 0}}const _e={encode(e,u=o.Writer.create()){return e.dir!==void 0&&se.encode(e.dir,u.uint32(10).fork()).ldelim(),e.block!==void 0&&fe.encode(e.block,u.uint32(18).fork()).ldelim(),e.error!==void 0&&ve.encode(e.error,u.uint32(26).fork()).ldelim(),e.done!==void 0&&he.encode(e.done,u.uint32(34).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=ir();for(;r.pos>>3){case 1:i.dir=se.decode(r,r.uint32());break;case 2:i.block=fe.decode(r,r.uint32());break;case 3:i.error=ve.decode(r,r.uint32());break;case 4:i.done=he.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{dir:a(e.dir)?se.fromJSON(e.dir):void 0,block:a(e.block)?fe.fromJSON(e.block):void 0,error:a(e.error)?ve.fromJSON(e.error):void 0,done:a(e.done)?he.fromJSON(e.done):void 0}},toJSON(e){const u={};return e.dir!==void 0&&(u.dir=e.dir?se.toJSON(e.dir):void 0),e.block!==void 0&&(u.block=e.block?fe.toJSON(e.block):void 0),e.error!==void 0&&(u.error=e.error?ve.toJSON(e.error):void 0),e.done!==void 0&&(u.done=e.done?he.toJSON(e.done):void 0),u},fromPartial(e){const u=ir();return u.dir=e.dir!==void 0&&e.dir!==null?se.fromPartial(e.dir):void 0,u.block=e.block!==void 0&&e.block!==null?fe.fromPartial(e.block):void 0,u.error=e.error!==void 0&&e.error!==null?ve.fromPartial(e.error):void 0,u.done=e.done!==void 0&&e.done!==null?he.fromPartial(e.done):void 0,u}};function nr(){return{id:0,file_num:0,data:new Uint8Array,compressed:!1}}const fe={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.file_num!==0&&u.uint32(16).sint32(e.file_num),e.data.length!==0&&u.uint32(26).bytes(e.data),e.compressed===!0&&u.uint32(32).bool(e.compressed),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=nr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.file_num=r.sint32();break;case 3:i.data=r.bytes();break;case 4:i.compressed=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,file_num:a(e.file_num)?Number(e.file_num):0,data:a(e.data)?h(e.data):new Uint8Array,compressed:a(e.compressed)?Boolean(e.compressed):!1}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.file_num!==void 0&&(u.file_num=Math.round(e.file_num)),e.data!==void 0&&(u.data=m(e.data!==void 0?e.data:new Uint8Array)),e.compressed!==void 0&&(u.compressed=e.compressed),u},fromPartial(e){var r,n,i,t;const u=nr();return u.id=(r=e.id)!=null?r:0,u.file_num=(n=e.file_num)!=null?n:0,u.data=(i=e.data)!=null?i:new Uint8Array,u.compressed=(t=e.compressed)!=null?t:!1,u}};function tr(){return{id:0,error:"",file_num:0}}const ve={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.error!==""&&u.uint32(18).string(e.error),e.file_num!==0&&u.uint32(24).sint32(e.file_num),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=tr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.error=r.string();break;case 3:i.file_num=r.sint32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,error:a(e.error)?String(e.error):"",file_num:a(e.file_num)?Number(e.file_num):0}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.error!==void 0&&(u.error=e.error),e.file_num!==void 0&&(u.file_num=Math.round(e.file_num)),u},fromPartial(e){var r,n,i;const u=tr();return u.id=(r=e.id)!=null?r:0,u.error=(n=e.error)!=null?n:"",u.file_num=(i=e.file_num)!=null?i:0,u}};function or(){return{id:0,path:"",include_hidden:!1}}const Ee={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path),e.include_hidden===!0&&u.uint32(24).bool(e.include_hidden),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=or();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.include_hidden=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",include_hidden:a(e.include_hidden)?Boolean(e.include_hidden):!1}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.include_hidden!==void 0&&(u.include_hidden=e.include_hidden),u},fromPartial(e){var r,n,i;const u=or();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.include_hidden=(i=e.include_hidden)!=null?i:!1,u}};function ar(){return{id:0,file_num:0}}const he={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.file_num!==0&&u.uint32(16).sint32(e.file_num),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=ar();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.file_num=r.sint32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,file_num:a(e.file_num)?Number(e.file_num):0}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.file_num!==void 0&&(u.file_num=Math.round(e.file_num)),u},fromPartial(e){var r,n;const u=ar();return u.id=(r=e.id)!=null?r:0,u.file_num=(n=e.file_num)!=null?n:0,u}};function sr(){return{id:0,path:"",files:[]}}const me={encode(e,u=o.Writer.create()){e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path);for(const r of e.files)C.encode(r,u.uint32(26).fork()).ldelim();return u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=sr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.files.push(C.decode(r,r.uint32()));break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",files:Array.isArray(e==null?void 0:e.files)?e.files.map(u=>C.fromJSON(u)):[]}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.files?u.files=e.files.map(r=>r?C.toJSON(r):void 0):u.files=[],u},fromPartial(e){var r,n,i;const u=sr();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.files=((i=e.files)==null?void 0:i.map(t=>C.fromPartial(t)))||[],u}};function dr(){return{id:0,path:"",recursive:!1}}const Fe={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path),e.recursive===!0&&u.uint32(24).bool(e.recursive),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=dr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.recursive=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",recursive:a(e.recursive)?Boolean(e.recursive):!1}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.recursive!==void 0&&(u.recursive=e.recursive),u},fromPartial(e){var r,n,i;const u=dr();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.recursive=(i=e.recursive)!=null?i:!1,u}};function lr(){return{id:0,path:"",file_num:0}}const De={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path),e.file_num!==0&&u.uint32(24).sint32(e.file_num),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=lr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;case 3:i.file_num=r.sint32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):"",file_num:a(e.file_num)?Number(e.file_num):0}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),e.file_num!==void 0&&(u.file_num=Math.round(e.file_num)),u},fromPartial(e){var r,n,i;const u=lr();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u.file_num=(i=e.file_num)!=null?i:0,u}};function cr(){return{id:0,path:""}}const Ae={encode(e,u=o.Writer.create()){return e.id!==0&&u.uint32(8).int32(e.id),e.path!==""&&u.uint32(18).string(e.path),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=cr();for(;r.pos>>3){case 1:i.id=r.int32();break;case 2:i.path=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?Number(e.id):0,path:a(e.path)?String(e.path):""}},toJSON(e){const u={};return e.id!==void 0&&(u.id=Math.round(e.id)),e.path!==void 0&&(u.path=e.path),u},fromPartial(e){var r,n;const u=cr();return u.id=(r=e.id)!=null?r:0,u.path=(n=e.path)!=null?n:"",u}};function pr(){return{conn_id:0}}const ke={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=pr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),u},fromPartial(e){var r;const u=pr();return u.conn_id=(r=e.conn_id)!=null?r:0,u}};function _r(){return{conn_id:0,id:0,format:""}}const ye={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.id!==0&&u.uint32(16).int32(e.id),e.format!==""&&u.uint32(26).string(e.format),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=_r();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.id=r.int32();break;case 3:i.format=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,id:a(e.id)?Number(e.id):0,format:a(e.format)?String(e.format):""}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.id!==void 0&&(u.id=Math.round(e.id)),e.format!==void 0&&(u.format=e.format),u},fromPartial(e){var r,n,i;const u=_r();return u.conn_id=(r=e.conn_id)!=null?r:0,u.id=(n=e.id)!=null?n:0,u.format=(i=e.format)!=null?i:"",u}};function fr(){return{conn_id:0,formats:[]}}const Ce={encode(e,u=o.Writer.create()){e.conn_id!==0&&u.uint32(8).int32(e.conn_id);for(const r of e.formats)ye.encode(r,u.uint32(18).fork()).ldelim();return u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=fr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.formats.push(ye.decode(r,r.uint32()));break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,formats:Array.isArray(e==null?void 0:e.formats)?e.formats.map(u=>ye.fromJSON(u)):[]}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.formats?u.formats=e.formats.map(r=>r?ye.toJSON(r):void 0):u.formats=[],u},fromPartial(e){var r,n;const u=fr();return u.conn_id=(r=e.conn_id)!=null?r:0,u.formats=((n=e.formats)==null?void 0:n.map(i=>ye.fromPartial(i)))||[],u}};function vr(){return{conn_id:0,msg_flags:0}}const Be={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.msg_flags!==0&&u.uint32(16).int32(e.msg_flags),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=vr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.msg_flags=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,msg_flags:a(e.msg_flags)?Number(e.msg_flags):0}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.msg_flags!==void 0&&(u.msg_flags=Math.round(e.msg_flags)),u},fromPartial(e){var r,n;const u=vr();return u.conn_id=(r=e.conn_id)!=null?r:0,u.msg_flags=(n=e.msg_flags)!=null?n:0,u}};function Er(){return{conn_id:0,requested_format_id:0}}const Se={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.requested_format_id!==0&&u.uint32(16).int32(e.requested_format_id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Er();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.requested_format_id=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,requested_format_id:a(e.requested_format_id)?Number(e.requested_format_id):0}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.requested_format_id!==void 0&&(u.requested_format_id=Math.round(e.requested_format_id)),u},fromPartial(e){var r,n;const u=Er();return u.conn_id=(r=e.conn_id)!=null?r:0,u.requested_format_id=(n=e.requested_format_id)!=null?n:0,u}};function hr(){return{conn_id:0,msg_flags:0,format_data:new Uint8Array}}const we={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.msg_flags!==0&&u.uint32(16).int32(e.msg_flags),e.format_data.length!==0&&u.uint32(26).bytes(e.format_data),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=hr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.msg_flags=r.int32();break;case 3:i.format_data=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,msg_flags:a(e.msg_flags)?Number(e.msg_flags):0,format_data:a(e.format_data)?h(e.format_data):new Uint8Array}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.msg_flags!==void 0&&(u.msg_flags=Math.round(e.msg_flags)),e.format_data!==void 0&&(u.format_data=m(e.format_data!==void 0?e.format_data:new Uint8Array)),u},fromPartial(e){var r,n,i;const u=hr();return u.conn_id=(r=e.conn_id)!=null?r:0,u.msg_flags=(n=e.msg_flags)!=null?n:0,u.format_data=(i=e.format_data)!=null?i:new Uint8Array,u}};function mr(){return{conn_id:0,stream_id:0,list_index:0,dw_flags:0,n_position_low:0,n_position_high:0,cb_requested:0,have_clip_data_id:!1,clip_data_id:0}}const ge={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.stream_id!==0&&u.uint32(16).int32(e.stream_id),e.list_index!==0&&u.uint32(24).int32(e.list_index),e.dw_flags!==0&&u.uint32(32).int32(e.dw_flags),e.n_position_low!==0&&u.uint32(40).int32(e.n_position_low),e.n_position_high!==0&&u.uint32(48).int32(e.n_position_high),e.cb_requested!==0&&u.uint32(56).int32(e.cb_requested),e.have_clip_data_id===!0&&u.uint32(64).bool(e.have_clip_data_id),e.clip_data_id!==0&&u.uint32(72).int32(e.clip_data_id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=mr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 2:i.stream_id=r.int32();break;case 3:i.list_index=r.int32();break;case 4:i.dw_flags=r.int32();break;case 5:i.n_position_low=r.int32();break;case 6:i.n_position_high=r.int32();break;case 7:i.cb_requested=r.int32();break;case 8:i.have_clip_data_id=r.bool();break;case 9:i.clip_data_id=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,stream_id:a(e.stream_id)?Number(e.stream_id):0,list_index:a(e.list_index)?Number(e.list_index):0,dw_flags:a(e.dw_flags)?Number(e.dw_flags):0,n_position_low:a(e.n_position_low)?Number(e.n_position_low):0,n_position_high:a(e.n_position_high)?Number(e.n_position_high):0,cb_requested:a(e.cb_requested)?Number(e.cb_requested):0,have_clip_data_id:a(e.have_clip_data_id)?Boolean(e.have_clip_data_id):!1,clip_data_id:a(e.clip_data_id)?Number(e.clip_data_id):0}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.stream_id!==void 0&&(u.stream_id=Math.round(e.stream_id)),e.list_index!==void 0&&(u.list_index=Math.round(e.list_index)),e.dw_flags!==void 0&&(u.dw_flags=Math.round(e.dw_flags)),e.n_position_low!==void 0&&(u.n_position_low=Math.round(e.n_position_low)),e.n_position_high!==void 0&&(u.n_position_high=Math.round(e.n_position_high)),e.cb_requested!==void 0&&(u.cb_requested=Math.round(e.cb_requested)),e.have_clip_data_id!==void 0&&(u.have_clip_data_id=e.have_clip_data_id),e.clip_data_id!==void 0&&(u.clip_data_id=Math.round(e.clip_data_id)),u},fromPartial(e){var r,n,i,t,s,l,c,p,v;const u=mr();return u.conn_id=(r=e.conn_id)!=null?r:0,u.stream_id=(n=e.stream_id)!=null?n:0,u.list_index=(i=e.list_index)!=null?i:0,u.dw_flags=(t=e.dw_flags)!=null?t:0,u.n_position_low=(s=e.n_position_low)!=null?s:0,u.n_position_high=(l=e.n_position_high)!=null?l:0,u.cb_requested=(c=e.cb_requested)!=null?c:0,u.have_clip_data_id=(p=e.have_clip_data_id)!=null?p:!1,u.clip_data_id=(v=e.clip_data_id)!=null?v:0,u}};function Fr(){return{conn_id:0,msg_flags:0,stream_id:0,requested_data:new Uint8Array}}const Ne={encode(e,u=o.Writer.create()){return e.conn_id!==0&&u.uint32(8).int32(e.conn_id),e.msg_flags!==0&&u.uint32(24).int32(e.msg_flags),e.stream_id!==0&&u.uint32(32).int32(e.stream_id),e.requested_data.length!==0&&u.uint32(42).bytes(e.requested_data),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Fr();for(;r.pos>>3){case 1:i.conn_id=r.int32();break;case 3:i.msg_flags=r.int32();break;case 4:i.stream_id=r.int32();break;case 5:i.requested_data=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{conn_id:a(e.conn_id)?Number(e.conn_id):0,msg_flags:a(e.msg_flags)?Number(e.msg_flags):0,stream_id:a(e.stream_id)?Number(e.stream_id):0,requested_data:a(e.requested_data)?h(e.requested_data):new Uint8Array}},toJSON(e){const u={};return e.conn_id!==void 0&&(u.conn_id=Math.round(e.conn_id)),e.msg_flags!==void 0&&(u.msg_flags=Math.round(e.msg_flags)),e.stream_id!==void 0&&(u.stream_id=Math.round(e.stream_id)),e.requested_data!==void 0&&(u.requested_data=m(e.requested_data!==void 0?e.requested_data:new Uint8Array)),u},fromPartial(e){var r,n,i,t;const u=Fr();return u.conn_id=(r=e.conn_id)!=null?r:0,u.msg_flags=(n=e.msg_flags)!=null?n:0,u.stream_id=(i=e.stream_id)!=null?i:0,u.requested_data=(t=e.requested_data)!=null?t:new Uint8Array,u}};function Dr(){return{ready:void 0,format_list:void 0,format_list_response:void 0,format_data_request:void 0,format_data_response:void 0,file_contents_request:void 0,file_contents_response:void 0}}const xe={encode(e,u=o.Writer.create()){return e.ready!==void 0&&ke.encode(e.ready,u.uint32(10).fork()).ldelim(),e.format_list!==void 0&&Ce.encode(e.format_list,u.uint32(18).fork()).ldelim(),e.format_list_response!==void 0&&Be.encode(e.format_list_response,u.uint32(26).fork()).ldelim(),e.format_data_request!==void 0&&Se.encode(e.format_data_request,u.uint32(34).fork()).ldelim(),e.format_data_response!==void 0&&we.encode(e.format_data_response,u.uint32(42).fork()).ldelim(),e.file_contents_request!==void 0&&ge.encode(e.file_contents_request,u.uint32(50).fork()).ldelim(),e.file_contents_response!==void 0&&Ne.encode(e.file_contents_response,u.uint32(58).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Dr();for(;r.pos>>3){case 1:i.ready=ke.decode(r,r.uint32());break;case 2:i.format_list=Ce.decode(r,r.uint32());break;case 3:i.format_list_response=Be.decode(r,r.uint32());break;case 4:i.format_data_request=Se.decode(r,r.uint32());break;case 5:i.format_data_response=we.decode(r,r.uint32());break;case 6:i.file_contents_request=ge.decode(r,r.uint32());break;case 7:i.file_contents_response=Ne.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{ready:a(e.ready)?ke.fromJSON(e.ready):void 0,format_list:a(e.format_list)?Ce.fromJSON(e.format_list):void 0,format_list_response:a(e.format_list_response)?Be.fromJSON(e.format_list_response):void 0,format_data_request:a(e.format_data_request)?Se.fromJSON(e.format_data_request):void 0,format_data_response:a(e.format_data_response)?we.fromJSON(e.format_data_response):void 0,file_contents_request:a(e.file_contents_request)?ge.fromJSON(e.file_contents_request):void 0,file_contents_response:a(e.file_contents_response)?Ne.fromJSON(e.file_contents_response):void 0}},toJSON(e){const u={};return e.ready!==void 0&&(u.ready=e.ready?ke.toJSON(e.ready):void 0),e.format_list!==void 0&&(u.format_list=e.format_list?Ce.toJSON(e.format_list):void 0),e.format_list_response!==void 0&&(u.format_list_response=e.format_list_response?Be.toJSON(e.format_list_response):void 0),e.format_data_request!==void 0&&(u.format_data_request=e.format_data_request?Se.toJSON(e.format_data_request):void 0),e.format_data_response!==void 0&&(u.format_data_response=e.format_data_response?we.toJSON(e.format_data_response):void 0),e.file_contents_request!==void 0&&(u.file_contents_request=e.file_contents_request?ge.toJSON(e.file_contents_request):void 0),e.file_contents_response!==void 0&&(u.file_contents_response=e.file_contents_response?Ne.toJSON(e.file_contents_response):void 0),u},fromPartial(e){const u=Dr();return u.ready=e.ready!==void 0&&e.ready!==null?ke.fromPartial(e.ready):void 0,u.format_list=e.format_list!==void 0&&e.format_list!==null?Ce.fromPartial(e.format_list):void 0,u.format_list_response=e.format_list_response!==void 0&&e.format_list_response!==null?Be.fromPartial(e.format_list_response):void 0,u.format_data_request=e.format_data_request!==void 0&&e.format_data_request!==null?Se.fromPartial(e.format_data_request):void 0,u.format_data_response=e.format_data_response!==void 0&&e.format_data_response!==null?we.fromPartial(e.format_data_response):void 0,u.file_contents_request=e.file_contents_request!==void 0&&e.file_contents_request!==null?ge.fromPartial(e.file_contents_request):void 0,u.file_contents_response=e.file_contents_response!==void 0&&e.file_contents_response!==null?Ne.fromPartial(e.file_contents_response):void 0,u}};function Ar(){return{display:0,x:0,y:0,width:0,height:0}}const q={encode(e,u=o.Writer.create()){return e.display!==0&&u.uint32(8).int32(e.display),e.x!==0&&u.uint32(16).sint32(e.x),e.y!==0&&u.uint32(24).sint32(e.y),e.width!==0&&u.uint32(32).int32(e.width),e.height!==0&&u.uint32(40).int32(e.height),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ar();for(;r.pos>>3){case 1:i.display=r.int32();break;case 2:i.x=r.sint32();break;case 3:i.y=r.sint32();break;case 4:i.width=r.int32();break;case 5:i.height=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{display:a(e.display)?Number(e.display):0,x:a(e.x)?Number(e.x):0,y:a(e.y)?Number(e.y):0,width:a(e.width)?Number(e.width):0,height:a(e.height)?Number(e.height):0}},toJSON(e){const u={};return e.display!==void 0&&(u.display=Math.round(e.display)),e.x!==void 0&&(u.x=Math.round(e.x)),e.y!==void 0&&(u.y=Math.round(e.y)),e.width!==void 0&&(u.width=Math.round(e.width)),e.height!==void 0&&(u.height=Math.round(e.height)),u},fromPartial(e){var r,n,i,t,s;const u=Ar();return u.display=(r=e.display)!=null?r:0,u.x=(n=e.x)!=null?n:0,u.y=(i=e.y)!=null?i:0,u.width=(t=e.width)!=null?t:0,u.height=(s=e.height)!=null?s:0,u}};function kr(){return{permission:0,enabled:!1}}const Re={encode(e,u=o.Writer.create()){return e.permission!==0&&u.uint32(8).int32(e.permission),e.enabled===!0&&u.uint32(16).bool(e.enabled),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=kr();for(;r.pos>>3){case 1:i.permission=r.int32();break;case 2:i.enabled=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{permission:a(e.permission)?Si(e.permission):0,enabled:a(e.enabled)?Boolean(e.enabled):!1}},toJSON(e){const u={};return e.permission!==void 0&&(u.permission=wi(e.permission)),e.enabled!==void 0&&(u.enabled=e.enabled),u},fromPartial(e){var r,n;const u=kr();return u.permission=(r=e.permission)!=null?r:0,u.enabled=(n=e.enabled)!=null?n:!1,u}};function yr(){return{image_quality:0,lock_after_session_end:0,show_remote_cursor:0,privacy_mode:0,block_input:0,custom_image_quality:0,disable_audio:0,disable_clipboard:0,enable_file_transfer:0}}const f={encode(e,u=o.Writer.create()){return e.image_quality!==0&&u.uint32(8).int32(e.image_quality),e.lock_after_session_end!==0&&u.uint32(16).int32(e.lock_after_session_end),e.show_remote_cursor!==0&&u.uint32(24).int32(e.show_remote_cursor),e.privacy_mode!==0&&u.uint32(32).int32(e.privacy_mode),e.block_input!==0&&u.uint32(40).int32(e.block_input),e.custom_image_quality!==0&&u.uint32(48).int32(e.custom_image_quality),e.disable_audio!==0&&u.uint32(56).int32(e.disable_audio),e.disable_clipboard!==0&&u.uint32(64).int32(e.disable_clipboard),e.enable_file_transfer!==0&&u.uint32(72).int32(e.enable_file_transfer),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=yr();for(;r.pos>>3){case 1:i.image_quality=r.int32();break;case 2:i.lock_after_session_end=r.int32();break;case 3:i.show_remote_cursor=r.int32();break;case 4:i.privacy_mode=r.int32();break;case 5:i.block_input=r.int32();break;case 6:i.custom_image_quality=r.int32();break;case 7:i.disable_audio=r.int32();break;case 8:i.disable_clipboard=r.int32();break;case 9:i.enable_file_transfer=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{image_quality:a(e.image_quality)?Ci(e.image_quality):0,lock_after_session_end:a(e.lock_after_session_end)?R(e.lock_after_session_end):0,show_remote_cursor:a(e.show_remote_cursor)?R(e.show_remote_cursor):0,privacy_mode:a(e.privacy_mode)?R(e.privacy_mode):0,block_input:a(e.block_input)?R(e.block_input):0,custom_image_quality:a(e.custom_image_quality)?Number(e.custom_image_quality):0,disable_audio:a(e.disable_audio)?R(e.disable_audio):0,disable_clipboard:a(e.disable_clipboard)?R(e.disable_clipboard):0,enable_file_transfer:a(e.enable_file_transfer)?R(e.enable_file_transfer):0}},toJSON(e){const u={};return e.image_quality!==void 0&&(u.image_quality=Bi(e.image_quality)),e.lock_after_session_end!==void 0&&(u.lock_after_session_end=P(e.lock_after_session_end)),e.show_remote_cursor!==void 0&&(u.show_remote_cursor=P(e.show_remote_cursor)),e.privacy_mode!==void 0&&(u.privacy_mode=P(e.privacy_mode)),e.block_input!==void 0&&(u.block_input=P(e.block_input)),e.custom_image_quality!==void 0&&(u.custom_image_quality=Math.round(e.custom_image_quality)),e.disable_audio!==void 0&&(u.disable_audio=P(e.disable_audio)),e.disable_clipboard!==void 0&&(u.disable_clipboard=P(e.disable_clipboard)),e.enable_file_transfer!==void 0&&(u.enable_file_transfer=P(e.enable_file_transfer)),u},fromPartial(e){var r,n,i,t,s,l,c,p,v;const u=yr();return u.image_quality=(r=e.image_quality)!=null?r:0,u.lock_after_session_end=(n=e.lock_after_session_end)!=null?n:0,u.show_remote_cursor=(i=e.show_remote_cursor)!=null?i:0,u.privacy_mode=(t=e.privacy_mode)!=null?t:0,u.block_input=(s=e.block_input)!=null?s:0,u.custom_image_quality=(l=e.custom_image_quality)!=null?l:0,u.disable_audio=(c=e.disable_audio)!=null?c:0,u.disable_clipboard=(p=e.disable_clipboard)!=null?p:0,u.enable_file_transfer=(v=e.enable_file_transfer)!=null?v:0,u}};function Cr(){return{opt:void 0,error:""}}const Pe={encode(e,u=o.Writer.create()){return e.opt!==void 0&&f.encode(e.opt,u.uint32(10).fork()).ldelim(),e.error!==""&&u.uint32(18).string(e.error),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Cr();for(;r.pos>>3){case 1:i.opt=f.decode(r,r.uint32());break;case 2:i.error=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{opt:a(e.opt)?f.fromJSON(e.opt):void 0,error:a(e.error)?String(e.error):""}},toJSON(e){const u={};return e.opt!==void 0&&(u.opt=e.opt?f.toJSON(e.opt):void 0),e.error!==void 0&&(u.error=e.error),u},fromPartial(e){var r;const u=Cr();return u.opt=e.opt!==void 0&&e.opt!==null?f.fromPartial(e.opt):void 0,u.error=(r=e.error)!=null?r:"",u}};function Br(){return{time:0,from_client:!1}}const be={encode(e,u=o.Writer.create()){return e.time!==0&&u.uint32(8).int64(e.time),e.from_client===!0&&u.uint32(16).bool(e.from_client),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Br();for(;r.pos>>3){case 1:i.time=z(r.int64());break;case 2:i.from_client=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{time:a(e.time)?Number(e.time):0,from_client:a(e.from_client)?Boolean(e.from_client):!1}},toJSON(e){const u={};return e.time!==void 0&&(u.time=Math.round(e.time)),e.from_client!==void 0&&(u.from_client=e.from_client),u},fromPartial(e){var r,n;const u=Br();return u.time=(r=e.time)!=null?r:0,u.from_client=(n=e.from_client)!=null?n:!1,u}};function Sr(){return{asymmetric_value:new Uint8Array,symmetric_value:new Uint8Array}}const k={encode(e,u=o.Writer.create()){return e.asymmetric_value.length!==0&&u.uint32(10).bytes(e.asymmetric_value),e.symmetric_value.length!==0&&u.uint32(18).bytes(e.symmetric_value),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Sr();for(;r.pos>>3){case 1:i.asymmetric_value=r.bytes();break;case 2:i.symmetric_value=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{asymmetric_value:a(e.asymmetric_value)?h(e.asymmetric_value):new Uint8Array,symmetric_value:a(e.symmetric_value)?h(e.symmetric_value):new Uint8Array}},toJSON(e){const u={};return e.asymmetric_value!==void 0&&(u.asymmetric_value=m(e.asymmetric_value!==void 0?e.asymmetric_value:new Uint8Array)),e.symmetric_value!==void 0&&(u.symmetric_value=m(e.symmetric_value!==void 0?e.symmetric_value:new Uint8Array)),u},fromPartial(e){var r,n;const u=Sr();return u.asymmetric_value=(r=e.asymmetric_value)!=null?r:new Uint8Array,u.symmetric_value=(n=e.symmetric_value)!=null?n:new Uint8Array,u}};function wr(){return{id:new Uint8Array}}const Oe={encode(e,u=o.Writer.create()){return e.id.length!==0&&u.uint32(10).bytes(e.id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=wr();for(;r.pos>>3){case 1:i.id=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:a(e.id)?h(e.id):new Uint8Array}},toJSON(e){const u={};return e.id!==void 0&&(u.id=m(e.id!==void 0?e.id:new Uint8Array)),u},fromPartial(e){var r;const u=wr();return u.id=(r=e.id)!=null?r:new Uint8Array,u}};function gr(){return{sample_rate:0,channels:0}}const Ie={encode(e,u=o.Writer.create()){return e.sample_rate!==0&&u.uint32(8).uint32(e.sample_rate),e.channels!==0&&u.uint32(16).uint32(e.channels),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=gr();for(;r.pos>>3){case 1:i.sample_rate=r.uint32();break;case 2:i.channels=r.uint32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{sample_rate:a(e.sample_rate)?Number(e.sample_rate):0,channels:a(e.channels)?Number(e.channels):0}},toJSON(e){const u={};return e.sample_rate!==void 0&&(u.sample_rate=Math.round(e.sample_rate)),e.channels!==void 0&&(u.channels=Math.round(e.channels)),u},fromPartial(e){var r,n;const u=gr();return u.sample_rate=(r=e.sample_rate)!=null?r:0,u.channels=(n=e.channels)!=null?n:0,u}};function Nr(){return{data:new Uint8Array}}const Te={encode(e,u=o.Writer.create()){return e.data.length!==0&&u.uint32(10).bytes(e.data),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Nr();for(;r.pos>>3){case 1:i.data=r.bytes();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{data:a(e.data)?h(e.data):new Uint8Array}},toJSON(e){const u={};return e.data!==void 0&&(u.data=m(e.data!==void 0?e.data:new Uint8Array)),u},fromPartial(e){var r;const u=Nr();return u.data=(r=e.data)!=null?r:new Uint8Array,u}};function xr(){return{chat_message:void 0,switch_display:void 0,permission_info:void 0,option:void 0,audio_format:void 0,close_reason:void 0,refresh_video:void 0,option_response:void 0,video_received:void 0}}const B={encode(e,u=o.Writer.create()){return e.chat_message!==void 0&&ue.encode(e.chat_message,u.uint32(34).fork()).ldelim(),e.switch_display!==void 0&&q.encode(e.switch_display,u.uint32(42).fork()).ldelim(),e.permission_info!==void 0&&Re.encode(e.permission_info,u.uint32(50).fork()).ldelim(),e.option!==void 0&&f.encode(e.option,u.uint32(58).fork()).ldelim(),e.audio_format!==void 0&&Ie.encode(e.audio_format,u.uint32(66).fork()).ldelim(),e.close_reason!==void 0&&u.uint32(74).string(e.close_reason),e.refresh_video!==void 0&&u.uint32(80).bool(e.refresh_video),e.option_response!==void 0&&Pe.encode(e.option_response,u.uint32(90).fork()).ldelim(),e.video_received!==void 0&&u.uint32(96).bool(e.video_received),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=xr();for(;r.pos>>3){case 4:i.chat_message=ue.decode(r,r.uint32());break;case 5:i.switch_display=q.decode(r,r.uint32());break;case 6:i.permission_info=Re.decode(r,r.uint32());break;case 7:i.option=f.decode(r,r.uint32());break;case 8:i.audio_format=Ie.decode(r,r.uint32());break;case 9:i.close_reason=r.string();break;case 10:i.refresh_video=r.bool();break;case 11:i.option_response=Pe.decode(r,r.uint32());break;case 12:i.video_received=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{chat_message:a(e.chat_message)?ue.fromJSON(e.chat_message):void 0,switch_display:a(e.switch_display)?q.fromJSON(e.switch_display):void 0,permission_info:a(e.permission_info)?Re.fromJSON(e.permission_info):void 0,option:a(e.option)?f.fromJSON(e.option):void 0,audio_format:a(e.audio_format)?Ie.fromJSON(e.audio_format):void 0,close_reason:a(e.close_reason)?String(e.close_reason):void 0,refresh_video:a(e.refresh_video)?Boolean(e.refresh_video):void 0,option_response:a(e.option_response)?Pe.fromJSON(e.option_response):void 0,video_received:a(e.video_received)?Boolean(e.video_received):void 0}},toJSON(e){const u={};return e.chat_message!==void 0&&(u.chat_message=e.chat_message?ue.toJSON(e.chat_message):void 0),e.switch_display!==void 0&&(u.switch_display=e.switch_display?q.toJSON(e.switch_display):void 0),e.permission_info!==void 0&&(u.permission_info=e.permission_info?Re.toJSON(e.permission_info):void 0),e.option!==void 0&&(u.option=e.option?f.toJSON(e.option):void 0),e.audio_format!==void 0&&(u.audio_format=e.audio_format?Ie.toJSON(e.audio_format):void 0),e.close_reason!==void 0&&(u.close_reason=e.close_reason),e.refresh_video!==void 0&&(u.refresh_video=e.refresh_video),e.option_response!==void 0&&(u.option_response=e.option_response?Pe.toJSON(e.option_response):void 0),e.video_received!==void 0&&(u.video_received=e.video_received),u},fromPartial(e){var r,n,i;const u=xr();return u.chat_message=e.chat_message!==void 0&&e.chat_message!==null?ue.fromPartial(e.chat_message):void 0,u.switch_display=e.switch_display!==void 0&&e.switch_display!==null?q.fromPartial(e.switch_display):void 0,u.permission_info=e.permission_info!==void 0&&e.permission_info!==null?Re.fromPartial(e.permission_info):void 0,u.option=e.option!==void 0&&e.option!==null?f.fromPartial(e.option):void 0,u.audio_format=e.audio_format!==void 0&&e.audio_format!==null?Ie.fromPartial(e.audio_format):void 0,u.close_reason=(r=e.close_reason)!=null?r:void 0,u.refresh_video=(n=e.refresh_video)!=null?n:void 0,u.option_response=e.option_response!==void 0&&e.option_response!==null?Pe.fromPartial(e.option_response):void 0,u.video_received=(i=e.video_received)!=null?i:void 0,u}};function Rr(){return{signed_id:void 0,public_key:void 0,test_delay:void 0,video_frame:void 0,login_request:void 0,login_response:void 0,hash:void 0,mouse_event:void 0,audio_frame:void 0,cursor_data:void 0,cursor_position:void 0,cursor_id:void 0,key_event:void 0,clipboard:void 0,file_action:void 0,file_response:void 0,misc:void 0,cliprdr:void 0}}const au={encode(e,u=o.Writer.create()){return e.signed_id!==void 0&&Oe.encode(e.signed_id,u.uint32(26).fork()).ldelim(),e.public_key!==void 0&&k.encode(e.public_key,u.uint32(34).fork()).ldelim(),e.test_delay!==void 0&&be.encode(e.test_delay,u.uint32(42).fork()).ldelim(),e.video_frame!==void 0&&X.encode(e.video_frame,u.uint32(50).fork()).ldelim(),e.login_request!==void 0&&T.encode(e.login_request,u.uint32(58).fork()).ldelim(),e.login_response!==void 0&&ie.encode(e.login_response,u.uint32(66).fork()).ldelim(),e.hash!==void 0&&oe.encode(e.hash,u.uint32(74).fork()).ldelim(),e.mouse_event!==void 0&&M.encode(e.mouse_event,u.uint32(82).fork()).ldelim(),e.audio_frame!==void 0&&Te.encode(e.audio_frame,u.uint32(90).fork()).ldelim(),e.cursor_data!==void 0&&ne.encode(e.cursor_data,u.uint32(98).fork()).ldelim(),e.cursor_position!==void 0&&te.encode(e.cursor_position,u.uint32(106).fork()).ldelim(),e.cursor_id!==void 0&&u.uint32(112).uint64(e.cursor_id),e.key_event!==void 0&&E.encode(e.key_event,u.uint32(122).fork()).ldelim(),e.clipboard!==void 0&&ae.encode(e.clipboard,u.uint32(130).fork()).ldelim(),e.file_action!==void 0&&ce.encode(e.file_action,u.uint32(138).fork()).ldelim(),e.file_response!==void 0&&_e.encode(e.file_response,u.uint32(146).fork()).ldelim(),e.misc!==void 0&&B.encode(e.misc,u.uint32(154).fork()).ldelim(),e.cliprdr!==void 0&&xe.encode(e.cliprdr,u.uint32(162).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Rr();for(;r.pos>>3){case 3:i.signed_id=Oe.decode(r,r.uint32());break;case 4:i.public_key=k.decode(r,r.uint32());break;case 5:i.test_delay=be.decode(r,r.uint32());break;case 6:i.video_frame=X.decode(r,r.uint32());break;case 7:i.login_request=T.decode(r,r.uint32());break;case 8:i.login_response=ie.decode(r,r.uint32());break;case 9:i.hash=oe.decode(r,r.uint32());break;case 10:i.mouse_event=M.decode(r,r.uint32());break;case 11:i.audio_frame=Te.decode(r,r.uint32());break;case 12:i.cursor_data=ne.decode(r,r.uint32());break;case 13:i.cursor_position=te.decode(r,r.uint32());break;case 14:i.cursor_id=z(r.uint64());break;case 15:i.key_event=E.decode(r,r.uint32());break;case 16:i.clipboard=ae.decode(r,r.uint32());break;case 17:i.file_action=ce.decode(r,r.uint32());break;case 18:i.file_response=_e.decode(r,r.uint32());break;case 19:i.misc=B.decode(r,r.uint32());break;case 20:i.cliprdr=xe.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{signed_id:a(e.signed_id)?Oe.fromJSON(e.signed_id):void 0,public_key:a(e.public_key)?k.fromJSON(e.public_key):void 0,test_delay:a(e.test_delay)?be.fromJSON(e.test_delay):void 0,video_frame:a(e.video_frame)?X.fromJSON(e.video_frame):void 0,login_request:a(e.login_request)?T.fromJSON(e.login_request):void 0,login_response:a(e.login_response)?ie.fromJSON(e.login_response):void 0,hash:a(e.hash)?oe.fromJSON(e.hash):void 0,mouse_event:a(e.mouse_event)?M.fromJSON(e.mouse_event):void 0,audio_frame:a(e.audio_frame)?Te.fromJSON(e.audio_frame):void 0,cursor_data:a(e.cursor_data)?ne.fromJSON(e.cursor_data):void 0,cursor_position:a(e.cursor_position)?te.fromJSON(e.cursor_position):void 0,cursor_id:a(e.cursor_id)?Number(e.cursor_id):void 0,key_event:a(e.key_event)?E.fromJSON(e.key_event):void 0,clipboard:a(e.clipboard)?ae.fromJSON(e.clipboard):void 0,file_action:a(e.file_action)?ce.fromJSON(e.file_action):void 0,file_response:a(e.file_response)?_e.fromJSON(e.file_response):void 0,misc:a(e.misc)?B.fromJSON(e.misc):void 0,cliprdr:a(e.cliprdr)?xe.fromJSON(e.cliprdr):void 0}},toJSON(e){const u={};return e.signed_id!==void 0&&(u.signed_id=e.signed_id?Oe.toJSON(e.signed_id):void 0),e.public_key!==void 0&&(u.public_key=e.public_key?k.toJSON(e.public_key):void 0),e.test_delay!==void 0&&(u.test_delay=e.test_delay?be.toJSON(e.test_delay):void 0),e.video_frame!==void 0&&(u.video_frame=e.video_frame?X.toJSON(e.video_frame):void 0),e.login_request!==void 0&&(u.login_request=e.login_request?T.toJSON(e.login_request):void 0),e.login_response!==void 0&&(u.login_response=e.login_response?ie.toJSON(e.login_response):void 0),e.hash!==void 0&&(u.hash=e.hash?oe.toJSON(e.hash):void 0),e.mouse_event!==void 0&&(u.mouse_event=e.mouse_event?M.toJSON(e.mouse_event):void 0),e.audio_frame!==void 0&&(u.audio_frame=e.audio_frame?Te.toJSON(e.audio_frame):void 0),e.cursor_data!==void 0&&(u.cursor_data=e.cursor_data?ne.toJSON(e.cursor_data):void 0),e.cursor_position!==void 0&&(u.cursor_position=e.cursor_position?te.toJSON(e.cursor_position):void 0),e.cursor_id!==void 0&&(u.cursor_id=Math.round(e.cursor_id)),e.key_event!==void 0&&(u.key_event=e.key_event?E.toJSON(e.key_event):void 0),e.clipboard!==void 0&&(u.clipboard=e.clipboard?ae.toJSON(e.clipboard):void 0),e.file_action!==void 0&&(u.file_action=e.file_action?ce.toJSON(e.file_action):void 0),e.file_response!==void 0&&(u.file_response=e.file_response?_e.toJSON(e.file_response):void 0),e.misc!==void 0&&(u.misc=e.misc?B.toJSON(e.misc):void 0),e.cliprdr!==void 0&&(u.cliprdr=e.cliprdr?xe.toJSON(e.cliprdr):void 0),u},fromPartial(e){var r;const u=Rr();return u.signed_id=e.signed_id!==void 0&&e.signed_id!==null?Oe.fromPartial(e.signed_id):void 0,u.public_key=e.public_key!==void 0&&e.public_key!==null?k.fromPartial(e.public_key):void 0,u.test_delay=e.test_delay!==void 0&&e.test_delay!==null?be.fromPartial(e.test_delay):void 0,u.video_frame=e.video_frame!==void 0&&e.video_frame!==null?X.fromPartial(e.video_frame):void 0,u.login_request=e.login_request!==void 0&&e.login_request!==null?T.fromPartial(e.login_request):void 0,u.login_response=e.login_response!==void 0&&e.login_response!==null?ie.fromPartial(e.login_response):void 0,u.hash=e.hash!==void 0&&e.hash!==null?oe.fromPartial(e.hash):void 0,u.mouse_event=e.mouse_event!==void 0&&e.mouse_event!==null?M.fromPartial(e.mouse_event):void 0,u.audio_frame=e.audio_frame!==void 0&&e.audio_frame!==null?Te.fromPartial(e.audio_frame):void 0,u.cursor_data=e.cursor_data!==void 0&&e.cursor_data!==null?ne.fromPartial(e.cursor_data):void 0,u.cursor_position=e.cursor_position!==void 0&&e.cursor_position!==null?te.fromPartial(e.cursor_position):void 0,u.cursor_id=(r=e.cursor_id)!=null?r:void 0,u.key_event=e.key_event!==void 0&&e.key_event!==null?E.fromPartial(e.key_event):void 0,u.clipboard=e.clipboard!==void 0&&e.clipboard!==null?ae.fromPartial(e.clipboard):void 0,u.file_action=e.file_action!==void 0&&e.file_action!==null?ce.fromPartial(e.file_action):void 0,u.file_response=e.file_response!==void 0&&e.file_response!==null?_e.fromPartial(e.file_response):void 0,u.misc=e.misc!==void 0&&e.misc!==null?B.fromPartial(e.misc):void 0,u.cliprdr=e.cliprdr!==void 0&&e.cliprdr!==null?xe.fromPartial(e.cliprdr):void 0,u}};var b=(()=>{if(typeof b!="undefined")return b;if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global;throw"Unable to locate global object"})();const gi=b.atob||(e=>b.Buffer.from(e,"base64").toString("binary"));function h(e){const u=gi(e),r=new Uint8Array(u.length);for(let n=0;nb.Buffer.from(e,"binary").toString("base64"));function m(e){const u=[];for(const r of e)u.push(String.fromCharCode(r));return Ni(u.join(""))}function z(e){if(e.gt(Number.MAX_SAFE_INTEGER))throw new b.Error("Value is larger than Number.MAX_SAFE_INTEGER");return e.toNumber()}o.util.Long!==$e&&(o.util.Long=$e,o.configure());function a(e){return e!=null}var su;(function(e){e[e.DEFAULT_CONN=0]="DEFAULT_CONN",e[e.FILE_TRANSFER=1]="FILE_TRANSFER",e[e.PORT_FORWARD=2]="PORT_FORWARD",e[e.RDP=3]="RDP",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(su||(su={}));function Pr(e){switch(e){case 0:case"DEFAULT_CONN":return 0;case 1:case"FILE_TRANSFER":return 1;case 2:case"PORT_FORWARD":return 2;case 3:case"RDP":return 3;case-1:case"UNRECOGNIZED":default:return-1}}function br(e){switch(e){case 0:return"DEFAULT_CONN";case 1:return"FILE_TRANSFER";case 2:return"PORT_FORWARD";case 3:return"RDP";default:return"UNKNOWN"}}var du;(function(e){e[e.UNKNOWN_NAT=0]="UNKNOWN_NAT",e[e.ASYMMETRIC=1]="ASYMMETRIC",e[e.SYMMETRIC=2]="SYMMETRIC",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(du||(du={}));function eu(e){switch(e){case 0:case"UNKNOWN_NAT":return 0;case 1:case"ASYMMETRIC":return 1;case 2:case"SYMMETRIC":return 2;case-1:case"UNRECOGNIZED":default:return-1}}function uu(e){switch(e){case 0:return"UNKNOWN_NAT";case 1:return"ASYMMETRIC";case 2:return"SYMMETRIC";default:return"UNKNOWN"}}var Or;(function(e){e[e.OK=0]="OK",e[e.UUID_MISMATCH=2]="UUID_MISMATCH",e[e.ID_EXISTS=3]="ID_EXISTS",e[e.TOO_FREQUENT=4]="TOO_FREQUENT",e[e.INVALID_ID_FORMAT=5]="INVALID_ID_FORMAT",e[e.NOT_SUPPORT=6]="NOT_SUPPORT",e[e.SERVER_ERROR=7]="SERVER_ERROR",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(Or||(Or={}));function xi(e){switch(e){case 0:case"OK":return 0;case 2:case"UUID_MISMATCH":return 2;case 3:case"ID_EXISTS":return 3;case 4:case"TOO_FREQUENT":return 4;case 5:case"INVALID_ID_FORMAT":return 5;case 6:case"NOT_SUPPORT":return 6;case 7:case"SERVER_ERROR":return 7;case-1:case"UNRECOGNIZED":default:return-1}}function Ri(e){switch(e){case 0:return"OK";case 2:return"UUID_MISMATCH";case 3:return"ID_EXISTS";case 4:return"TOO_FREQUENT";case 5:return"INVALID_ID_FORMAT";case 6:return"NOT_SUPPORT";case 7:return"SERVER_ERROR";default:return"UNKNOWN"}}var O;(function(e){e[e.ID_NOT_EXIST=0]="ID_NOT_EXIST",e[e.OFFLINE=2]="OFFLINE",e[e.LICENSE_MISMATCH=3]="LICENSE_MISMATCH",e[e.LICENSE_OVERUSE=4]="LICENSE_OVERUSE",e[e.UNRECOGNIZED=-1]="UNRECOGNIZED"})(O||(O={}));function Pi(e){switch(e){case 0:case"ID_NOT_EXIST":return 0;case 2:case"OFFLINE":return 2;case 3:case"LICENSE_MISMATCH":return 3;case 4:case"LICENSE_OVERUSE":return 4;case-1:case"UNRECOGNIZED":default:return-1}}function bi(e){switch(e){case 0:return"ID_NOT_EXIST";case 2:return"OFFLINE";case 3:return"LICENSE_MISMATCH";case 4:return"LICENSE_OVERUSE";default:return"UNKNOWN"}}function Ir(){return{id:"",serial:0}}const Me={encode(e,u=o.Writer.create()){return e.id!==""&&u.uint32(10).string(e.id),e.serial!==0&&u.uint32(16).int32(e.serial),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ir();for(;r.pos>>3){case 1:i.id=r.string();break;case 2:i.serial=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:d(e.id)?String(e.id):"",serial:d(e.serial)?Number(e.serial):0}},toJSON(e){const u={};return e.id!==void 0&&(u.id=e.id),e.serial!==void 0&&(u.serial=Math.round(e.serial)),u},fromPartial(e){var r,n;const u=Ir();return u.id=(r=e.id)!=null?r:"",u.serial=(n=e.serial)!=null?n:0,u}};function Tr(){return{request_pk:!1}}const qe={encode(e,u=o.Writer.create()){return e.request_pk===!0&&u.uint32(16).bool(e.request_pk),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Tr();for(;r.pos>>3){case 2:i.request_pk=r.bool();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{request_pk:d(e.request_pk)?Boolean(e.request_pk):!1}},toJSON(e){const u={};return e.request_pk!==void 0&&(u.request_pk=e.request_pk),u},fromPartial(e){var r;const u=Tr();return u.request_pk=(r=e.request_pk)!=null?r:!1,u}};function Mr(){return{id:"",nat_type:0,licence_key:"",conn_type:0,token:""}}const J={encode(e,u=o.Writer.create()){return e.id!==""&&u.uint32(10).string(e.id),e.nat_type!==0&&u.uint32(16).int32(e.nat_type),e.licence_key!==""&&u.uint32(26).string(e.licence_key),e.conn_type!==0&&u.uint32(32).int32(e.conn_type),e.token!==""&&u.uint32(42).string(e.token),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Mr();for(;r.pos>>3){case 1:i.id=r.string();break;case 2:i.nat_type=r.int32();break;case 3:i.licence_key=r.string();break;case 4:i.conn_type=r.int32();break;case 5:i.token=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:d(e.id)?String(e.id):"",nat_type:d(e.nat_type)?eu(e.nat_type):0,licence_key:d(e.licence_key)?String(e.licence_key):"",conn_type:d(e.conn_type)?Pr(e.conn_type):0,token:d(e.token)?String(e.token):""}},toJSON(e){const u={};return e.id!==void 0&&(u.id=e.id),e.nat_type!==void 0&&(u.nat_type=uu(e.nat_type)),e.licence_key!==void 0&&(u.licence_key=e.licence_key),e.conn_type!==void 0&&(u.conn_type=br(e.conn_type)),e.token!==void 0&&(u.token=e.token),u},fromPartial(e){var r,n,i,t,s;const u=Mr();return u.id=(r=e.id)!=null?r:"",u.nat_type=(n=e.nat_type)!=null?n:0,u.licence_key=(i=e.licence_key)!=null?i:"",u.conn_type=(t=e.conn_type)!=null?t:0,u.token=(s=e.token)!=null?s:"",u}};function qr(){return{socket_addr:new Uint8Array,relay_server:"",nat_type:0}}const ze={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.relay_server!==""&&u.uint32(18).string(e.relay_server),e.nat_type!==0&&u.uint32(24).int32(e.nat_type),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=qr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.relay_server=r.string();break;case 3:i.nat_type=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,relay_server:d(e.relay_server)?String(e.relay_server):"",nat_type:d(e.nat_type)?eu(e.nat_type):0}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.nat_type!==void 0&&(u.nat_type=uu(e.nat_type)),u},fromPartial(e){var r,n,i;const u=qr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.relay_server=(n=e.relay_server)!=null?n:"",u.nat_type=(i=e.nat_type)!=null?i:0,u}};function zr(){return{serial:0}}const Je={encode(e,u=o.Writer.create()){return e.serial!==0&&u.uint32(8).int32(e.serial),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=zr();for(;r.pos>>3){case 1:i.serial=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{serial:d(e.serial)?Number(e.serial):0}},toJSON(e){const u={};return e.serial!==void 0&&(u.serial=Math.round(e.serial)),u},fromPartial(e){var r;const u=zr();return u.serial=(r=e.serial)!=null?r:0,u}};function Jr(){return{port:0,cu:void 0}}const Le={encode(e,u=o.Writer.create()){return e.port!==0&&u.uint32(8).int32(e.port),e.cu!==void 0&&S.encode(e.cu,u.uint32(18).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Jr();for(;r.pos>>3){case 1:i.port=r.int32();break;case 2:i.cu=S.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{port:d(e.port)?Number(e.port):0,cu:d(e.cu)?S.fromJSON(e.cu):void 0}},toJSON(e){const u={};return e.port!==void 0&&(u.port=Math.round(e.port)),e.cu!==void 0&&(u.cu=e.cu?S.toJSON(e.cu):void 0),u},fromPartial(e){var r;const u=Jr();return u.port=(r=e.port)!=null?r:0,u.cu=e.cu!==void 0&&e.cu!==null?S.fromPartial(e.cu):void 0,u}};function Lr(){return{socket_addr:new Uint8Array,id:"",relay_server:"",nat_type:0,version:""}}const Ue={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.id!==""&&u.uint32(18).string(e.id),e.relay_server!==""&&u.uint32(26).string(e.relay_server),e.nat_type!==0&&u.uint32(32).int32(e.nat_type),e.version!==""&&u.uint32(42).string(e.version),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Lr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.id=r.string();break;case 3:i.relay_server=r.string();break;case 4:i.nat_type=r.int32();break;case 5:i.version=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,id:d(e.id)?String(e.id):"",relay_server:d(e.relay_server)?String(e.relay_server):"",nat_type:d(e.nat_type)?eu(e.nat_type):0,version:d(e.version)?String(e.version):""}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.id!==void 0&&(u.id=e.id),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.nat_type!==void 0&&(u.nat_type=uu(e.nat_type)),e.version!==void 0&&(u.version=e.version),u},fromPartial(e){var r,n,i,t,s;const u=Lr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.id=(n=e.id)!=null?n:"",u.relay_server=(i=e.relay_server)!=null?i:"",u.nat_type=(t=e.nat_type)!=null?t:0,u.version=(s=e.version)!=null?s:"",u}};function Ur(){return{id:"",uuid:new Uint8Array,pk:new Uint8Array,old_id:""}}const Ve={encode(e,u=o.Writer.create()){return e.id!==""&&u.uint32(10).string(e.id),e.uuid.length!==0&&u.uint32(18).bytes(e.uuid),e.pk.length!==0&&u.uint32(26).bytes(e.pk),e.old_id!==""&&u.uint32(34).string(e.old_id),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Ur();for(;r.pos>>3){case 1:i.id=r.string();break;case 2:i.uuid=r.bytes();break;case 3:i.pk=r.bytes();break;case 4:i.old_id=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:d(e.id)?String(e.id):"",uuid:d(e.uuid)?F(e.uuid):new Uint8Array,pk:d(e.pk)?F(e.pk):new Uint8Array,old_id:d(e.old_id)?String(e.old_id):""}},toJSON(e){const u={};return e.id!==void 0&&(u.id=e.id),e.uuid!==void 0&&(u.uuid=D(e.uuid!==void 0?e.uuid:new Uint8Array)),e.pk!==void 0&&(u.pk=D(e.pk!==void 0?e.pk:new Uint8Array)),e.old_id!==void 0&&(u.old_id=e.old_id),u},fromPartial(e){var r,n,i,t;const u=Ur();return u.id=(r=e.id)!=null?r:"",u.uuid=(n=e.uuid)!=null?n:new Uint8Array,u.pk=(i=e.pk)!=null?i:new Uint8Array,u.old_id=(t=e.old_id)!=null?t:"",u}};function Vr(){return{result:0}}const We={encode(e,u=o.Writer.create()){return e.result!==0&&u.uint32(8).int32(e.result),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Vr();for(;r.pos>>3){case 1:i.result=r.int32();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{result:d(e.result)?xi(e.result):0}},toJSON(e){const u={};return e.result!==void 0&&(u.result=Ri(e.result)),u},fromPartial(e){var r;const u=Vr();return u.result=(r=e.result)!=null?r:0,u}};function Wr(){return{socket_addr:new Uint8Array,pk:new Uint8Array,failure:0,relay_server:"",nat_type:void 0,is_local:void 0,other_failure:""}}const He={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.pk.length!==0&&u.uint32(18).bytes(e.pk),e.failure!==0&&u.uint32(24).int32(e.failure),e.relay_server!==""&&u.uint32(34).string(e.relay_server),e.nat_type!==void 0&&u.uint32(40).int32(e.nat_type),e.is_local!==void 0&&u.uint32(48).bool(e.is_local),e.other_failure!==""&&u.uint32(58).string(e.other_failure),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Wr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.pk=r.bytes();break;case 3:i.failure=r.int32();break;case 4:i.relay_server=r.string();break;case 5:i.nat_type=r.int32();break;case 6:i.is_local=r.bool();break;case 7:i.other_failure=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,pk:d(e.pk)?F(e.pk):new Uint8Array,failure:d(e.failure)?Pi(e.failure):0,relay_server:d(e.relay_server)?String(e.relay_server):"",nat_type:d(e.nat_type)?eu(e.nat_type):void 0,is_local:d(e.is_local)?Boolean(e.is_local):void 0,other_failure:d(e.other_failure)?String(e.other_failure):""}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.pk!==void 0&&(u.pk=D(e.pk!==void 0?e.pk:new Uint8Array)),e.failure!==void 0&&(u.failure=bi(e.failure)),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.nat_type!==void 0&&(u.nat_type=e.nat_type!==void 0?uu(e.nat_type):void 0),e.is_local!==void 0&&(u.is_local=e.is_local),e.other_failure!==void 0&&(u.other_failure=e.other_failure),u},fromPartial(e){var r,n,i,t,s,l,c;const u=Wr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.pk=(n=e.pk)!=null?n:new Uint8Array,u.failure=(i=e.failure)!=null?i:0,u.relay_server=(t=e.relay_server)!=null?t:"",u.nat_type=(s=e.nat_type)!=null?s:void 0,u.is_local=(l=e.is_local)!=null?l:void 0,u.other_failure=(c=e.other_failure)!=null?c:"",u}};function Hr(){return{serial:0,rendezvous_servers:[]}}const S={encode(e,u=o.Writer.create()){e.serial!==0&&u.uint32(8).int32(e.serial);for(const r of e.rendezvous_servers)u.uint32(18).string(r);return u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Hr();for(;r.pos>>3){case 1:i.serial=r.int32();break;case 2:i.rendezvous_servers.push(r.string());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{serial:d(e.serial)?Number(e.serial):0,rendezvous_servers:Array.isArray(e==null?void 0:e.rendezvous_servers)?e.rendezvous_servers.map(u=>String(u)):[]}},toJSON(e){const u={};return e.serial!==void 0&&(u.serial=Math.round(e.serial)),e.rendezvous_servers?u.rendezvous_servers=e.rendezvous_servers.map(r=>r):u.rendezvous_servers=[],u},fromPartial(e){var r,n;const u=Hr();return u.serial=(r=e.serial)!=null?r:0,u.rendezvous_servers=((n=e.rendezvous_servers)==null?void 0:n.map(i=>i))||[],u}};function Zr(){return{id:"",uuid:"",socket_addr:new Uint8Array,relay_server:"",secure:!1,licence_key:"",conn_type:0,token:""}}const L={encode(e,u=o.Writer.create()){return e.id!==""&&u.uint32(10).string(e.id),e.uuid!==""&&u.uint32(18).string(e.uuid),e.socket_addr.length!==0&&u.uint32(26).bytes(e.socket_addr),e.relay_server!==""&&u.uint32(34).string(e.relay_server),e.secure===!0&&u.uint32(40).bool(e.secure),e.licence_key!==""&&u.uint32(50).string(e.licence_key),e.conn_type!==0&&u.uint32(56).int32(e.conn_type),e.token!==""&&u.uint32(66).string(e.token),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Zr();for(;r.pos>>3){case 1:i.id=r.string();break;case 2:i.uuid=r.string();break;case 3:i.socket_addr=r.bytes();break;case 4:i.relay_server=r.string();break;case 5:i.secure=r.bool();break;case 6:i.licence_key=r.string();break;case 7:i.conn_type=r.int32();break;case 8:i.token=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{id:d(e.id)?String(e.id):"",uuid:d(e.uuid)?String(e.uuid):"",socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,relay_server:d(e.relay_server)?String(e.relay_server):"",secure:d(e.secure)?Boolean(e.secure):!1,licence_key:d(e.licence_key)?String(e.licence_key):"",conn_type:d(e.conn_type)?Pr(e.conn_type):0,token:d(e.token)?String(e.token):""}},toJSON(e){const u={};return e.id!==void 0&&(u.id=e.id),e.uuid!==void 0&&(u.uuid=e.uuid),e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.secure!==void 0&&(u.secure=e.secure),e.licence_key!==void 0&&(u.licence_key=e.licence_key),e.conn_type!==void 0&&(u.conn_type=br(e.conn_type)),e.token!==void 0&&(u.token=e.token),u},fromPartial(e){var r,n,i,t,s,l,c,p;const u=Zr();return u.id=(r=e.id)!=null?r:"",u.uuid=(n=e.uuid)!=null?n:"",u.socket_addr=(i=e.socket_addr)!=null?i:new Uint8Array,u.relay_server=(t=e.relay_server)!=null?t:"",u.secure=(s=e.secure)!=null?s:!1,u.licence_key=(l=e.licence_key)!=null?l:"",u.conn_type=(c=e.conn_type)!=null?c:0,u.token=(p=e.token)!=null?p:"",u}};function Gr(){return{socket_addr:new Uint8Array,uuid:"",relay_server:"",id:void 0,pk:void 0,refuse_reason:"",version:""}}const Ze={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.uuid!==""&&u.uint32(18).string(e.uuid),e.relay_server!==""&&u.uint32(26).string(e.relay_server),e.id!==void 0&&u.uint32(34).string(e.id),e.pk!==void 0&&u.uint32(42).bytes(e.pk),e.refuse_reason!==""&&u.uint32(50).string(e.refuse_reason),e.version!==""&&u.uint32(58).string(e.version),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Gr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.uuid=r.string();break;case 3:i.relay_server=r.string();break;case 4:i.id=r.string();break;case 5:i.pk=r.bytes();break;case 6:i.refuse_reason=r.string();break;case 7:i.version=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,uuid:d(e.uuid)?String(e.uuid):"",relay_server:d(e.relay_server)?String(e.relay_server):"",id:d(e.id)?String(e.id):void 0,pk:d(e.pk)?F(e.pk):void 0,refuse_reason:d(e.refuse_reason)?String(e.refuse_reason):"",version:d(e.version)?String(e.version):""}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.uuid!==void 0&&(u.uuid=e.uuid),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.id!==void 0&&(u.id=e.id),e.pk!==void 0&&(u.pk=e.pk!==void 0?D(e.pk):void 0),e.refuse_reason!==void 0&&(u.refuse_reason=e.refuse_reason),e.version!==void 0&&(u.version=e.version),u},fromPartial(e){var r,n,i,t,s,l,c;const u=Gr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.uuid=(n=e.uuid)!=null?n:"",u.relay_server=(i=e.relay_server)!=null?i:"",u.id=(t=e.id)!=null?t:void 0,u.pk=(s=e.pk)!=null?s:void 0,u.refuse_reason=(l=e.refuse_reason)!=null?l:"",u.version=(c=e.version)!=null?c:"",u}};function Kr(){return{url:""}}const Ge={encode(e,u=o.Writer.create()){return e.url!==""&&u.uint32(10).string(e.url),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Kr();for(;r.pos>>3){case 1:i.url=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{url:d(e.url)?String(e.url):""}},toJSON(e){const u={};return e.url!==void 0&&(u.url=e.url),u},fromPartial(e){var r;const u=Kr();return u.url=(r=e.url)!=null?r:"",u}};function Yr(){return{socket_addr:new Uint8Array,relay_server:""}}const Ke={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.relay_server!==""&&u.uint32(18).string(e.relay_server),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Yr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.relay_server=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,relay_server:d(e.relay_server)?String(e.relay_server):""}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.relay_server!==void 0&&(u.relay_server=e.relay_server),u},fromPartial(e){var r,n;const u=Yr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.relay_server=(n=e.relay_server)!=null?n:"",u}};function Qr(){return{socket_addr:new Uint8Array,local_addr:new Uint8Array,relay_server:"",id:"",version:""}}const Ye={encode(e,u=o.Writer.create()){return e.socket_addr.length!==0&&u.uint32(10).bytes(e.socket_addr),e.local_addr.length!==0&&u.uint32(18).bytes(e.local_addr),e.relay_server!==""&&u.uint32(26).string(e.relay_server),e.id!==""&&u.uint32(34).string(e.id),e.version!==""&&u.uint32(42).string(e.version),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Qr();for(;r.pos>>3){case 1:i.socket_addr=r.bytes();break;case 2:i.local_addr=r.bytes();break;case 3:i.relay_server=r.string();break;case 4:i.id=r.string();break;case 5:i.version=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{socket_addr:d(e.socket_addr)?F(e.socket_addr):new Uint8Array,local_addr:d(e.local_addr)?F(e.local_addr):new Uint8Array,relay_server:d(e.relay_server)?String(e.relay_server):"",id:d(e.id)?String(e.id):"",version:d(e.version)?String(e.version):""}},toJSON(e){const u={};return e.socket_addr!==void 0&&(u.socket_addr=D(e.socket_addr!==void 0?e.socket_addr:new Uint8Array)),e.local_addr!==void 0&&(u.local_addr=D(e.local_addr!==void 0?e.local_addr:new Uint8Array)),e.relay_server!==void 0&&(u.relay_server=e.relay_server),e.id!==void 0&&(u.id=e.id),e.version!==void 0&&(u.version=e.version),u},fromPartial(e){var r,n,i,t,s;const u=Qr();return u.socket_addr=(r=e.socket_addr)!=null?r:new Uint8Array,u.local_addr=(n=e.local_addr)!=null?n:new Uint8Array,u.relay_server=(i=e.relay_server)!=null?i:"",u.id=(t=e.id)!=null?t:"",u.version=(s=e.version)!=null?s:"",u}};function Xr(){return{cmd:"",mac:"",id:"",username:"",hostname:"",platform:"",misc:""}}const Qe={encode(e,u=o.Writer.create()){return e.cmd!==""&&u.uint32(10).string(e.cmd),e.mac!==""&&u.uint32(18).string(e.mac),e.id!==""&&u.uint32(26).string(e.id),e.username!==""&&u.uint32(34).string(e.username),e.hostname!==""&&u.uint32(42).string(e.hostname),e.platform!==""&&u.uint32(50).string(e.platform),e.misc!==""&&u.uint32(58).string(e.misc),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=Xr();for(;r.pos>>3){case 1:i.cmd=r.string();break;case 2:i.mac=r.string();break;case 3:i.id=r.string();break;case 4:i.username=r.string();break;case 5:i.hostname=r.string();break;case 6:i.platform=r.string();break;case 7:i.misc=r.string();break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{cmd:d(e.cmd)?String(e.cmd):"",mac:d(e.mac)?String(e.mac):"",id:d(e.id)?String(e.id):"",username:d(e.username)?String(e.username):"",hostname:d(e.hostname)?String(e.hostname):"",platform:d(e.platform)?String(e.platform):"",misc:d(e.misc)?String(e.misc):""}},toJSON(e){const u={};return e.cmd!==void 0&&(u.cmd=e.cmd),e.mac!==void 0&&(u.mac=e.mac),e.id!==void 0&&(u.id=e.id),e.username!==void 0&&(u.username=e.username),e.hostname!==void 0&&(u.hostname=e.hostname),e.platform!==void 0&&(u.platform=e.platform),e.misc!==void 0&&(u.misc=e.misc),u},fromPartial(e){var r,n,i,t,s,l,c;const u=Xr();return u.cmd=(r=e.cmd)!=null?r:"",u.mac=(n=e.mac)!=null?n:"",u.id=(i=e.id)!=null?i:"",u.username=(t=e.username)!=null?t:"",u.hostname=(s=e.hostname)!=null?s:"",u.platform=(l=e.platform)!=null?l:"",u.misc=(c=e.misc)!=null?c:"",u}};function $r(){return{register_peer:void 0,register_peer_response:void 0,punch_hole_request:void 0,punch_hole:void 0,punch_hole_sent:void 0,punch_hole_response:void 0,fetch_local_addr:void 0,local_addr:void 0,configure_update:void 0,register_pk:void 0,register_pk_response:void 0,software_update:void 0,request_relay:void 0,relay_response:void 0,test_nat_request:void 0,test_nat_response:void 0,peer_discovery:void 0}}const lu={encode(e,u=o.Writer.create()){return e.register_peer!==void 0&&Me.encode(e.register_peer,u.uint32(50).fork()).ldelim(),e.register_peer_response!==void 0&&qe.encode(e.register_peer_response,u.uint32(58).fork()).ldelim(),e.punch_hole_request!==void 0&&J.encode(e.punch_hole_request,u.uint32(66).fork()).ldelim(),e.punch_hole!==void 0&&ze.encode(e.punch_hole,u.uint32(74).fork()).ldelim(),e.punch_hole_sent!==void 0&&Ue.encode(e.punch_hole_sent,u.uint32(82).fork()).ldelim(),e.punch_hole_response!==void 0&&He.encode(e.punch_hole_response,u.uint32(90).fork()).ldelim(),e.fetch_local_addr!==void 0&&Ke.encode(e.fetch_local_addr,u.uint32(98).fork()).ldelim(),e.local_addr!==void 0&&Ye.encode(e.local_addr,u.uint32(106).fork()).ldelim(),e.configure_update!==void 0&&S.encode(e.configure_update,u.uint32(114).fork()).ldelim(),e.register_pk!==void 0&&Ve.encode(e.register_pk,u.uint32(122).fork()).ldelim(),e.register_pk_response!==void 0&&We.encode(e.register_pk_response,u.uint32(130).fork()).ldelim(),e.software_update!==void 0&&Ge.encode(e.software_update,u.uint32(138).fork()).ldelim(),e.request_relay!==void 0&&L.encode(e.request_relay,u.uint32(146).fork()).ldelim(),e.relay_response!==void 0&&Ze.encode(e.relay_response,u.uint32(154).fork()).ldelim(),e.test_nat_request!==void 0&&Je.encode(e.test_nat_request,u.uint32(162).fork()).ldelim(),e.test_nat_response!==void 0&&Le.encode(e.test_nat_response,u.uint32(170).fork()).ldelim(),e.peer_discovery!==void 0&&Qe.encode(e.peer_discovery,u.uint32(178).fork()).ldelim(),u},decode(e,u){const r=e instanceof o.Reader?e:new o.Reader(e);let n=u===void 0?r.len:r.pos+u;const i=$r();for(;r.pos>>3){case 6:i.register_peer=Me.decode(r,r.uint32());break;case 7:i.register_peer_response=qe.decode(r,r.uint32());break;case 8:i.punch_hole_request=J.decode(r,r.uint32());break;case 9:i.punch_hole=ze.decode(r,r.uint32());break;case 10:i.punch_hole_sent=Ue.decode(r,r.uint32());break;case 11:i.punch_hole_response=He.decode(r,r.uint32());break;case 12:i.fetch_local_addr=Ke.decode(r,r.uint32());break;case 13:i.local_addr=Ye.decode(r,r.uint32());break;case 14:i.configure_update=S.decode(r,r.uint32());break;case 15:i.register_pk=Ve.decode(r,r.uint32());break;case 16:i.register_pk_response=We.decode(r,r.uint32());break;case 17:i.software_update=Ge.decode(r,r.uint32());break;case 18:i.request_relay=L.decode(r,r.uint32());break;case 19:i.relay_response=Ze.decode(r,r.uint32());break;case 20:i.test_nat_request=Je.decode(r,r.uint32());break;case 21:i.test_nat_response=Le.decode(r,r.uint32());break;case 22:i.peer_discovery=Qe.decode(r,r.uint32());break;default:r.skipType(t&7);break}}return i},fromJSON(e){return{register_peer:d(e.register_peer)?Me.fromJSON(e.register_peer):void 0,register_peer_response:d(e.register_peer_response)?qe.fromJSON(e.register_peer_response):void 0,punch_hole_request:d(e.punch_hole_request)?J.fromJSON(e.punch_hole_request):void 0,punch_hole:d(e.punch_hole)?ze.fromJSON(e.punch_hole):void 0,punch_hole_sent:d(e.punch_hole_sent)?Ue.fromJSON(e.punch_hole_sent):void 0,punch_hole_response:d(e.punch_hole_response)?He.fromJSON(e.punch_hole_response):void 0,fetch_local_addr:d(e.fetch_local_addr)?Ke.fromJSON(e.fetch_local_addr):void 0,local_addr:d(e.local_addr)?Ye.fromJSON(e.local_addr):void 0,configure_update:d(e.configure_update)?S.fromJSON(e.configure_update):void 0,register_pk:d(e.register_pk)?Ve.fromJSON(e.register_pk):void 0,register_pk_response:d(e.register_pk_response)?We.fromJSON(e.register_pk_response):void 0,software_update:d(e.software_update)?Ge.fromJSON(e.software_update):void 0,request_relay:d(e.request_relay)?L.fromJSON(e.request_relay):void 0,relay_response:d(e.relay_response)?Ze.fromJSON(e.relay_response):void 0,test_nat_request:d(e.test_nat_request)?Je.fromJSON(e.test_nat_request):void 0,test_nat_response:d(e.test_nat_response)?Le.fromJSON(e.test_nat_response):void 0,peer_discovery:d(e.peer_discovery)?Qe.fromJSON(e.peer_discovery):void 0}},toJSON(e){const u={};return e.register_peer!==void 0&&(u.register_peer=e.register_peer?Me.toJSON(e.register_peer):void 0),e.register_peer_response!==void 0&&(u.register_peer_response=e.register_peer_response?qe.toJSON(e.register_peer_response):void 0),e.punch_hole_request!==void 0&&(u.punch_hole_request=e.punch_hole_request?J.toJSON(e.punch_hole_request):void 0),e.punch_hole!==void 0&&(u.punch_hole=e.punch_hole?ze.toJSON(e.punch_hole):void 0),e.punch_hole_sent!==void 0&&(u.punch_hole_sent=e.punch_hole_sent?Ue.toJSON(e.punch_hole_sent):void 0),e.punch_hole_response!==void 0&&(u.punch_hole_response=e.punch_hole_response?He.toJSON(e.punch_hole_response):void 0),e.fetch_local_addr!==void 0&&(u.fetch_local_addr=e.fetch_local_addr?Ke.toJSON(e.fetch_local_addr):void 0),e.local_addr!==void 0&&(u.local_addr=e.local_addr?Ye.toJSON(e.local_addr):void 0),e.configure_update!==void 0&&(u.configure_update=e.configure_update?S.toJSON(e.configure_update):void 0),e.register_pk!==void 0&&(u.register_pk=e.register_pk?Ve.toJSON(e.register_pk):void 0),e.register_pk_response!==void 0&&(u.register_pk_response=e.register_pk_response?We.toJSON(e.register_pk_response):void 0),e.software_update!==void 0&&(u.software_update=e.software_update?Ge.toJSON(e.software_update):void 0),e.request_relay!==void 0&&(u.request_relay=e.request_relay?L.toJSON(e.request_relay):void 0),e.relay_response!==void 0&&(u.relay_response=e.relay_response?Ze.toJSON(e.relay_response):void 0),e.test_nat_request!==void 0&&(u.test_nat_request=e.test_nat_request?Je.toJSON(e.test_nat_request):void 0),e.test_nat_response!==void 0&&(u.test_nat_response=e.test_nat_response?Le.toJSON(e.test_nat_response):void 0),e.peer_discovery!==void 0&&(u.peer_discovery=e.peer_discovery?Qe.toJSON(e.peer_discovery):void 0),u},fromPartial(e){const u=$r();return u.register_peer=e.register_peer!==void 0&&e.register_peer!==null?Me.fromPartial(e.register_peer):void 0,u.register_peer_response=e.register_peer_response!==void 0&&e.register_peer_response!==null?qe.fromPartial(e.register_peer_response):void 0,u.punch_hole_request=e.punch_hole_request!==void 0&&e.punch_hole_request!==null?J.fromPartial(e.punch_hole_request):void 0,u.punch_hole=e.punch_hole!==void 0&&e.punch_hole!==null?ze.fromPartial(e.punch_hole):void 0,u.punch_hole_sent=e.punch_hole_sent!==void 0&&e.punch_hole_sent!==null?Ue.fromPartial(e.punch_hole_sent):void 0,u.punch_hole_response=e.punch_hole_response!==void 0&&e.punch_hole_response!==null?He.fromPartial(e.punch_hole_response):void 0,u.fetch_local_addr=e.fetch_local_addr!==void 0&&e.fetch_local_addr!==null?Ke.fromPartial(e.fetch_local_addr):void 0,u.local_addr=e.local_addr!==void 0&&e.local_addr!==null?Ye.fromPartial(e.local_addr):void 0,u.configure_update=e.configure_update!==void 0&&e.configure_update!==null?S.fromPartial(e.configure_update):void 0,u.register_pk=e.register_pk!==void 0&&e.register_pk!==null?Ve.fromPartial(e.register_pk):void 0,u.register_pk_response=e.register_pk_response!==void 0&&e.register_pk_response!==null?We.fromPartial(e.register_pk_response):void 0,u.software_update=e.software_update!==void 0&&e.software_update!==null?Ge.fromPartial(e.software_update):void 0,u.request_relay=e.request_relay!==void 0&&e.request_relay!==null?L.fromPartial(e.request_relay):void 0,u.relay_response=e.relay_response!==void 0&&e.relay_response!==null?Ze.fromPartial(e.relay_response):void 0,u.test_nat_request=e.test_nat_request!==void 0&&e.test_nat_request!==null?Je.fromPartial(e.test_nat_request):void 0,u.test_nat_response=e.test_nat_response!==void 0&&e.test_nat_response!==null?Le.fromPartial(e.test_nat_response):void 0,u.peer_discovery=e.peer_discovery!==void 0&&e.peer_discovery!==null?Qe.fromPartial(e.peer_discovery):void 0,u}};var U=(()=>{if(typeof U!="undefined")return U;if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global;throw"Unable to locate global object"})();const Oi=U.atob||(e=>U.Buffer.from(e,"base64").toString("binary"));function F(e){const u=Oi(e),r=new Uint8Array(u.length);for(let n=0;nU.Buffer.from(e,"binary").toString("base64"));function D(e){const u=[];for(const r of e)u.push(String.fromCharCode(r));return Ii(u.join(""))}o.util.Long!==$e&&(o.util.Long=$e,o.configure());function d(e){return e!=null}class cu{constructor(u,r=!0){_(this,"_websocket");_(this,"_eventHandlers");_(this,"_buf");_(this,"_status");_(this,"_latency");_(this,"_secretKey");_(this,"_uri");_(this,"_isRendezvous");this._eventHandlers={message:n=>{},open:()=>{},close:()=>{},error:()=>{}},this._uri=u,this._status="",this._buf=[],this._websocket=new WebSocket(u),this._websocket.onmessage=this._recv_message.bind(this),this._websocket.binaryType="arraybuffer",this._latency=new Date().getTime(),this._isRendezvous=r}latency(){return this._latency}setSecretKey(u){this._secretKey=[u,0,0]}sendMessage(u){let r=au.encode(au.fromPartial(u)).finish(),n=this._secretKey;n&&(n[1]+=1,r=nn(r,n[1],n[0])),this._websocket.send(r)}sendRendezvous(u){this._websocket.send(lu.encode(lu.fromPartial(u)).finish())}parseMessage(u){return au.decode(u)}parseRendezvous(u){return lu.decode(u)}off(u){this._eventHandlers[u]=()=>{}}on(u,r){this._eventHandlers[u]=r}async open(u=12e3){return new Promise((r,n)=>{setTimeout(()=>{this._status!="open"&&n(this._status||"Timeout")},u),this._websocket.onopen=()=>{var i;this._latency=new Date().getTime()-this._latency,this._status="open",console.debug(">> WebSock.onopen"),((i=this._websocket)==null?void 0:i.protocol)&&console.info("Server choose sub-protocol: "+this._websocket.protocol),this._eventHandlers.open(),console.info("WebSock.onopen"),r(this)},this._websocket.onclose=i=>{this._status=="open",this._status=i,console.error("WebSock.onclose: "),console.error(i),this._eventHandlers.close(i),n("Reset by the peer")},this._websocket.onerror=i=>{if(!this._status){n("Failed to connect to "+(this._isRendezvous?"rendezvous":"relay")+" server");return}this._status=i,console.error("WebSock.onerror: "),console.error(i),this._eventHandlers.error(i)}})}async next(u=12e3){const r=(n,i,t)=>{if(this._buf.length)n(this._buf[0]),this._buf.splice(0,1);else{if(this._status!="open"){i(this._status);return}new Date().getTime()>t+u?i("Timeout"):setTimeout(()=>r(n,i,t),1)}};return new Promise((n,i)=>{r(n,i,new Date().getTime())})}close(){this._status="",this._websocket&&((this._websocket.readyState===WebSocket.OPEN||this._websocket.readyState===WebSocket.CONNECTING)&&(console.info("Closing WebSocket connection"),this._websocket.close()),this._websocket.onmessage=()=>{})}_recv_message(u){if(u.data instanceof window.ArrayBuffer){let r=new Uint8Array(u.data);const n=this._secretKey;n&&(n[2]+=1,r=tn(r,n[2],n[0])),this._buf.push(this._isRendezvous?this.parseRendezvous(r):this.parseMessage(r))}this._eventHandlers.message(u.data)}}async function jr(e){const u=await hi();console.log("isSIMD: "+u),window.OGVLoader.loadClass(u?"OGVDecoderVideoVP9SIMDW":"OGVDecoderVideoVP9W",r=>{window.videoCodecClass=r,r({videoFormat:{}}).then(n=>{n.init(()=>{e(n)})})},{worker:!0,threading:!0})}const ei={ru:{Status:"C\u0442\u0430\u0442\u0443\u0441","Your Desktop":"\u0412\u0430\u0448 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B",desk_tip:"\u0412\u0430\u0448 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0441 \u044D\u0442\u0438\u043C \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C \u0438 \u043F\u0430\u0440\u043E\u043B\u0435\u043C",Password:"\u041F\u0430\u0440\u043E\u043B\u044C",Ready:"\u0413\u043E\u0442\u043E\u0432\u043E",Established:"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E",connecting_status:"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A \u0441\u0435\u0442\u0438 RustDesk..","Enable Service":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443","Start Service":"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443","Service is running":"\u0421\u043B\u0443\u0436\u0431\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442","Service is not running":"\u0421\u043B\u0443\u0436\u0431\u0430 \u043D\u0435 \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u0430",not_ready_status:"\u041D\u0435 \u0433\u043E\u0442\u043E\u0432\u043E. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435","Control Remote Desktop":"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u043C \u0440\u0430\u0431\u043E\u0447\u0438\u043C \u0441\u0442\u043E\u043B\u043E\u043C","Transfer File":"\u041F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0444\u0430\u0439\u043B",Connect:"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F","Recent Sessions":"\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0441\u0435\u0430\u043D\u0441\u044B","Address Book":"\u0410\u0434\u0440\u0435\u0441\u043D\u0430\u044F \u043A\u043D\u0438\u0433\u0430",Confirmation:"\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435","TCP Tunneling":"TCP-\u0442\u0443\u043D\u043D\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",Remove:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C","Refresh random password":"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C","Set your own password":"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0432\u043E\u0439 \u043F\u0430\u0440\u043E\u043B\u044C","Enable Keyboard/Mouse":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443/\u043C\u044B\u0448\u044C","Enable Clipboard":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430","Enable File Transfer":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0444\u0430\u0439\u043B\u043E\u0432","Enable TCP Tunneling":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0442\u0443\u043D\u043D\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 TCP","IP Whitelisting":"\u0421\u043F\u0438\u0441\u043E\u043A \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0445 IP-\u0430\u0434\u0440\u0435\u0441\u043E\u0432","ID/Relay Server":"ID/\u0421\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u0438","Stop service":"\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443","Change ID":"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C ID",Website:"\u0412\u0435\u0431-\u0441\u0430\u0439\u0442",About:"\u041E RustDesk",Mute:"\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0437\u0432\u0443\u043A","Audio Input":"\u0410\u0443\u0434\u0438\u043E\u0432\u0445\u043E\u0434","ID Server":"ID \u0441\u0435\u0440\u0432\u0435\u0440","Relay Server":"\u0421\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u0438","API Server":"API \u0441\u0435\u0440\u0432\u0435\u0440",invalid_http:"\u0414\u043E\u043B\u0436\u0435\u043D \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 http:// \u0438\u043B\u0438 https://","Invalid IP":"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 IP-\u0430\u0434\u0440\u0435\u0441",id_change_tip:"\u0414\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u044B a-z, A-Z, 0-9 \u0438 _ (\u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435). \u041F\u0435\u0440\u0432\u0430\u044F \u0431\u0443\u043A\u0432\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C a-z, A-Z. \u0414\u043B\u0438\u043D\u0430 \u043E\u0442 6 \u0434\u043E 16","Invalid format":"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442","This function is turned off by the server":"\u042D\u0442\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F \u043D\u0435 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C","Not available":"\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E","Too frequent":"\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0447\u0430\u0441\u0442\u043E",Cancel:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",Skip:"\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",Close:"\u0417\u0430\u043A\u0440\u044B\u0442\u044C",Retry:"\u041F\u043E\u043F\u0440\u043E\u0431\u043E\u0432\u0430\u0442\u044C \u0435\u0449\u0435 \u0440\u0430\u0437",OK:"\u041E\u041A","Password Required":"\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0430\u0440\u043E\u043B\u044C","Please enter your password":"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 \u043F\u0430\u0440\u043E\u043B\u044C","Remember password":"\u0417\u0430\u043F\u043E\u043C\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C","Wrong Password":"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C","Do you want to enter again?":"\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0441\u043D\u043E\u0432\u0430 \u0432\u043E\u0439\u0442\u0438?","Connection Error":"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F",Error:"\u041E\u0448\u0438\u0431\u043A\u0430","Reset by the peer":"\u0421\u0431\u0440\u043E\u0448\u0435\u043D\u043E \u0443\u0437\u043B\u043E\u043C","Connecting...":"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435..","Connection in progress. Please wait.":"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435. \u041F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435","Please try 1 minute later":"\u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 1 \u043C\u0438\u043D\u0443\u0442\u0443","Login Error":"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432\u0445\u043E\u0434\u0430",Successful:"\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u0430","Connected, waiting for image...":"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F..",Name:"\u0418\u043C\u044F",Type:"\u0422\u0438\u043F",Modified:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u043E",Size:"\u0420\u0430\u0437\u043C\u0435\u0440","Show Hidden Files":"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043A\u0440\u044B\u0442\u044B\u0435 \u0444\u0430\u0439\u043B\u044B",Receive:"\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C",Send:"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C","Refresh File":"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0444\u0430\u0439\u043B",Local:"\u041C\u0435\u0441\u0442\u043D\u044B\u0439",Remote:"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439","Remote Computer":"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440","Local Computer":"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440","Confirm Delete":"\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435",Delete:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",Properties:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430","Multi Select":"\u041C\u043D\u043E\u0433\u043E\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440","Empty Directory":"\u041F\u0443\u0441\u0442\u0430\u044F \u043F\u0430\u043F\u043A\u0430","Not an empty directory":"\u041F\u0430\u043F\u043A\u0430 \u043D\u0435 \u043F\u0443\u0441\u0442\u0430","Are you sure you want to delete this file?":"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B?","Are you sure you want to delete this empty directory?":"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0443\u0441\u0442\u0443\u044E \u043F\u0430\u043F\u043A\u0443?","Are you sure you want to delete the file of this directory?":"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0438\u0437 \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438?","Do this for all conflicts":"\u042D\u0442\u043E \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0441\u044F \u043A\u043E \u0432\u0441\u0435\u043C \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u043C","This is irreversible!":"\u042D\u0442\u043E \u043D\u0435\u043E\u0431\u0440\u0430\u0442\u0438\u043C\u043E!",Deleting:"\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435",files:"\u0444\u0430\u0439\u043B\u044B",Waiting:"\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435",Finished:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",Speed:"\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C","Custom Image Quality":"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F","Privacy mode":"\u0420\u0435\u0436\u0438\u043C \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438","Block user input":"\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0432\u0432\u043E\u0434","Unblock user input":"\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0432\u0432\u043E\u0434","Adjust Window":"\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043E\u043A\u043D\u043E",Original:"\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B",Shrink:"\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C",Stretch:"\u0420\u0430\u0441\u0442\u044F\u043D\u0443\u0442\u044C","Good image quality":"\u0425\u043E\u0440\u043E\u0448\u0435\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",Balanced:"\u0421\u0431\u0430\u043B\u0430\u043D\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439","Optimize reaction time":"\u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0440\u0435\u043C\u044F \u0440\u0435\u0430\u043A\u0446\u0438\u0438",Custom:"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439","Show remote cursor":"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440","Disable clipboard":"\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430","Lock after session end":"\u0412\u044B\u0445\u043E\u0434 \u0438\u0437 \u0443\u0447\u0451\u0442\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u043F\u043E\u0441\u043B\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0435\u0430\u043D\u0441\u0430",Insert:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","Insert Lock":"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u0430\u043C\u043E\u043A",Refresh:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C","ID does not exist":"ID \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","Failed to connect to rendezvous server":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443","Please try later":"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043F\u043E\u0437\u0436\u0435","Remote desktop is offline":"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B \u043D\u0435 \u043E\u043D\u043B\u0430\u0439\u043D","Key mismatch":"\u041D\u0435\u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043A\u043B\u044E\u0447\u0435\u0439",Timeout:"\u0422\u0430\u0439\u043C-\u0430\u0443\u0442","Failed to connect to relay server":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u0438","Failed to connect via rendezvous server":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440","Failed to connect via relay server":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u0438","Failed to make direct connection to remote desktop":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0440\u044F\u043C\u043E\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u043C\u0443 \u0440\u0430\u0431\u043E\u0447\u0435\u043C\u0443 \u0441\u0442\u043E\u043B\u0443","Set Password":"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C","OS Password":"\u041F\u0430\u0440\u043E\u043B\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0439 \u0441\u0438\u0441\u0442\u0435\u043C\u044B",install_tip:"\u0412 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445 \u0438\u0437-\u0437\u0430 UAC RustDesk \u043C\u043E\u0436\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u043D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E \u043D\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u043C \u0443\u0437\u043B\u0435. \u0427\u0442\u043E\u0431\u044B \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C UAC, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0435, \u0447\u0442\u043E\u0431\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C RustDesk \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0435","Click to upgrade":"\u041D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439","Click to download":"\u041D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u0430\u0447\u0430\u0442\u044C","Click to update":"\u041D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C","Configuration Permissions":"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",Configure:"\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C",config_acc:'\u0427\u0442\u043E\u0431\u044B \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0441\u0432\u043E\u0438\u043C \u0440\u0430\u0431\u043E\u0447\u0438\u043C \u0441\u0442\u043E\u043B\u043E\u043C, \u0432\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C RustDesk \u043F\u0440\u0430\u0432\u0430 "\u0434\u043E\u0441\u0442\u0443\u043F\u0430"',config_screen:'\u0414\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0440\u0430\u0431\u043E\u0447\u0435\u043C\u0443 \u0441\u0442\u043E\u043B\u0443 \u0432\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C RustDesk \u043F\u0440\u0430\u0432\u0430 "\u0441\u043D\u0438\u043C\u043E\u043A \u044D\u043A\u0440\u0430\u043D\u0430"',"Installing ...":"\u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u044C\u0441\u044F...",Install:"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C",Installation:"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430","Installation Path":"\u041F\u0430\u043F\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438","Create start menu shortcuts":'\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u044F\u0440\u043B\u044B\u043A\u0438 \u043C\u0435\u043D\u044E "\u041F\u0443\u0441\u043A"',"Create desktop icon":"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043E\u043A \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u0441\u0442\u043E\u043B\u0435",agreement_tip:"\u0415\u0441\u043B\u0438 \u0432\u044B \u043D\u0430\u0447\u043D\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443, \u043F\u0440\u0438\u043C\u0438\u0442\u0435 \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u043E\u043D\u043D\u043E\u0435 \u0441\u043E\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435","Accept and Install":"\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C","End-user license agreement":"\u041B\u0438\u0446\u0435\u043D\u0437\u0438\u043E\u043D\u043D\u043E\u0435 \u0441\u043E\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C","Generating ...":"\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F...","Your installation is lower version.":"\u0412\u0430\u0448\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u044F\u0446\u0438\u044F \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0431\u043E\u043B\u0435\u0435 \u0440\u0430\u043D\u043D\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439",not_close_tcp_tip:"\u041D\u0435 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u044D\u0442\u043E \u043E\u043A\u043D\u043E \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0442\u0443\u043D\u043D\u0435\u043B\u044F","Listening ...":"\u041E\u0436\u0438\u0434\u0430\u0435\u043C ...","Remote Host":"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u0430\u044F \u043C\u0430\u0448\u0438\u043D\u0430","Remote Port":"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u043F\u043E\u0440\u0442",Action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",Add:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C","Local Port":"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u043E\u0440\u0442",setup_server_tip:"\u0414\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0441\u0432\u043E\u0439 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F","Too short, at least 6 characters.":"\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043A\u043E\u0440\u043E\u0442\u043A\u043E, \u043D\u0435 \u043C\u0435\u043D\u0435\u0435 6 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","The confirmation is not identical.":"\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043D\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u043E",Permissions:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F",Accept:"\u041F\u0440\u0438\u043D\u044F\u0442\u044C",Dismiss:"\u041E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C",Disconnect:"\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C","Allow using keyboard and mouse":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438 \u043C\u044B\u0448\u0438","Allow using clipboard":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430","Allow hearing sound":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0437\u0432\u0443\u043A\u0430","Allow file transfer":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0444\u0430\u0439\u043B\u043E\u0432","File transfer":"\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043B\u043E\u0432",Connected:"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E","Direct and encrypted connection":"\u041F\u0440\u044F\u043C\u043E\u0435 \u0438 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Relayed and encrypted connection":"\u041A\u043E\u043C\u043C\u0443\u0442\u0438\u0440\u0443\u0435\u043C\u043E\u0435 \u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Direct and unencrypted connection":"\u041F\u0440\u044F\u043C\u043E\u0435 \u0438 \u043D\u0435\u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Relayed and unencrypted connection":"\u041A\u043E\u043C\u043C\u0443\u0442\u0438\u0440\u0443\u0435\u043C\u043E\u0435 \u0438 \u043D\u0435\u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Enter Remote ID":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440","Enter your password":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u0430\u0440\u043E\u043B\u044C","Logging in...":"\u0412\u0445\u043E\u0434\u0438\u043C...","Enable RDP session sharing":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0431\u0449\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0441\u0435\u0430\u043D\u0441\u0443 RDP","Auto Login":'\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0432\u0445\u043E\u0434 (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u0435\u043D, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0432\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B\u0438 "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u0441\u0435\u0430\u043D\u0441\u0430 \u043F\u043E\u0441\u043B\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0443\u0434\u0430\u043B\u0451\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F"',"Enable Direct IP Access":"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u044F\u043C\u043E\u0439 IP-\u0434\u043E\u0441\u0442\u0443\u043F",Rename:"\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C",Space:"\u041C\u0435\u0441\u0442\u043E","Create Desktop Shortcut":"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u0441\u0442\u043E\u043B\u0435","Change Path":"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0443\u0442\u044C","Create Folder":"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443","Please enter the folder name":"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043C\u044F \u043F\u0430\u043F\u043A\u0438","Fix it":"\u041E\u0442\u0440\u0435\u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",Warning:"\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","Login screen using Wayland is not supported":"\u0412\u0445\u043E\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C Wayland \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F","Reboot required":"\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430","Unsupported display server ":"\u041D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u0438\u0441\u043F\u043B\u0435\u044F","x11 expected":"\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F X11",Port:"\u041F\u043E\u0440\u0442",Settings:"\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",Username:"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F","Invalid port":"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u043E\u0440\u0442","Closed manually by the peer":"\u0417\u0430\u043A\u0440\u044B\u0442\u043E \u0443\u0437\u043B\u043E\u043C \u0432\u0440\u0443\u0447\u043D\u0443\u044E","Enable remote configuration modification":"\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438","Run without install":"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438","Always connected via relay":"\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u043E\u043D\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440","Always connect via relay":"\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0442\u044C\u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0442\u0440\u0430\u043D\u0441\u043B\u044F\u0446\u0438\u043E\u043D\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440",whitelist_tip:"\u0422\u043E\u043B\u044C\u043A\u043E IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0437 \u0431\u0435\u043B\u043E\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0430 \u043C\u043E\u0433\u0443\u0442 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A\u043E \u043C\u043D\u0435",Login:"\u0412\u043E\u0439\u0442\u0438",Logout:"\u0412\u044B\u0439\u0442\u0438",Tags:"\u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430","Search ID":"\u041F\u043E\u0438\u0441\u043A \u043F\u043E ID","Current Wayland display server is not supported":"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F Wayland \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",whitelist_sep:"\u0420\u0430\u0437\u0434\u0435\u043B\u044C\u043D\u043E \u0437\u0430\u043F\u044F\u0442\u043E\u0439, \u0442\u043E\u0447\u043A\u043E\u0439 \u0441 \u0437\u0430\u043F\u044F\u0442\u043E\u0439, \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C \u0438\u043B\u0438 \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439","Add ID":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C ID","Add Tag":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0435 \u0441\u043B\u043E\u0432\u043E","Unselect all tags":"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0432\u0441\u0435\u0445 \u0442\u0435\u0433\u043E\u0432","Network error":"\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u0435\u0442\u0438","Username missed":"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442","Password missed":"\u0417\u0430\u0431\u044B\u043B\u0438 \u043F\u0430\u0440\u043E\u043B\u044C","Wrong credentials":"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0443\u0447\u0435\u0442\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435","Edit Tag":"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u0433","Unremember Password":"\u041D\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C",Favorites:"\u0418\u0437\u0431\u0440\u0430\u043D\u043D\u043E\u0435","Add to Favorites":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u0438\u0437\u0431\u0440\u0430\u043D\u043D\u043E\u0435","Remove from Favorites":"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0437 \u0438\u0437\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E",Empty:"\u041F\u0443\u0441\u0442\u043E","Invalid folder name":"\u041D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E\u0435 \u0438\u043C\u044F \u043F\u0430\u043F\u043A\u0438","Socks5 Proxy":"\u041F\u0440\u043E\u043A\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 Socks5",Hostname:"\u0418\u043C\u044F \u041F\u041A",Discovered:"\u041D\u0430\u0439\u0434\u0435\u043D\u043E",install_daemon_tip:"\u0414\u043B\u044F \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0443\u044E \u0441\u043B\u0443\u0436\u0431\u0443","Remote ID":"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440",Paste:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","Paste here?":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u044E\u0434\u0430?","Are you sure to close the connection?":"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435?","Download new version":"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E","Touch mode":"\u0421\u0435\u043D\u0441\u043E\u0440\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C","Mouse mode":"\u0420\u0435\u0436\u0438\u043C \u043C\u044B\u0448\u0438","One-Finger Tap":"\u041A\u0430\u0441\u0430\u043D\u0438\u0435 \u043E\u0434\u043D\u0438\u043C \u043F\u0430\u043B\u044C\u0446\u0435\u043C","Left Mouse":"\u041B\u0435\u0432\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0430 \u043C\u044B\u0448\u0438","One-Long Tap":"\u041E\u0434\u043D\u043E \u0434\u043E\u043B\u0433\u043E\u0435 \u043A\u0430\u0441\u0430\u043D\u0438\u0435 \u043F\u0430\u043B\u044C\u0446\u0435\u043C","Two-Finger Tap":"\u041A\u0430\u0441\u0430\u043D\u0438\u0435 \u0434\u0432\u0443\u043C\u044F \u043F\u0430\u043B\u044C\u0446\u0430\u043C\u0438","Right Mouse":"\u041F\u0440\u0430\u0432\u0430\u044F \u043C\u044B\u0448\u044C","One-Finger Move":"\u0414\u0432\u0438\u0436\u0435\u043D\u0438\u0435 \u043E\u0434\u043D\u0438\u043C \u043F\u0430\u043B\u044C\u0446\u0435\u043C","Double Tap & Move":"\u0414\u0432\u043E\u0439\u043D\u043E\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435","Mouse Drag":"\u041F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u0435 \u043C\u044B\u0448\u044C\u044E","Two-Finger vertically":"\u0414\u0432\u0443\u043C\u044F \u043F\u0430\u043B\u044C\u0446\u0430\u043C\u0438 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438","Mouse Wheel":"\u041A\u043E\u043B\u0435\u0441\u0438\u043A\u043E \u043C\u044B\u0448\u0438","Two-Finger Move":"\u0414\u0432\u0438\u0436\u0435\u043D\u0438\u0435 \u0434\u0432\u0443\u043C\u044F \u043F\u0430\u043B\u044C\u0446\u0430\u043C\u0438","Canvas Move":"\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u0445\u043E\u043B\u0441\u0442\u0430","Pinch to Zoom":"\u0429\u0435\u043F\u043E\u0442\u043A\u0430, \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C","Canvas Zoom":"\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0445\u043E\u043B\u0441\u0442\u0430","Reset canvas":"\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0445\u043E\u043B\u0441\u0442","No permission of file transfer":"\u041D\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0444\u0430\u0439\u043B\u043E\u0432",Note:"\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435",Connection:"\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Share Screen":"\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u044D\u043A\u0440\u0430\u043D\u043E\u043C",CLOSE:"\u0417\u0410\u041A\u0420\u042B\u0422\u042C",OPEN:"\u041E\u0422\u041A\u0420\u042B\u0422\u042C",Chat:"\u0427\u0430\u0442",Total:"\u0412\u0441\u0435\u0433\u043E",items:"\u043E\u0431\u044C\u0435\u043A\u0442\u044B",Selected:"\u0412\u044B\u0431\u0440\u0430\u043D\u043E","Screen Capture":"\u0421\u043A\u0440\u0438\u043D\u0448\u043E\u0442","Mouse Control":"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u044B\u0448\u044C\u044E","File Transfer":"\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0444\u0430\u0439\u043B\u043E\u0432","Audio Capture":"\u0417\u0430\u0445\u0432\u0430\u0442 \u0430\u0443\u0434\u0438\u043E","File Connection":"\u0424\u0430\u0439\u043B\u043E\u0432\u043E\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435","Screen Connection":"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u043A\u0440\u0430\u043D\u0430","Do you accept?":"\u0412\u044B \u0441\u043E\u0433\u043B\u0430\u0441\u043D\u044B?","Open System Setting":"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u044B","How to get Android input permission?":"\u041A\u0430\u043A \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043D\u0430 \u0432\u0432\u043E\u0434 Android?",android_input_permission_tip1:"\u041F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u0432\u0432\u043E\u0434 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u0436\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u044D\u0442\u0438\u043C Android-\u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438.",android_input_permission_tip2:"\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A, \u043D\u0430\u0439\u0434\u0438\u0442\u0435 \u0438 \u0432\u043E\u0439\u0434\u0438\u0442\u0435 \u0432 [\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u043B\u0443\u0436\u0431\u044B], \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0441\u043B\u0443\u0436\u0431\u0443 [RustDesk Input].",android_new_connection_tip:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043D\u043E\u0432\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0432\u0430\u0448\u0438\u043C \u0442\u0435\u043A\u0443\u0449\u0438\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.",android_service_will_start_tip:"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u044D\u043A\u0440\u0430\u043D\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u0441\u043B\u0443\u0436\u0431\u0443, \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044F \u0434\u0440\u0443\u0433\u0438\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\u043C \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0441 \u044D\u0442\u043E\u0433\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430.",android_stop_service_tip:"\u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0441\u043B\u0443\u0436\u0431\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u043E\u0435\u0442 \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.",android_version_audio_tip:"\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F Android \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442 \u0437\u0432\u0443\u043A\u0430, \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0435\u0435 \u0434\u043E Android 10 \u0438\u043B\u0438 \u0432\u044B\u0448\u0435.",android_start_service_tip:"\u041A\u043E\u0441\u043D\u0438\u0442\u0435\u0441\u044C [\u0417\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u0447\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430] \u0438\u043B\u0438 \u041E\u0422\u041A\u0420\u042B\u0422\u042C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 [\u0421\u043A\u0440\u0438\u043D\u0448\u043E\u0442], \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0441\u043B\u0443\u0436\u0431\u0443 \u0434\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u044D\u043A\u0440\u0430\u043D\u0430.",Account:"\u0410\u043A\u043A\u0430\u0443\u043D\u0442"},ptbr:{Status:"Status","Your Desktop":"Seu Desktop",desk_tip:"Seu desktop pode ser acessado com este ID e senha.",Password:"Senha",Ready:"Pronto",Established:"Estabelecido",connecting_status:"Conectando \xE0 rede do RustDesk...","Enable Service":"Habilitar Servi\xE7o","Start Service":"Iniciar Servi\xE7o","Service is running":"Servi\xE7o est\xE1 em execu\xE7\xE3o","Service is not running":"Servi\xE7o n\xE3o est\xE1 em execu\xE7\xE3o",not_ready_status:"N\xE3o est\xE1 pronto. Por favor verifique sua conex\xE3o","Control Remote Desktop":"Controle o Desktop \xE0 dist\xE2ncia","Transfer File":"Transferir Arquivo",Connect:"Conectar","Recent Sessions":"Sess\xF5es recentes","Address Book":"Lista de Endere\xE7os",Confirmation:"Confirma\xE7\xE3o","TCP Tunneling":"Tunelamento TCP",Remove:"Remover","Refresh random password":"Atualizar senha aleat\xF3ria","Set your own password":"Configure sua pr\xF3pria senha","Enable Keyboard/Mouse":"Habilitar Teclado/Mouse","Enable Clipboard":"Habilitar \xC1rea de Transfer\xEAncia","Enable File Transfer":"Habilitar Transfer\xEAncia de Arquivos","Enable TCP Tunneling":"Habilitar Tunelamento TCP","IP Whitelisting":"Whitelisting de IP","ID/Relay Server":"Servidor ID/Relay","Stop service":"Parar servi\xE7o","Change ID":"Alterar ID",Website:"Website",About:"Sobre",Mute:"Emudecer","Audio Input":"Endtrada de \xC1udio","ID Server":"Servidor de ID","Relay Server":"Servidor de Relay","API Server":"Servidor da API",invalid_http:"deve iniciar com http:// ou https://","Invalid IP":"IP inv\xE1lido",id_change_tip:"Somente os caracteres a-z, A-Z, 0-9 e _ (sublinhado) s\xE3o permitidos. A primeira letra deve ser a-z, A-Z. Comprimento entre 6 e 16.","Invalid format":"Formato inv\xE1lido","This function is turned off by the server":"Esta funcionalidade foi desligada pelo servidor","Not available":"Indispon\xEDvel","Too frequent":"Muito frequente",Cancel:"Cancelar",Skip:"Pular",Close:"Fechar",Retry:"Tentar novamente",OK:"OK","Password Required":"Senha Necess\xE1ria","Please enter your password":"Por favor informe sua senha","Remember password":"Lembrar senha","Wrong Password":"Senha Incorreta","Do you want to enter again?":"Voc\xEA quer entrar novamente?","Connection Error":"Erro de Conex\xE3o",Error:"Erro","Reset by the peer":"Reiniciado pelo par","Connecting...":"Conectando...","Connection in progress. Please wait.":"Conex\xE3o em progresso. Aguarde por favor.","Please try 1 minute later":"Por favor tente ap\xF3s 1 minuto","Login Error":"Erro de Login",Successful:"Sucesso","Connected, waiting for image...":"Conectado. Aguardando pela imagem...",Name:"Nome",Type:"Tipo",Modified:"Modificado",Size:"Tamanho","Show Hidden Files":"Mostrar Arquivos Ocultos",Receive:"Receber",Send:"Enviar","Refresh File":"Atualizar Arquivo",Local:"Local",Remote:"Remoto","Remote Computer":"Computador Remoto","Local Computer":"Computador Local","Confirm Delete":"Comfirmar Apagar",Delete:"Apagar",Properties:"Propriedades","Multi Select":"Sele\xE7\xE3o M\xFAltipla","Empty Directory":"Diret\xF3rio Vazio","Not an empty directory":"Diret\xF3rio n\xE3o est\xE1 vazio","Are you sure you want to delete this file?":"Tem certeza que deseja apagar este arquivo?","Are you sure you want to delete this empty directory?":"Tem certeza que deseja apagar este diret\xF3rio vazio?","Are you sure you want to delete the file of this directory?":"Tem certeza que deseja apagar este arquivo deste diret\xF3rio?","Do this for all conflicts":"Fazer isto para todos os conflitos","This is irreversible!":"Isso \xE9 irrevers\xEDvel!",Deleting:"Apagando",files:"arquivos",Waiting:"Aguardando",Finished:"Completo",Speed:"Velocidade","Custom Image Quality":"Qualidade Visual Personalizada","Privacy mode":"Modo privado","Block user input":"Bloquear entrada de usu\xE1rio","Unblock user input":"Desbloquear entrada de usu\xE1rio","Adjust Window":"Ajustar Janela",Original:"Original",Shrink:"Reduzir",Stretch:"Aumentar","Good image quality":"Qualidade visual boa",Balanced:"Balanceada","Optimize reaction time":"Otimizar tempo de rea\xE7\xE3o",Custom:"Personalizado","Show remote cursor":"Mostrar cursor remoto","Disable clipboard":"Desabilitar \xE1rea de transfer\xEAncia","Lock after session end":"Bloquear ap\xF3s o fim da sess\xE3o",Insert:"Inserir","Insert Lock":"Inserir Trava",Refresh:"Atualizar","ID does not exist":"ID n\xE3o existe","Failed to connect to rendezvous server":"Falha ao conectar ao servidor de rendezvous","Please try later":"Por favor tente mais tarde","Remote desktop is offline":"Desktop remoto est\xE1 offline","Key mismatch":"Chaves incompat\xEDveis",Timeout:"Tempo esgotado","Failed to connect to relay server":"Falha ao conectar ao servidor de relay","Failed to connect via rendezvous server":"Falha ao conectar ao servidor de rendezvous","Failed to connect via relay server":"Falha ao conectar atrav\xE9s do servidor de relay","Failed to make direct connection to remote desktop":"Falha ao fazer conex\xE3o direta ao desktop remoto","Set Password":"Definir Senha","OS Password":"Senha do SO",install_tip:"Devido ao UAC, o RustDesk n\xE3o funciona corretamente como o lado remoto em alguns casos. Para evitar o UAC, por favor clique no bot\xE3o abaixo para instalar o RustDesk no sistema.","Click to upgrade":"Clique para fazer o upgrade","Click to download":"Clique para baixar","Click to update":"Clique para fazer o update","Configuration Permissions":"Permiss\xF5es de Configura\xE7\xE3o",Configure:"Configurar",config_acc:'Para controlar seu Desktop remotamente, voc\xEA precisa conceder ao RustDesk permiss\xF5es de "Acessibilidade".',config_screen:'Para acessar seu Desktop remotamente, voc\xEA precisa conceder ao RustDesk permiss\xF5es de "Gravar a Tela"/',"Installing ...":"Instalando ...",Install:"Instalar",Installation:"Instala\xE7\xE3o","Installation Path":"Caminho da Instala\xE7\xE3o","Create start menu shortcuts":"Criar atalhos no menu iniciar","Create desktop icon":"Criar \xEDcone na \xE1rea de trabalho",agreement_tip:"Ao iniciar a instala\xE7\xE3o, voc\xEA concorda com o acordo de licen\xE7a.","Accept and Install":"Aceitar e Instalar","End-user license agreement":"Acordo de licen\xE7a do usu\xE1rio final","Generating ...":"Gerando ...","Your installation is lower version.":"Sua instala\xE7\xE3o \xE9 de uma vers\xE3o menor.",not_close_tcp_tip:"N\xE3o feche esta janela enquanto estiver utilizando o t\xFAnel","Listening ...":"Escutando ...","Remote Host":"Host Remoto","Remote Port":"Porta Remota",Action:"A\xE7\xE3o",Add:"Adicionar","Local Port":"Porta Local",setup_server_tip:"Para uma conex\xE3o mais r\xE1pida, por favor configure seu pr\xF3prio servidor","Too short, at least 6 characters.":"Muito curto, pelo menos 6 caracteres.","The confirmation is not identical.":"A confirma\xE7\xE3o n\xE3o \xE9 id\xEAntica.",Permissions:"Permiss\xF5es",Accept:"Aceitar",Dismiss:"Dispensar",Disconnect:"Desconectar","Allow using keyboard and mouse":"Permitir o uso de teclado e mouse","Allow using clipboard":"Permitir o uso da \xE1rea de transfer\xEAncia","Allow hearing sound":"Permitir escutar som","Allow file transfer":"Permitir transfer\xEAncia de arquivo","File transfer":"Transfer\xEAncia de arquivo",Connected:"Conectado","Direct and encrypted connection":"Conex\xE3o direta e criptografada","Relayed and encrypted connection":"Conex\xE3o via relay e criptografada","Direct and unencrypted connection":"Conex\xE3o direta e n\xE3o criptografada","Relayed and unencrypted connection":"Conex\xE3o via relay e n\xE3o criptografada","Enter Remote ID":"Informe o ID Remoto","Enter your password":"Informe sua senha","Logging in...":"Fazendo Login...","Enable RDP session sharing":"Habilitar compartilhamento de sess\xE3o RDP","Auto Login":'Login Autom\xE1tico (Somente v\xE1lido se voc\xEA habilitou "Bloquear ap\xF3s o fim da sess\xE3o")',"Enable Direct IP Access":"Habilitar Acesso IP Direto",Rename:"Renomear",Space:"Espa\xF5","Create Desktop Shortcut":"Criar Atalho na \xC1rea de Trabalho","Change Path":"Alterar Caminho","Create Folder":"Criar Diret\xF3rio","Please enter the folder name":"Por favor informe o nome do diret\xF3rio","Fix it":"Conserte",Warning:"Aguardando","Login screen using Wayland is not supported":"Tela de Login utilizando Wayland n\xE3o \xE9 suportada","Reboot required":"Reinicializa\xE7\xE3o necess\xE1ria","Unsupported display server ":"Servidor de display n\xE3o suportado","x11 expected":"x11 esperado",Port:"Porta",Settings:"Configura\xE7\xF5es",Username:"Nome de usu\xE1rio","Invalid port":"Porta inv\xE1lida","Closed manually by the peer":"Fechada manualmente pelo par","Enable remote configuration modification":"Habilitar modifica\xE7\xF5es de configura\xE7\xE3o remotas","Run without install":"Executar sem instalar","Always connected via relay":"Sempre conectado via relay","Always connect via relay":"Sempre conectar via relay",whitelist_tip:"Somente IPs na whitelist podem me acessar",Login:"Login",Logout:"Sair",Tags:"Tags","Search ID":"Buscar ID","Current Wayland display server is not supported":"Servidor de display Wayland atual n\xE3o \xE9 suportado",whitelist_sep:"Separado por v\xEDrcula, ponto-e-v\xEDrgula, espa\xE7os ou nova linha","Add ID":"Adicionar ID","Add Tag":"Adicionar Tag","Unselect all tags":"Desselecionar todas as tags","Network error":"Erro de rede","Username missed":"Nome de usu\xE1rio faltante","Password missed":"Senha faltante","Wrong credentials":"Nome de usu\xE1rio ou senha incorretos","Edit Tag":"Editar Tag","Unremember Password":"Esquecer Senha",Favorites:"Favoritos","Add to Favorites":"Adicionar aos Favoritos","Remove from Favorites":"Remover dos Favoritos",Empty:"Vazio","Invalid folder name":"Nome de diret\xF3rio inv\xE1lido","Socks5 Proxy":"Proxy Socks5",Hostname:"Nome de anfitri\xE3o",Discovered:"Descoberto",install_daemon_tip:"Para inicializa\xE7\xE3o junto ao sistema, voc\xEA deve instalar o servi\xE7o de sistema.","Remote ID":"ID Remoto",Paste:"Colar","Paste here?":"Colar aqui?","Are you sure to close the connection?":"Tem certeza que deseja fechar a conex\xE3o?","Download new version":"Baixar nova vers\xE3o","Touch mode":"Modo toque","Mouse mode":"Modo mouse","One-Finger Tap":"Toque com um dedo","Left Mouse":"Bot\xE3o esquerdo do mouse","One-Long Tap":"Um toque longo","Two-Finger Tap":"Toque com dois dedos","Right Mouse":"Bot\xE3o direito do mouse","One-Finger Move":"Mover com um dedo","Double Tap & Move":"Toque duplo & mover","Mouse Drag":"Arrastar com o mouse","Two-Finger vertically":"Dois dedos verticalmente","Mouse Wheel":"Roda do Mouse","Two-Finger Move":"Mover com dois dedos","Canvas Move":"Mover Tela","Pinch to Zoom":"Beliscar para Zoom","Canvas Zoom":"Zoom na Tela","Reset canvas":"Reiniciar tela","No permission of file transfer":"Sem permiss\xF5es de transfer\xEAncia de arquivo",Note:"Nota",Connection:"Conex\xE3o","Share Screen":"Compartilhar Tela",CLOSE:"FECHAR",OPEN:"ABRIR",Chat:"Chat",Total:"Total",items:"itens",Selected:"Selecionado","Screen Capture":"Captura de Tela","Mouse Control":"Controle do Mouse","File Transfer":"Transfer\xEAncia de Arquivo","Audio Capture":"Captura de \xC1udio","File Connection":"Conex\xE3o de Arquivo","Screen Connection":"Conex\xE3o de Tela","Do you accept?":"Voc\xEA aceita?","Open System Setting":"Abrir Configura\xE7\xF5es do Sistema","How to get Android input permission?":"Como habilitar a permiss\xE3o de entrada do Android?",android_input_permission_tip1:"Ap\xF3s obter permiss\xE3o de entrada, o dispositivo remoto pode controlar este dispositivo Android via mouse",android_input_permission_tip2:"Por favor v\xE1 para a pr\xF3xima p\xE1gina de configura\xE7\xE3o do sistema, encontre e entre [Servi\xE7os Instalados], HABILITE o servi\xE7o [RustDesk Input]",android_new_connection_tip:"Nova requisi\xE7\xE3o de controle recebida, solicita o controle de seu dispositivo atual.",android_service_will_start_tip:"Habilitar a Captura de Tela ir\xE1 automaticamente inicalizar o servi\xE7o, permitindo que outros dispositivos solicitem uma conex\xE3o deste dispositivo.",android_stop_service_tip:"Fechar o servi\xE7o ir\xE1 automaticamente fechar todas as conex\xF5es estabelecidas.",android_version_audio_tip:"A vers\xE3o atual do Android n\xE3o suporta captura de \xE1udio, por favor atualize para o Android 10 ou maior.",android_start_service_tip:"Toque [Iniciar Servi\xE7o] ou ABRA a permiss\xE3o [Captura de Tela] para iniciar o servi\xE7o de compartilhamento de tela.",Account:"Conta"},de:{Status:"Status","Your Desktop":"Ihr Desktop",desk_tip:"Mit dieser ID und diesem Passwort k\xF6nnen Sie auf Ihren Desktop zugreifen.",Password:"Passwort",Ready:"Bereit",Established:"Etabliert",connecting_status:"Verbinden mit dem RustDesk-Netzwerk...","Enable Service":"Verbindungsserver einschalten","Start Service":"Starte Verbindungsserver","Service is running":"Dienst l\xE4uft","Service is not running":"Der Verbindungsserver l\xE4uft nicht",not_ready_status:"Nicht bereit. Bitte \xFCberpr\xFCfen Sie Ihre Verbindung","Control Remote Desktop":"Entfernten Desktop steuern","Transfer File":"Datei \xFCbertragen",Connect:"Verbinden","Recent Sessions":"Letzte Sitzungen","Address Book":"Adressbuch",Confirmation:"Best\xE4tigung","TCP Tunneling":"TCP Tunneln",Remove:"Entfernen","Refresh random password":"Zuf\xE4lliges Passwort aktualisieren","Set your own password":"Legen Sie Ihr eigenes Passwort fest","Enable Keyboard/Mouse":"Tastatur/Maus einschalten","Enable Clipboard":"Zwischenablage einschalten","Enable File Transfer":"Datei\xFCbertragung aktivieren","Enable TCP Tunneling":"TCP-Tunneling einschalten","IP Whitelisting":"IP Freigabeliste","ID/Relay Server":"ID/Verbindungsserver","Stop service":"Verbindungsserver ausschalten","Change ID":"ID wechseln",Website:"Webseite",About:"\xDCber",Mute:"Stummschalten","Audio Input":"Audio-Eingang","ID Server":"ID Server","Relay Server":"Verbindungsserver Server","API Server":"API Server",invalid_http:"Muss mit http:// oder https:// beginnen","Invalid IP":"Ung\xFCltige IP-Adresse",id_change_tip:"Nur die Zeichen a-z, A-Z, 0-9 und _ (Unterstrich) sind erlaubt. Der erste Buchstabe muss a-z, A-Z sein. L\xE4nge zwischen 6 und 16.","Invalid format":"Ung\xFCltiges Format","This function is turned off by the server":"Diese Funktion wird vom Server nicht bereitgestellt","Not available":"Nicht verf\xFCgbar","Too frequent":"Zu h\xE4ufig",Cancel:"Abbrechen",Skip:"\xDCberspringen",Close:"Schlie\xDFen",Retry:"Nochmal versuchen",OK:"OK","Password Required":"Passwort erforderlich","Please enter your password":"Bitte geben Sie Ihr Passwort ein","Remember password":"Passwort merken","Wrong Password":"Falsches Passwort","Do you want to enter again?":"M\xF6chten Sie erneut teilnehmen?","Connection Error":"Verbindungsfehler",Error:"Fehler","Reset by the peer":"Zur\xFCcksetzen durch die Gegenstelle","Connecting...":"Verbinden...","Connection in progress. Please wait.":"Die Verbindung wird hergestellt. Bitte warten Sie.","Please try 1 minute later":"Bitte versuchen Sie es 1 Minute sp\xE4ter","Login Error":"Anmeldefehler",Successful:"Erfolgreich","Connected, waiting for image...":"Verbunden, warten auf Bild...",Name:"Name",Type:"Typ",Modified:"Ge\xE4ndert",Size:"Gr\xF6\xDFe","Show Hidden Files":"Versteckte Dateien anzeigen",Receive:"Empfangen",Send:"Senden","Refresh File":"Datei aktualisieren",Local:"Lokaler",Remote:"Entfernter","Remote Computer":"Entfernter Computer","Local Computer":"Lokaler Computer","Confirm Delete":"L\xF6schen best\xE4tigen",Delete:"L\xF6schen",Properties:"Eigenschaften","Multi Select":"Mehrfachauswahl","Empty Directory":"Leeres Verzeichnis","Not an empty directory":"Kein leeres Verzeichnis","Are you sure you want to delete this file?":"Sind Sie sicher, dass Sie diese Datei l\xF6schen wollen?","Are you sure you want to delete this empty directory?":"Sind Sie sicher, dass Sie dieses leere Verzeichnis l\xF6schen m\xF6chten?","Are you sure you want to delete the file of this directory?":"Sind Sie sicher, dass Sie die Datei dieses Verzeichnisses l\xF6schen m\xF6chten?","Do this for all conflicts":"Dies gilt f\xFCr alle Konflikte","This is irreversible!":"Dies ist irreversibel!",Deleting:"L\xF6schen",files:"Dateien",Waiting:"Warten",Finished:"Fertiggestellt",Speed:"Geschwindigkeit","Custom Image Quality":"Individuelle Bildqualit\xE4t","Privacy mode":"Datenschutz-Modus","Block user input":"Benutzereingaben blockieren","Unblock user input":"Benutzereingaben freigeben","Adjust Window":"Fenster anpassen",Original:"Original",Shrink:"Geschrumpft",Stretch:"Gestreckt","Good image quality":"Gute Bildqualit\xE4t",Balanced:"Ausgeglichen","Optimize reaction time":"Optimierte Reaktionszeit",Custom:"Benutzerdefiniert","Show remote cursor":"Ferngesteuerten Cursor anzeigen","Disable clipboard":"Zwischenablage deaktivieren","Lock after session end":"Sperren nach Sitzungsende",Insert:"Einf\xFCgen","Insert Lock":"Sperre einf\xFCgen",Refresh:"Aktualisieren","ID does not exist":"Die ID existiert nicht","Failed to connect to rendezvous server":"Verbindung zum Verbindungsserver fehlgeschlagen","Please try later":"Bitte versuchen Sie es sp\xE4ter","Remote desktop is offline":"Entfernter Desktop ist offline","Key mismatch":"Schl\xFCssel nicht \xFCbereinstimmend",Timeout:"Zeit\xFCberschreitung","Failed to connect to relay server":"Verbindung zum Verbindungsserver fehlgeschlagen","Failed to connect via rendezvous server":"Verbindung \xFCber rendezvous server fehlgeschlagen","Failed to connect via relay server":"Verbindung \xFCber den Verbindungsserver ist fehlgeschlagen","Failed to make direct connection to remote desktop":"Direkte Verbindung zum Entfernten-Desktop konnte nicht hergestellt werden","Set Password":"Passwort festlegen","OS Password":"Betriebssystem-Passwort",install_tip:"Aufgrund der UAC kann RustDesk in manchen F\xE4llen nicht ordnungsgem\xE4\xDF auf der Gegenseite funktionieren. Um UAC zu vermeiden, klicken Sie bitte auf die Schaltfl\xE4che unten, um RustDesk auf dem System zu installieren","Click to upgrade":"Zum Upgrade anklicken","Click to download":"Zum Herunterladen klicken","Click to update":"Zum Aktualisieren klicken","Configuration Permissions":"Konfigurationsberechtigungen",Configure:"Konfigurieren",config_acc:'Um Ihren Desktop aus der Ferne zu steuern, m\xFCssen Sie RustDesk "Zugangs" Rechte erteilen.',config_screen:'Um aus der Ferne auf Ihren Desktop zugreifen zu k\xF6nnen, m\xFCssen Sie RustDesk "Bildschirm-Aufnahme" Berechtigungen erteilen.',"Installing ...":"Installiere ...",Install:"Installieren",Installation:"Einrichtung","Installation Path":"Einrichtungs Pfad","Create start menu shortcuts":"Startmen\xFC Verkn\xFCpfungen erstellen","Create desktop icon":"Desktop Symbol erstellen",agreement_tip:"Wenn Sie die Einrichtung starten, akzeptieren Sie die Lizenzvereinbarung","Accept and Install":"Akzeptieren und installieren","End-user license agreement":"Lizenzvereinbarung f\xFCr Endbenutzer","Generating ...":"Generierung ...","Your installation is lower version.":"Ihre Installation ist eine niedrigere Version.",not_close_tcp_tip:"Schlie\xDFen Sie dieses Fenster nicht, w\xE4hrend Sie den Tunnel benutzen.","Listening ...":"H\xF6ren ...","Remote Host":"Entfernter Rechner","Remote Port":"Entfernter Port",Action:"Aktion",Add:"Hinzuf\xFCgen","Local Port":"Lokaler Port",setup_server_tip:"F\xFCr eine schnellere Verbindung, richten Sie bitte Ihren eigenen Verbindungsserver ein","Too short, at least 6 characters.":"Zu kurz, mindestens 6 Zeichen.","The confirmation is not identical.":"Die Best\xE4tigung ist nicht identisch.",Permissions:"Berechtigungen",Accept:"Akzeptieren",Dismiss:"Ablehnen",Disconnect:"Verbindung trennen","Allow using keyboard and mouse":"Erlaubt die Verwendung von Tastatur und Maus","Allow using clipboard":"Verwendung der Zwischenablage zulassen","Allow hearing sound":"Erlaubt das H\xF6ren von Sound","Allow file transfer":"Datei\xFCbertragung zulassen","File transfer":"Datei \xDCbertragung",Connected:"Verbunden","Direct and encrypted connection":"Direkte und verschl\xFCsselte Verbindung","Relayed and encrypted connection":"Vermittelte und verschl\xFCsselte Verbindung","Direct and unencrypted connection":"Direkte und unverschl\xFCsselte Verbindung","Relayed and unencrypted connection":"Vermittelte und unverschl\xFCsselte Verbindung","Enter Remote ID":"Remote-ID eingeben","Enter your password":"Geben Sie Ihr Passwort ein","Logging in...":"Anmeldung...","Enable RDP session sharing":"RDP-Sitzungsfreigabe aktivieren","Auto Login":'Automatisches Login (nur g\xFCltig, wenn Sie "Sperren nach Sitzungsende" eingestellt haben)',"Enable Direct IP Access":"Direkten IP-Zugang aktivieren",Rename:"Umbenennen",Space:"Platz","Create Desktop Shortcut":"Desktop-Verkn\xFCpfung erstellen","Change Path":"Pfad \xE4ndern","Create Folder":"Ordner erstellen","Please enter the folder name":"Bitte geben Sie den Ordnernamen ein","Fix it":"Reparieren",Warning:"Warnung","Login screen using Wayland is not supported":"Anmeldebildschirm mit Wayland wird nicht unterst\xFCtzt","Reboot required":"Neustart erforderlich","Unsupported display server ":"Nicht unterst\xFCtzter Display-Server","x11 expected":"X11 erwartet",Port:"Port",Settings:"Einstellungen",Username:" Benutzername","Invalid port":"Ung\xFCltiger Port","Closed manually by the peer":"Vom Peer manuell geschlossen","Enable remote configuration modification":"\xC4nderung der Fernkonfiguration zulassen","Run without install":"Ohne Installation ausf\xFChren","Always connected via relay":"Immer \xFCber Verbindungsserver verbunden","Always connect via relay":"Verbindung immer \xFCber Verbindungsserver",whitelist_tip:"Nur IPs auf der Freigabeliste k\xF6nnen auf mich zugreifen",Login:"Anmeldung",Logout:"Abmeldung",Tags:"Stichworte","Search ID":"Suche ID","Current Wayland display server is not supported":"Der aktuelle Wayland-Anzeigeserver wird nicht unterst\xFCtzt",whitelist_sep:"Getrennt durch Komma, Semikolon, Leerzeichen oder Zeilenumbruch","Add ID":"ID hinzuf\xFCgen","Add Tag":"Stichwort hinzuf\xFCgen","Unselect all tags":"Alle Stichworte abw\xE4hlen","Network error":"Netzwerkfehler","Username missed":"Benutzername fehlt","Password missed":"Passwort vergessen","Wrong credentials":"Falsche Anmeldedaten","Edit Tag":"Stichwort bearbeiten","Unremember Password":"Passwort nicht merken",Favorites:"Favoriten","Add to Favorites":"Zu Favoriten hinzuf\xFCgen","Remove from Favorites":"Entferne von Favoriten",Empty:"Leer","Invalid folder name":"Ung\xFCltiger Ordnername","Socks5 Proxy":"Socks5 Proxy",Hostname:"Rechnername",Discovered:"Gefunden",install_daemon_tip:"Um beim Booten zu starten, m\xFCssen Sie den Systemdienst installieren","Remote ID":"Entfernte ID",Paste:"Einf\xFCgen","Paste here?":"Hier einf\xFCgen?","Are you sure to close the connection?":"Sind Sie sicher, dass Sie die Verbindung schlie\xDFen wollen?","Download new version":"Neue Version herunterladen","Touch mode":"Touch-Modus","Mouse mode":"Mouse-Modus","One-Finger Tap":"Ein Fingertipp","Left Mouse":"Linke Maus","One-Long Tap":"Tippen Sie mit einem Finger lang","Two-Finger Tap":"Zwei Finger tippen","Right Mouse":"Rechte Maus","One-Finger Move":"Eine Fingerbewegung","Double Tap & Move":"Doppeltippen und verschieben","Mouse Drag":"Maus ziehen","Two-Finger vertically":"Zwei Finger vertikal","Mouse Wheel":"Mausrad","Two-Finger Move":"Zwei Finger Bewegung","Canvas Move":"Leinwand bewegen","Pinch to Zoom":"Zum Zoomen kneifen","Canvas Zoom":"Leinwand Zoom","Reset canvas":"Anzeige zur\xFCcksetzen","No permission of file transfer":"Keine Erlaubnis zur Datei\xFCbertragung",Note:"Notiz",Connection:"Verbindung","Share Screen":"Bildschirm freigeben",CLOSE:"NAH DRAN",OPEN:"OFFEN",Chat:"Plaudern",Total:"Gesamt",items:"Artikel",Selected:"Ausgew\xE4hlt","Screen Capture":"Bildschirmaufnahme","Mouse Control":"Maussteuerung","File Transfer":"Datei \xDCbertragung","Audio Capture":"Audioaufnahme","File Connection":"Dateiverbindung","Screen Connection":"Bildschirmanschluss","Do you accept?":"Akzeptieren Sie?","Open System Setting":"Systemeinstellung \xF6ffnen","How to get Android input permission?":"Wie erhalte ich eine Android-Eingabeberechtigung?",android_input_permission_tip1:"Nach Erhalt der Eingabeerlaubnis kann das entfernte Ger\xE4t dieses Android-Ger\xE4t per Maus steuern",android_input_permission_tip2:"Bitte gehen Sie zur n\xE4chsten Systemeinstellungsseite, suchen und geben Sie [Installierte Dienste] ein, schalten Sie den Dienst [RustDesk Input] ein",android_new_connection_tip:"Es wurde eine neue Steuerungsanforderung empfangen, die Ihr aktuelles Ger\xE4t steuern m\xF6chte.",android_service_will_start_tip:"Durch das Einschalten der Bildschirmaufnahme wird der Dienst automatisch gestartet, sodass andere Ger\xE4te eine Verbindung von diesem Ger\xE4t anfordern k\xF6nnen.",android_stop_service_tip:"Durch das Schlie\xDFen des Dienstes werden automatisch alle hergestellten Verbindungen geschlossen.",android_version_audio_tip:"Die aktuelle Android-Version unterst\xFCtzt keine Audioaufnahme, bitte aktualisieren Sie auf Android 10 oder h\xF6her.",android_start_service_tip:"Tippen Sie auf [Dienst starten] oder \xD6FFNEN Sie die Berechtigung [Bildschirmaufnahme], um den Bildschirmfreigabedienst zu starten.",Account:"Konto"},eo:{Status:"Stato","Your Desktop":"Via aparato",desk_tip:"Via aparato povas esti alirita kun tiu identigilo kaj pasvorto",Password:"Pasvorto",Ready:"Preta",Established:"",connecting_status:"Konektante al la reto RustDesk...","Enable Service":"Ebligi servon","Start Service":"Starti servon","Service is running":"","Service is not running":"La servo ne funkcias",not_ready_status:"Ne preta, bonvolu kontroli la retkonekto","Control Remote Desktop":"Kontroli foran aparaton","Transfer File":"Transigi dosieron",Connect:"Konekti al","Recent Sessions":"Lastaj sesioj","Address Book":"Adresaro",Confirmation:"Konfirmacio","TCP Tunneling":"Tunelado TCP",Remove:"Forigi","Refresh random password":"Regeneri hazardan pasvorton","Set your own password":"Agordi vian propran pasvorton","Enable Keyboard/Mouse":"Ebligi klavaro/muso","Enable Clipboard":"Sinkronigi po\u015Don","Enable File Transfer":"Ebligi dosiertransigado","Enable TCP Tunneling":"Ebligi tunelado TCP","IP Whitelisting":"Listo de IP akceptataj","ID/Relay Server":"Identigila/Relajsa servilo","Stop service":"Haltu servon","Change ID":"\u015Can\u011Di identigilon",Website:"Retejo",About:"Pri",Mute:"Muta","Audio Input":"A\u016Ddia enigo","ID Server":"Servilo de identigiloj","Relay Server":"Relajsa servilo","API Server":"Servilo de API",invalid_http:"Devas komenci kun http:// a\u016D https://","Invalid IP":"IP nevalida",id_change_tip:"Nur la signoj a-z, A-Z, 0-9, _ (substreko) povas esti uzataj. La unua litero povas esti inter a-z, A-Z. La longeco devas esti inter 6 kaj 16.","Invalid format":"Formato nevalida","This function is turned off by the server":"Tiu funkcio estas malebligata de la servilo","Not available":"Nedisponebla","Too frequent":"Tro ofte \u015Dan\u011Dita, bonvolu reprovi poste",Cancel:"Nuligi",Skip:"Ignori",Close:"Fermi",Retry:"Reprovi",OK:"Konfermi","Password Required":"Pasvorto deviga","Please enter your password":"Bonvolu tajpi vian pasvorton","Remember password":"Memori pasvorton","Wrong Password":"Erara pasvorto","Do you want to enter again?":"\u0108u vi aliri denove?","Connection Error":"Eraro de konektado",Error:"Eraro","Reset by the peer":"La konekto estas fermita de la samtavolano","Connecting...":"Konektante...","Connection in progress. Please wait.":"Konektado farata. Bonvolu atendi.","Please try 1 minute later":"Reprovi post 1 minuto","Login Error":"Eraro de konektado",Successful:"Sukceso","Connected, waiting for image...":"Konektita, atendante bildon...",Name:"Nomo",Type:"",Modified:"Modifita",Size:"Grandeco","Show Hidden Files":"Montri ka\u015Ditajn dosierojn",Receive:"Akcepti",Send:"Sendi","Refresh File":"",Local:"",Remote:"","Remote Computer":"Fora komputilo","Local Computer":"Loka komputilo","Confirm Delete":"Konfermi la forigo",Delete:"",Properties:"","Multi Select":"","Empty Directory":"","Not an empty directory":"","Are you sure you want to delete this file?":"\u0108u vi vere volas forigi tiun dosieron?","Are you sure you want to delete this empty directory?":"","Are you sure you want to delete the file of this directory?":"","Do this for all conflicts":"Same por \u0109iuj konfliktoj","This is irreversible!":"",Deleting:"Forigado",files:"dosiero",Waiting:"Atendante...",Finished:"Finita",Speed:"","Custom Image Quality":"Agordi bildan kvaliton","Privacy mode":"Modo privata","Block user input":"Bloki uzanta enigo","Unblock user input":"Malbloki uzanta enigo","Adjust Window":"Adapti fenestro",Original:"Originala rilatumo",Shrink:"\u015Crumpi",Stretch:"Stre\u0109i","Good image quality":"Bona bilda kvalito",Balanced:"Normala bilda kvalito","Optimize reaction time":"Optimigi reakcia tempo",Custom:"Personigi bilda kvalito","Show remote cursor":"Montri foran kursoron","Disable clipboard":"Malebligi po\u015Don","Lock after session end":"\u015Closi foran komputilon post malkonektado",Insert:"Enmeti","Insert Lock":"\u015Closi foran komputilon",Refresh:"Refre\u015Digi ekranon","ID does not exist":"La identigilo ne ekzistas","Failed to connect to rendezvous server":"Malsukcesis konekti al la servilo rendezvous","Please try later":"Bonvolu provi poste","Remote desktop is offline":"La fora aparato estas senkonektita","Key mismatch":"Miskongruo de klavoj",Timeout:"Konekta posttempo","Failed to connect to relay server":"Malsukcesis konekti al la relajsa servilo","Failed to connect via rendezvous server":"Malsukcesis konekti per servilo rendezvous","Failed to connect via relay server":"Malsukcesis konekti per relajsa servilo","Failed to make direct connection to remote desktop":"Malsukcesis konekti direkte","Set Password":"Agordi pasvorton","OS Password":"Pasvorto de la operaciumo",install_tip:"Vi ne uzas instalita versio. Pro limigoj pro UAC, kiel aparato kontrolata, en kelkaj kazoj, ne estos ebla kontroli la muson kaj klavaron a\u016D registri la ekranon. Bonvolu alkliku la butonon malsupre por instali RustDesk sur la operaciumo por eviti la demando supre.","Click to upgrade":"Alklaki por plibonigi","Click to download":"Alklaki por el\u015Duti","Click to update":"Alklaki por \u011Disdatigi","Configuration Permissions":"Permesoj de konfigurado",Configure:"Konfiguri",config_acc:'Por uzi vian foran aparaton, bonvolu doni la permeson "alirebleco" al RustDesk.',config_screen:'Por uzi vian foran aparaton, bonvolu doni la permeson "ekranregistrado" al RustDesk.',"Installing ...":"Instalante...",Install:"Instali",Installation:"Instalado","Installation Path":"Vojo de instalo","Create start menu shortcuts":"Aldoni ligilojn sur la startmenuo","Create desktop icon":"Aldoni ligilojn sur la labortablo",agreement_tip:"Starti la instaladon signifas akcepti la permesilon.","Accept and Install":"Akcepti kaj instali","End-user license agreement":"Uzanta permesilon","Generating ...":"Generante...","Your installation is lower version.":"Via versio de instala\u0135o estas pli malalta ol la lasta.",not_close_tcp_tip:"Bonvolu ne fermu tiun fenestron dum la uzo de la tunelo","Listening ...":"Atendante konekton al la tunelo...","Remote Host":"Fora gastiganto","Remote Port":"Fora pordo",Action:"Ago",Add:"Aldoni","Local Port":"Loka pordo",setup_server_tip:"Se vi bezonas pli rapida konekcio, vi povas krei vian propran servilon","Too short, at least 6 characters.":"Tro mallonga, almena\u016D 6 signoj.","The confirmation is not identical.":"Amba\u016D enigoj ne kongruas",Permissions:"Permesoj",Accept:"Akcepti",Dismiss:"Malakcepti",Disconnect:"Malkonekti","Allow using keyboard and mouse":"Permesi la uzon de la klavaro kaj muso","Allow using clipboard":"Permesi la uzon de la po\u015Do","Allow hearing sound":"Permesi la uzon de la sono","Allow file transfer":"Permesi la dosiertransigadon","File transfer":"Dosiertransigado",Connected:"Konektata","Direct and encrypted connection":"Konekcio direkta \u0109ifrata","Relayed and encrypted connection":"Konekcio relajsa \u0109ifrata","Direct and unencrypted connection":"Konekcio direkta ne\u0109ifrata","Relayed and unencrypted connection":"Konekcio relajsa ne\u0109ifrata","Enter Remote ID":"Tajpu foran identigilon","Enter your password":"Tajpu vian pasvorton","Logging in...":"Konektante...","Enable RDP session sharing":"Ebligi la kundivido de sesio RDP","Auto Login":"A\u016Dtomata konektado (la \u015Dloso nur estos ebligita post la malebligado de la unua parametro)","Enable Direct IP Access":"Permesi direkta eniro per IP",Rename:"Renomi",Space:"Spaco","Create Desktop Shortcut":"Krei ligilon sur la labortablon","Change Path":"\u015Can\u011Di vojon","Create Folder":"Krei dosierujon","Please enter the folder name":"Bonvolu enigi la dosiernomon","Fix it":"Riparu \u011Din",Warning:"Averto","Login screen using Wayland is not supported":"Konektajn ekranojn uzantajn Wayland ne estas subtenitaj","Reboot required":"Restarto deviga","Unsupported display server ":"La aktuala bilda servilo ne estas subtenita","x11 expected":"Bonvolu uzi x11",Port:"Pordo",Settings:"Agordoj",Username:" Uzanta nomo","Invalid port":"Pordo nevalida","Closed manually by the peer":"Manuale fermita de la samtavolano","Enable remote configuration modification":"Permesi foran redaktadon de la konfiguracio","Run without install":"Plenumi sen instali","Always connected via relay":"\u0108iam konektata per relajso","Always connect via relay":"\u0108iam konekti per relajso",whitelist_tip:"Nur la IP en la blanka listo povas kontroli mian komputilon",Login:"Konekti",Logout:"Malkonekti",Tags:"Etikedi","Search ID":"Ser\u0109i ID","Current Wayland display server is not supported":"La aktuala bilda servilo Wayland ne estas subtenita",whitelist_sep:"Vi povas uzi komon, punktokomon, spacon a\u016D linsalton kiel apartigilo","Add ID":"Aldoni identigilo","Add Tag":"Aldoni etikedo","Unselect all tags":"Malselekti \u0109iujn etikedojn","Network error":"Reta eraro","Username missed":"Uzantnomo forgesita","Password missed":"Pasvorto forgesita","Wrong credentials":"Identigilo a\u016D pasvorto erara","Edit Tag":"Redakti etikedo","Unremember Password":"Forgesi pasvorton",Favorites:"Favorataj","Add to Favorites":"Aldoni al la favorataj","Remove from Favorites":"Forigi el la favorataj",Empty:"Malplena","Invalid folder name":"Dosiernomo nevalida","Socks5 Proxy":"Socks5 prokura servilo",Hostname:"Nomo de gastiga",Discovered:"Malkovritaj",install_daemon_tip:"","Remote ID":"Fora identigilo",Paste:"Alglui","Paste here?":"","Are you sure to close the connection?":"\u0108u vi vere volas fermi la konekton?","Download new version":"El\u015Duti la novan version","Touch mode":"Tu\u015Da modo","Mouse mode":"","One-Finger Tap":"","Left Mouse":"","One-Long Tap":"","Two-Finger Tap":"","Right Mouse":"","One-Finger Move":"","Double Tap & Move":"","Mouse Drag":"","Two-Finger vertically":"","Mouse Wheel":"","Two-Finger Move":"","Canvas Move":"","Pinch to Zoom":"","Canvas Zoom":"","Reset canvas":"Restarigi kanvaso","No permission of file transfer":"Neniu permeso de dosiertransigo",Note:"Notu",Connection:"","Share Screen":"",CLOSE:"",OPEN:"",Chat:"",Total:"",items:"",Selected:"","Screen Capture":"","Mouse Control":"","File Transfer":"","Audio Capture":"","File Connection":"","Screen Connection":"","Do you accept?":"","Open System Setting":"","How to get Android input permission?":"",android_input_permission_tip1:"",android_input_permission_tip2:"",android_new_connection_tip:"",android_service_will_start_tip:"",android_stop_service_tip:"",android_version_audio_tip:"",android_start_service_tip:"",Account:""},cn:{Status:"\u72B6\u6001","Your Desktop":"\u4F60\u7684\u684C\u9762",desk_tip:"\u4F60\u7684\u684C\u9762\u53EF\u4EE5\u901A\u8FC7\u4E0B\u9762\u7684ID\u548C\u5BC6\u7801\u8BBF\u95EE\u3002",Password:"\u5BC6\u7801",Ready:"\u5C31\u7EEA",Established:"\u5DF2\u5EFA\u7ACB",connecting_status:"\u6B63\u5728\u63A5\u5165RustDesk\u7F51\u7EDC...","Enable Service":"\u5141\u8BB8\u670D\u52A1","Start Service":"\u542F\u52A8\u670D\u52A1","Service is running":"\u670D\u52A1\u6B63\u5728\u8FD0\u884C","Service is not running":"\u670D\u52A1\u6CA1\u6709\u542F\u52A8",not_ready_status:"\u672A\u5C31\u7EEA\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5","Control Remote Desktop":"\u63A7\u5236\u8FDC\u7A0B\u684C\u9762","Transfer File":"\u4F20\u8F93\u6587\u4EF6",Connect:"\u8FDE\u63A5","Recent Sessions":"\u6700\u8FD1\u8BBF\u95EE\u8FC7","Address Book":"\u5730\u5740\u7C3F",Confirmation:"\u786E\u8BA4","TCP Tunneling":"TCP\u96A7\u9053",Remove:"\u5220\u9664","Refresh random password":"\u5237\u65B0\u968F\u673A\u5BC6\u7801","Set your own password":"\u8BBE\u7F6E\u5BC6\u7801","Enable Keyboard/Mouse":"\u5141\u8BB8\u63A7\u5236\u952E\u76D8/\u9F20\u6807","Enable Clipboard":"\u5141\u8BB8\u540C\u6B65\u526A\u8D34\u677F","Enable File Transfer":"\u5141\u8BB8\u4F20\u8F93\u6587\u4EF6","Enable TCP Tunneling":"\u5141\u8BB8\u5EFA\u7ACBTCP\u96A7\u9053","IP Whitelisting":"IP\u767D\u540D\u5355","ID/Relay Server":"ID/\u4E2D\u7EE7\u670D\u52A1\u5668","Stop service":"\u505C\u6B62\u670D\u52A1","Change ID":"\u6539\u53D8ID",Website:"\u7F51\u7AD9",About:"\u5173\u4E8E",Mute:"\u9759\u97F3","Audio Input":"\u97F3\u9891\u8F93\u5165","ID Server":"ID\u670D\u52A1\u5668","Relay Server":"\u4E2D\u7EE7\u670D\u52A1\u5668","API Server":"API\u670D\u52A1\u5668",invalid_http:"\u5FC5\u987B\u4EE5http://\u6216\u8005https://\u5F00\u5934","Invalid IP":"\u65E0\u6548IP",id_change_tip:"\u53EA\u53EF\u4EE5\u4F7F\u7528\u5B57\u6BCDa-z, A-Z, 0-9, _ (\u4E0B\u5212\u7EBF)\u3002\u9996\u5B57\u6BCD\u5FC5\u987B\u662Fa-z, A-Z\u3002\u957F\u5EA6\u57286\u4E0E16\u4E4B\u95F4\u3002","Invalid format":"\u65E0\u6548\u683C\u5F0F","This function is turned off by the server":"\u670D\u52A1\u5668\u5173\u95ED\u4E86\u6B64\u529F\u80FD","Not available":"\u5DF2\u88AB\u5360\u7528","Too frequent":"\u4FEE\u6539\u592A\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",Cancel:"\u53D6\u6D88",Skip:"\u8DF3\u8FC7",Close:"\u5173\u95ED",Retry:"\u518D\u8BD5",OK:"\u786E\u8BA4","Password Required":"\u9700\u8981\u5BC6\u7801","Please enter your password":"\u8BF7\u8F93\u5165\u5BC6\u7801","Remember password":"\u8BB0\u4F4F\u5BC6\u7801","Wrong Password":"\u5BC6\u7801\u9519\u8BEF","Do you want to enter again?":"\u8FD8\u60F3\u8F93\u5165\u4E00\u6B21\u5417?","Connection Error":"\u8FDE\u63A5\u9519\u8BEF",Error:"\u9519\u8BEF","Reset by the peer":"\u8FDE\u63A5\u88AB\u5BF9\u65B9\u5173\u95ED","Connecting...":"\u6B63\u5728\u8FDE\u63A5...","Connection in progress. Please wait.":"\u8FDE\u63A5\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u7B49\u3002","Please try 1 minute later":"\u4E00\u5206\u949F\u540E\u518D\u8BD5","Login Error":"\u767B\u5F55\u9519\u8BEF",Successful:"\u6210\u529F","Connected, waiting for image...":"\u5DF2\u8FDE\u63A5\uFF0C\u7B49\u5F85\u753B\u9762\u4F20\u8F93...",Name:"\u540D\u79F0",Type:"\u7C7B\u578B",Modified:"\u4FEE\u6539\u65F6\u95F4",Size:"\u5927\u5C0F","Show Hidden Files":"\u663E\u793A\u9690\u85CF\u6587\u4EF6",Receive:"\u63A5\u53D7",Send:"\u53D1\u9001","Refresh File":"\u5237\u65B0\u6587\u4EF6",Local:"\u672C\u5730",Remote:"\u8FDC\u7A0B","Remote Computer":"\u8FDC\u7A0B\u7535\u8111","Local Computer":"\u672C\u5730\u7535\u8111","Confirm Delete":"\u786E\u8BA4\u5220\u9664",Delete:"\u5220\u9664",Properties:"\u5C5E\u6027","Multi Select":"\u591A\u9009","Empty Directory":"\u7A7A\u6587\u4EF6\u5939","Not an empty directory":"\u8FD9\u4E0D\u662F\u4E00\u4E2A\u7A7A\u6587\u4EF6\u5939","Are you sure you want to delete this file?":"\u662F\u5426\u5220\u9664\u6B64\u6587\u4EF6?","Are you sure you want to delete this empty directory?":"\u662F\u5426\u5220\u9664\u6B64\u7A7A\u6587\u4EF6\u5939?","Are you sure you want to delete the file of this directory?":"\u662F\u5426\u5220\u9664\u6587\u4EF6\u5939\u4E0B\u7684\u6587\u4EF6?","Do this for all conflicts":"\u5E94\u7528\u4E8E\u5176\u5B83\u51B2\u7A81","This is irreversible!":"\u6B64\u64CD\u4F5C\u4E0D\u53EF\u9006\uFF01",Deleting:"\u6B63\u5728\u5220\u9664",files:"\u6587\u4EF6",Waiting:"\u7B49\u5F85...",Finished:"\u5B8C\u6210",Speed:"\u901F\u5EA6","Custom Image Quality":"\u8BBE\u7F6E\u753B\u9762\u8D28\u91CF","Privacy mode":"\u9690\u79C1\u6A21\u5F0F","Block user input":"\u963B\u6B62\u7528\u6237\u8F93\u5165","Unblock user input":"\u53D6\u6D88\u963B\u6B62\u7528\u6237\u8F93\u5165","Adjust Window":"\u8C03\u8282\u7A97\u53E3",Original:"\u539F\u59CB\u6BD4\u4F8B",Shrink:"\u6536\u7F29",Stretch:"\u4F38\u5C55","Good image quality":"\u597D\u753B\u8D28",Balanced:"\u4E00\u822C\u753B\u8D28","Optimize reaction time":"\u4F18\u5316\u53CD\u5E94\u65F6\u95F4",Custom:"\u81EA\u5B9A\u4E49\u753B\u8D28","Show remote cursor":"\u663E\u793A\u8FDC\u7A0B\u5149\u6807","Disable clipboard":"\u7981\u6B62\u526A\u8D34\u677F","Lock after session end":"\u65AD\u5F00\u540E\u9501\u5B9A\u8FDC\u7A0B\u7535\u8111",Insert:"\u63D2\u5165","Insert Lock":"\u9501\u5B9A\u8FDC\u7A0B\u7535\u8111",Refresh:"\u5237\u65B0\u753B\u9762","ID does not exist":"ID\u4E0D\u5B58\u5728","Failed to connect to rendezvous server":"\u8FDE\u63A5\u6CE8\u518C\u670D\u52A1\u5668\u5931\u8D25","Please try later":"\u8BF7\u7A0D\u540E\u518D\u8BD5","Remote desktop is offline":"\u8FDC\u7A0B\u7535\u8111\u4E0D\u5728\u7EBF","Key mismatch":"Key\u4E0D\u5339\u914D",Timeout:"\u8FDE\u63A5\u8D85\u65F6","Failed to connect to relay server":"\u65E0\u6CD5\u8FDE\u63A5\u5230\u4E2D\u7EE7\u670D\u52A1\u5668","Failed to connect via rendezvous server":"\u65E0\u6CD5\u901A\u8FC7\u6CE8\u518C\u670D\u52A1\u5668\u5EFA\u7ACB\u8FDE\u63A5","Failed to connect via relay server":"\u65E0\u6CD5\u901A\u8FC7\u4E2D\u7EE7\u670D\u52A1\u5668\u5EFA\u7ACB\u8FDE\u63A5","Failed to make direct connection to remote desktop":"\u65E0\u6CD5\u5EFA\u7ACB\u76F4\u63A5\u8FDE\u63A5","Set Password":"\u8BBE\u7F6E\u5BC6\u7801","OS Password":"\u64CD\u4F5C\u7CFB\u7EDF\u5BC6\u7801",install_tip:"\u4F60\u6B63\u5728\u8FD0\u884C\u672A\u5B89\u88C5\u7248\u672C\uFF0C\u7531\u4E8EUAC\u9650\u5236\uFF0C\u4F5C\u4E3A\u88AB\u63A7\u7AEF\uFF0C\u4F1A\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B\u65E0\u6CD5\u63A7\u5236\u9F20\u6807\u952E\u76D8\uFF0C\u6216\u8005\u5F55\u5236\u5C4F\u5E55\uFF0C\u8BF7\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\u5C06RustDesk\u5B89\u88C5\u5230\u7CFB\u7EDF\uFF0C\u4ECE\u800C\u89C4\u907F\u4E0A\u8FF0\u95EE\u9898\u3002","Click to upgrade":"\u70B9\u51FB\u8FD9\u91CC\u5347\u7EA7","Click to download":"\u70B9\u51FB\u8FD9\u91CC\u4E0B\u8F7D","Click to update":"\u70B9\u51FB\u8FD9\u91CC\u66F4\u65B0","Configuration Permissions":"\u914D\u7F6E\u6743\u9650",Configure:"\u914D\u7F6E",config_acc:'\u4E3A\u4E86\u80FD\u591F\u8FDC\u7A0B\u63A7\u5236\u4F60\u7684\u684C\u9762, \u8BF7\u7ED9\u4E88RustDesk"\u8F85\u52A9\u529F\u80FD" \u6743\u9650\u3002',config_screen:'\u4E3A\u4E86\u80FD\u591F\u8FDC\u7A0B\u8BBF\u95EE\u4F60\u7684\u684C\u9762, \u8BF7\u7ED9\u4E88RustDesk"\u5C4F\u5E55\u5F55\u5236" \u6743\u9650\u3002',"Installing ...":"\u5B89\u88C5 ...",Install:"\u5B89\u88C5",Installation:"\u5B89\u88C5","Installation Path":"\u5B89\u88C5\u8DEF\u5F84","Create start menu shortcuts":"\u521B\u5EFA\u542F\u52A8\u83DC\u5355\u5FEB\u6377\u65B9\u5F0F","Create desktop icon":"\u521B\u5EFA\u684C\u9762\u56FE\u6807",agreement_tip:"\u5F00\u59CB\u5B89\u88C5\u5373\u8868\u793A\u63A5\u53D7\u8BB8\u53EF\u534F\u8BAE\u3002","Accept and Install":"\u540C\u610F\u5E76\u5B89\u88C5","End-user license agreement":"\u7528\u6237\u534F\u8BAE","Generating ...":"\u6B63\u5728\u4EA7\u751F ...","Your installation is lower version.":"\u4F60\u5B89\u88C5\u7684\u7248\u672C\u6BD4\u5F53\u524D\u8FD0\u884C\u7684\u4F4E\u3002",not_close_tcp_tip:"\u8BF7\u5728\u4F7F\u7528\u96A7\u9053\u7684\u65F6\u5019\uFF0C\u4E0D\u8981\u5173\u95ED\u672C\u7A97\u53E3","Listening ...":"\u6B63\u5728\u7B49\u5F85\u96A7\u9053\u8FDE\u63A5 ...","Remote Host":"\u8FDC\u7A0B\u4E3B\u673A","Remote Port":"\u8FDC\u7A0B\u7AEF\u53E3",Action:"\u52A8\u4F5C",Add:"\u6DFB\u52A0","Local Port":"\u672C\u5730\u7AEF\u53E3",setup_server_tip:"\u5982\u679C\u9700\u8981\u66F4\u5FEB\u8FDE\u63A5\u901F\u5EA6\uFF0C\u4F60\u53EF\u4EE5\u9009\u62E9\u81EA\u5EFA\u670D\u52A1\u5668","Too short, at least 6 characters.":"\u592A\u77ED\u4E86\uFF0C\u81F3\u5C116\u4E2A\u5B57\u7B26","The confirmation is not identical.":"\u4E24\u6B21\u8F93\u5165\u4E0D\u5339\u914D",Permissions:"\u6743\u9650",Accept:"\u63A5\u53D7",Dismiss:"\u62D2\u7EDD",Disconnect:"\u65AD\u5F00\u8FDE\u63A5","Allow using keyboard and mouse":"\u5141\u8BB8\u4F7F\u7528\u952E\u76D8\u9F20\u6807","Allow using clipboard":"\u5141\u8BB8\u4F7F\u7528\u526A\u8D34\u677F","Allow hearing sound":"\u5141\u8BB8\u542C\u5230\u58F0\u97F3","Allow file transfer":"\u5141\u8BB8\u6587\u4EF6\u4F20\u8F93","File transfer":"\u6587\u4EF6\u4F20\u8F93",Connected:"\u5DF2\u7ECF\u8FDE\u63A5","Direct and encrypted connection":"\u52A0\u5BC6\u76F4\u8FDE","Relayed and encrypted connection":"\u52A0\u5BC6\u4E2D\u7EE7\u8FDE\u63A5","Direct and unencrypted connection":"\u975E\u52A0\u5BC6\u76F4\u8FDE","Relayed and unencrypted connection":"\u975E\u52A0\u5BC6\u4E2D\u7EE7\u8FDE\u63A5","Enter Remote ID":"\u8F93\u5165\u5BF9\u65B9ID","Enter your password":"\u8F93\u5165\u5BC6\u7801","Logging in...":"\u6B63\u5728\u767B\u5F55...","Enable RDP session sharing":"\u5141\u8BB8RDP\u4F1A\u8BDD\u5171\u4EAB","Auto Login":"\u81EA\u52A8\u767B\u5F55\uFF08\u8BBE\u7F6E\u65AD\u5F00\u540E\u9501\u5B9A\u624D\u6709\u6548\uFF09","Enable Direct IP Access":"\u5141\u8BB8IP\u76F4\u63A5\u8BBF\u95EE",Rename:"\u6539\u540D",Space:"\u7A7A\u683C","Create Desktop Shortcut":"\u521B\u5EFA\u684C\u9762\u5FEB\u6377\u65B9\u5F0F","Change Path":"\u6539\u53D8\u8DEF\u5F84","Create Folder":"\u521B\u5EFA\u6587\u4EF6\u5939","Please enter the folder name":"\u8BF7\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0","Fix it":"\u4FEE\u590D",Warning:"\u8B66\u544A","Login screen using Wayland is not supported":"\u4E0D\u652F\u6301\u4F7F\u7528 Wayland \u767B\u5F55\u754C\u9762","Reboot required":"\u91CD\u542F\u540E\u624D\u80FD\u751F\u6548","Unsupported display server ":"\u4E0D\u652F\u6301\u5F53\u524D\u663E\u793A\u670D\u52A1\u5668","x11 expected":"\u8BF7\u5207\u6362\u5230 x11",Port:"\u7AEF\u53E3",Settings:"\u8BBE\u7F6E",Username:" \u7528\u6237\u540D","Invalid port":"\u65E0\u6548\u7AEF\u53E3","Closed manually by the peer":"\u88AB\u5BF9\u65B9\u624B\u52A8\u5173\u95ED","Enable remote configuration modification":"\u5141\u8BB8\u8FDC\u7A0B\u4FEE\u6539\u914D\u7F6E","Run without install":"\u65E0\u5B89\u88C5\u8FD0\u884C","Always connected via relay":"\u5F3A\u5236\u8D70\u4E2D\u7EE7\u8FDE\u63A5","Always connect via relay":"\u5F3A\u5236\u8D70\u4E2D\u7EE7\u8FDE\u63A5",whitelist_tip:"\u53EA\u6709\u767D\u540D\u5355\u91CC\u7684ip\u624D\u80FD\u8BBF\u95EE\u6211",Login:"\u767B\u5F55",Logout:"\u767B\u51FA",Tags:"\u6807\u7B7E","Search ID":"\u67E5\u627EID","Current Wayland display server is not supported":"\u4E0D\u652F\u6301 Wayland \u663E\u793A\u670D\u52A1\u5668",whitelist_sep:"\u53EF\u4EE5\u4F7F\u7528\u9017\u53F7\uFF0C\u5206\u53F7\uFF0C\u7A7A\u683C\u6216\u8005\u6362\u884C\u7B26\u4F5C\u4E3A\u5206\u9694\u7B26","Add ID":"\u589E\u52A0ID","Add Tag":"\u589E\u52A0\u6807\u7B7E","Unselect all tags":"\u53D6\u6D88\u9009\u62E9\u6240\u6709\u6807\u7B7E","Network error":"\u7F51\u7EDC\u9519\u8BEF","Username missed":"\u7528\u6237\u540D\u6CA1\u6709\u586B\u5199","Password missed":"\u5BC6\u7801\u6CA1\u6709\u586B\u5199","Wrong credentials":"\u7528\u6237\u540D\u6216\u8005\u5BC6\u7801\u9519\u8BEF","Edit Tag":"\u4FEE\u6539\u6807\u7B7E","Unremember Password":"\u5FD8\u6389\u5BC6\u7801",Favorites:"\u6536\u85CF","Add to Favorites":"\u52A0\u5165\u5230\u6536\u85CF","Remove from Favorites":"\u4ECE\u6536\u85CF\u4E2D\u5220\u9664",Empty:"\u7A7A\u7A7A\u5982\u4E5F","Invalid folder name":"\u65E0\u6548\u6587\u4EF6\u5939\u540D\u79F0","Socks5 Proxy":"Socks5 \u4EE3\u7406",Hostname:"\u4E3B\u673A\u540D",Discovered:"\u5DF2\u53D1\u73B0",install_daemon_tip:"\u4E3A\u4E86\u5F00\u673A\u542F\u52A8\uFF0C\u8BF7\u5B89\u88C5\u7CFB\u7EDF\u670D\u52A1\u3002","Remote ID":"\u8FDC\u7A0BID",Paste:"\u7C98\u8D34","Paste here?":"\u7C98\u8D34\u5230\u8FD9\u91CC?","Are you sure to close the connection?":"\u662F\u5426\u786E\u8BA4\u5173\u95ED\u8FDE\u63A5\uFF1F","Download new version":"\u4E0B\u8F7D\u65B0\u7248\u672C","Touch mode":"\u89E6\u5C4F\u6A21\u5F0F","Mouse mode":"\u9F20\u6807\u6A21\u5F0F","One-Finger Tap":"\u5355\u6307\u8F7B\u89E6","Left Mouse":"\u9F20\u6807\u5DE6\u952E","One-Long Tap":"\u5355\u6307\u957F\u6309","Two-Finger Tap":"\u53CC\u6307\u8F7B\u89E6","Right Mouse":"\u9F20\u6807\u53F3\u952E","One-Finger Move":"\u5355\u6307\u79FB\u52A8","Double Tap & Move":"\u53CC\u51FB\u5E76\u79FB\u52A8","Mouse Drag":"\u9F20\u6807\u9009\u4E2D\u62D6\u52A8","Two-Finger vertically":"\u53CC\u6307\u5782\u76F4\u6ED1\u52A8","Mouse Wheel":"\u9F20\u6807\u6EDA\u8F6E","Two-Finger Move":"\u53CC\u6307\u79FB\u52A8","Canvas Move":"\u79FB\u52A8\u753B\u5E03","Pinch to Zoom":"\u53CC\u6307\u7F29\u653E","Canvas Zoom":"\u7F29\u653E\u753B\u5E03","Reset canvas":"\u91CD\u7F6E\u753B\u5E03","No permission of file transfer":"\u6CA1\u6709\u6587\u4EF6\u4F20\u8F93\u6743\u9650",Note:"\u5907\u6CE8",Connection:"\u8FDE\u63A5","Share Screen":"\u5171\u4EAB\u5C4F\u5E55",CLOSE:"\u5173\u95ED",OPEN:"\u5F00\u542F",Chat:"\u804A\u5929\u6D88\u606F",Total:"\u603B\u8BA1",items:"\u4E2A\u9879\u76EE",Selected:"\u5DF2\u9009\u62E9","Screen Capture":"\u5C4F\u5E55\u5F55\u5236","Mouse Control":"\u9F20\u6807\u8F93\u5165","File Transfer":"\u6587\u4EF6\u4F20\u8F93","Audio Capture":"\u97F3\u9891\u5F55\u5236","File Connection":"\u6587\u4EF6\u8FDE\u63A5","Screen Connection":"\u5C4F\u5E55\u8FDE\u63A5","Do you accept?":"\u662F\u5426\u63A5\u53D7\uFF1F","Open System Setting":"\u6253\u5F00\u7CFB\u7EDF\u8BBE\u7F6E","How to get Android input permission?":"\u5982\u4F55\u83B7\u53D6\u5B89\u5353\u7684\u8F93\u5165\u6743\u9650\uFF1F",android_input_permission_tip1:"\u83B7\u53D6\u8F93\u5165\u6743\u9650\u540E\u53EF\u4EE5\u8BA9\u8FDC\u7A0B\u8BBE\u5907\u901A\u8FC7\u9F20\u6807\u63A7\u5236\u8FD9\u53F0\u5B89\u5353\u8BBE\u5907",android_input_permission_tip2:"\u8BF7\u5728\u63A5\u4E0B\u6765\u7684\u7CFB\u7EDF\u8BBE\u7F6E\u9875\u9762\u91CC\uFF0C\u627E\u5230\u5E76\u8FDB\u5165 [\u5DF2\u5B89\u88C5\u7684\u670D\u52A1] \u9875\u9762\uFF0C\u5C06 [RustDesk Input] \u670D\u52A1\u5F00\u542F",android_new_connection_tip:"\u6536\u5230\u65B0\u7684\u8FDE\u63A5\u63A7\u5236\u8BF7\u6C42\uFF0C\u5BF9\u65B9\u60F3\u8981\u63A7\u5236\u4F60\u5F53\u524D\u7684\u8BBE\u5907\u3002",android_service_will_start_tip:"\u5F00\u542F\u5F55\u5C4F\u6743\u9650\u5C06\u81EA\u52A8\u5F00\u542F\u670D\u52A1\uFF0C\u5141\u8BB8\u5176\u4ED6\u8BBE\u5907\u5411\u6B64\u8BBE\u5907\u8BF7\u6C42\u5EFA\u7ACB\u8FDE\u63A5\u3002",android_stop_service_tip:"\u5173\u95ED\u670D\u52A1\u5C06\u81EA\u52A8\u5173\u95ED\u6240\u6709\u5DF2\u5EFA\u7ACB\u7684\u8FDE\u63A5\u3002",android_version_audio_tip:"\u5F53\u524D\u5B89\u5353\u7248\u672C\u4E0D\u652F\u6301\u97F3\u9891\u5F55\u5236\uFF0C\u8BF7\u5347\u7EA7\u81F3\u5B89\u535310\u6216\u66F4\u9AD8\u3002",android_start_service_tip:"\u70B9\u51FB [\u542F\u52A8\u670D\u52A1] \u6216\u6253\u5F00 [\u5C4F\u5E55\u5F55\u5236] \u6743\u9650\u5F00\u542F\u624B\u673A\u5C4F\u5E55\u5171\u4EAB\u670D\u52A1\u3002",Account:"\u8D26\u53F7"},it:{Status:"Stato","Your Desktop":"Il tuo desktop",desk_tip:"Puoi accedere al tuo desktop usando l'ID e la password riportati qui.",Password:"Password",Ready:"Pronto",Established:"Stabilito",connecting_status:"Connessione alla rete RustDesk in corso...","Enable Service":"Abilita servizio","Start Service":"Avvia servizio","Service is running":"Il servizio \xE8 in esecuzione","Service is not running":"Il servizio non \xE8 in esecuzione",not_ready_status:"Non pronto. Verifica la tua connessione","Control Remote Desktop":"Controlla una scrivania remota","Transfer File":"Trasferisci file",Connect:"Connetti","Recent Sessions":"Sessioni recenti","Address Book":"Rubrica",Confirmation:"Conferma","TCP Tunneling":"Tunnel TCP",Remove:"Rimuovi","Refresh random password":"Nuova password casuale","Set your own password":"Imposta la tua password","Enable Keyboard/Mouse":"Abilita tastiera/mouse","Enable Clipboard":"Abilita appunti","Enable File Transfer":"Abilita trasferimento file","Enable TCP Tunneling":"Abilita tunnel TCP","IP Whitelisting":"IP autorizzati","ID/Relay Server":"Server ID/Relay","Stop service":"Arresta servizio","Change ID":"Cambia ID",Website:"Sito web",About:"Informazioni",Mute:"Silenzia","Audio Input":"Input audio","ID Server":"ID server","Relay Server":"Server relay","API Server":"Server API",invalid_http:"deve iniziare con http:// o https://","Invalid IP":"Indirizzo IP non valido",id_change_tip:"Puoi usare solo i caratteri a-z, A-Z, 0-9 e _ (underscore). Il primo carattere deve essere a-z o A-Z. La lunghezza deve essere fra 6 e 16 caratteri.","Invalid format":"Formato non valido","This function is turned off by the server":"Questa funzione \xE8 disabilitata sul server","Not available":"Non disponibile","Too frequent":"Troppo frequente",Cancel:"Annulla",Skip:"Ignora",Close:"Chiudi",Retry:"Riprova",OK:"OK","Password Required":"Password richiesta","Please enter your password":"Inserisci la tua password","Remember password":"Ricorda password","Wrong Password":"Password errata","Do you want to enter again?":"Vuoi riprovare?","Connection Error":"Errore di connessione",Error:"Errore","Reset by the peer":"Reimpostata dal peer","Connecting...":"Connessione...","Connection in progress. Please wait.":"Connessione in corso. Attendi.","Please try 1 minute later":"Per favore riprova fra 1 minuto","Login Error":"Errore di login",Successful:"Successo","Connected, waiting for image...":"Connesso, in attesa dell'immagine...",Name:"Nome",Type:"Tipo",Modified:"Modificato",Size:"Dimensione","Show Hidden Files":"Mostra file nascosti",Receive:"Ricevi",Send:"Invia","Refresh File":"Aggiorna file",Local:"Locale",Remote:"Remote","Remote Computer":"Computer remoto","Local Computer":"Computer locale","Confirm Delete":"Conferma cancellazione",Delete:"Eliminare",Properties:"Propriet\xE0","Multi Select":"Selezione multipla","Empty Directory":"Directory vuota","Not an empty directory":"Non una directory vuota","Are you sure you want to delete this file?":"Vuoi davvero eliminare questo file?","Are you sure you want to delete this empty directory?":"Sei sicuro di voler eliminare questa directory vuota?","Are you sure you want to delete the file of this directory?":"Sei sicuro di voler eliminare il file di questa directory?","Do this for all conflicts":"Ricorca questa scelta per tutti i conflitti","This is irreversible!":"Questo \xE8 irreversibile!",Deleting:"Cancellazione di",files:"file",Waiting:"In attesa",Finished:"Terminato",Speed:"Velocit\xE0","Custom Image Quality":"Qualit\xE0 immagine personalizzata","Privacy mode":"Modalit\xE0 privacy","Block user input":"Blocca l'input dell'utente","Unblock user input":"Sbloccare l'input dell'utente","Adjust Window":"Adatta la finestra",Original:"Originale",Shrink:"Restringi",Stretch:"Allarga","Good image quality":"Buona qualit\xE0 immagine",Balanced:"Bilanciato","Optimize reaction time":"Ottimizza il tempo di reazione",Custom:"Personalizzato","Show remote cursor":"Mostra il cursore remoto","Disable clipboard":"Disabilita appunti","Lock after session end":"Blocca al termine della sessione",Insert:"Inserisci","Insert Lock":"Blocco inserimento",Refresh:"Aggiorna","ID does not exist":"L'ID non esiste","Failed to connect to rendezvous server":"Errore di connessione al server rendezvous","Please try later":"Riprova pi\xF9 tardi","Remote desktop is offline":"Il desktop remoto \xE8 offline","Key mismatch":"La chiave non corrisponde",Timeout:"Timeout","Failed to connect to relay server":"Errore di connessione al server relay","Failed to connect via rendezvous server":"Errore di connessione tramite il server rendezvous","Failed to connect via relay server":"Errore di connessione tramite il server relay","Failed to make direct connection to remote desktop":"Impossibile connettersi direttamente al desktop remoto","Set Password":"Imposta password","OS Password":"Password del sistema operativo",install_tip:"A causa del Controllo Account Utente, RustDesk potrebbe non funzionare correttamente come desktop remoto. Per evitare questo problema, fai click sul tasto qui sotto per installare RustDesk a livello di sistema.","Click to upgrade":"Fai click per aggiornare","Click to download":"Cliquez per scaricare","Click to update":"Fare clic per aggiornare","Configuration Permissions":"Permessi di configurazione",Configure:"Configura",config_acc:`Per controllare il tuo desktop dall'esterno, devi fornire a RustDesk il permesso "Accessibilit\xE0".`,config_screen:`Per controllare il tuo desktop dall'esterno, devi fornire a RustDesk il permesso "Registrazione schermo".`,"Installing ...":"Installazione ...",Install:"Installa",Installation:"Installazione","Installation Path":"Percorso di installazione","Create start menu shortcuts":"Crea i collegamenti nel menu di avvio","Create desktop icon":"Crea un'icona sul desktop",agreement_tip:"Avviando l'installazione, accetti i termini del contratto di licenza.","Accept and Install":"Accetta e installa","End-user license agreement":"Contratto di licenza con l'utente finale","Generating ...":"Generazione ...","Your installation is lower version.":"La tua installazione non \xE8 aggiornata.",not_close_tcp_tip:"Non chiudere questa finestra mentre stai usando il tunnel","Listening ...":"In ascolto ...","Remote Host":"Host remoto","Remote Port":"Porta remota",Action:"Azione",Add:"Aggiungi","Local Port":"Porta locale",setup_server_tip:"Per una connessione pi\xF9 veloce, configura un tuo server","Too short, at least 6 characters.":"Troppo breve, almeno 6 caratteri","The confirmation is not identical.":"La conferma non corrisponde",Permissions:"Permessi",Accept:"Accetta",Dismiss:"Rifiuta",Disconnect:"Disconnetti","Allow using keyboard and mouse":"Consenti l'uso di tastiera e mouse","Allow using clipboard":"Consenti l'uso degli appunti","Allow hearing sound":"Consenti la riproduzione dell'audio","Allow file transfer":"Consenti trasferimento file","File transfer":"Trasferimento di file",Connected:"Connesso","Direct and encrypted connection":"Connessione diretta e cifrata","Relayed and encrypted connection":"Connessione tramite relay e cifrata","Direct and unencrypted connection":"Connessione diretta e non cifrata","Relayed and unencrypted connection":"Connessione tramite relay e non cifrata","Enter Remote ID":"Inserisci l'ID remoto","Enter your password":"Inserisci la tua password","Logging in...":"Autenticazione...","Enable RDP session sharing":"Abilita la condivisione della sessione RDP","Auto Login":"Login automatico","Enable Direct IP Access":"Abilita l'accesso diretto tramite IP",Rename:"Rinomina",Space:"Spazio","Create Desktop Shortcut":"Crea collegamento sul desktop","Change Path":"Cambia percorso","Create Folder":"Crea cartella","Please enter the folder name":"Inserisci il nome della cartella","Fix it":"Risolvi",Warning:"Avviso","Login screen using Wayland is not supported":"La schermata di login non \xE8 supportata utilizzando Wayland","Reboot required":"Riavvio necessario","Unsupported display server ":"Display server non supportato","x11 expected":"x11 necessario",Port:"Porta",Settings:"Impostazioni",Username:" Nome utente","Invalid port":"Porta non valida","Closed manually by the peer":"Chiuso manualmente dal peer","Enable remote configuration modification":"Abilita la modifica remota della configurazione","Run without install":"Avvia senza installare","Always connected via relay":"Connesso sempre tramite relay","Always connect via relay":"Connetti sempre tramite relay",whitelist_tip:"Solo gli indirizzi IP autorizzati possono connettersi a questo desktop",Login:"Accedi",Logout:"Esci",Tags:"Tag","Search ID":"Cerca ID","Current Wayland display server is not supported":"Questo display server Wayland non \xE8 supportato",whitelist_sep:"Separati da virgola, punto e virgola, spazio o a capo","Add ID":"Aggiungi ID","Add Tag":"Aggiungi tag","Unselect all tags":"Deseleziona tutti i tag","Network error":"Errore di rete","Username missed":"Nome utente dimenticato","Password missed":"Password dimenticata","Wrong credentials":"Credenziali errate","Edit Tag":"Modifica tag","Unremember Password":"Non ricordare la password",Favorites:"Preferiti","Add to Favorites":"Aggiungi ai preferiti","Remove from Favorites":"Rimuovi dai preferiti",Empty:"Vuoto","Invalid folder name":"Nome della cartella non valido","Socks5 Proxy":"Socks5 Proxy",Hostname:"Nome host",Discovered:"Scoperto",install_daemon_tip:"Per iniziare all'avvio, \xE8 necessario installare il servizio di sistema.","Remote ID":"ID remoto",Paste:"Impasto","Paste here?":"Incolla qui?","Are you sure to close the connection?":"Sei sicuro di chiudere la connessione?","Download new version":"Scarica nuova versione","Touch mode":"Modalit\xE0 tocco","Mouse mode":"Modalit\xE0 mouse","One-Finger Tap":"Tocca con un dito","Left Mouse":"Mouse sinistro","One-Long Tap":"Tocco lungo con un dito","Two-Finger Tap":"Tocca con due dita","Right Mouse":"Mouse destro","One-Finger Move":"Movimento con un dito","Double Tap & Move":"Tocca due volte e sposta","Mouse Drag":"Trascina il mouse","Two-Finger vertically":"Due dita in verticale","Mouse Wheel":"Rotellina del mouse","Two-Finger Move":"Movimento con due dita","Canvas Move":"Sposta tela","Pinch to Zoom":"Pizzica per zoomare","Canvas Zoom":"Zoom tela","Reset canvas":"Ripristina tela","No permission of file transfer":"Nessun permesso di trasferimento di file",Note:"Nota",Connection:"Connessione","Share Screen":"Condividi schermo",CLOSE:"CHIUDERE",OPEN:"APRIRE",Chat:"Chiacchierata",Total:"Totale",items:"Oggetti",Selected:"Selezionato","Screen Capture":"Cattura schermo","Mouse Control":"Controllo del mouse","File Transfer":"Trasferimento di file","Audio Capture":"Acquisizione audio","File Connection":"Connessione file","Screen Connection":"Connessione schermo","Do you accept?":"Accetti?","Open System Setting":"Apri Impostazioni di sistema","How to get Android input permission?":"Come ottenere l'autorizzazione di input Android?",android_input_permission_tip1:"Dopo aver ottenuto l'autorizzazione di input, il dispositivo remoto pu\xF2 controllare questo dispositivo Android tramite il mouse",android_input_permission_tip2:"Vai alla pagina delle impostazioni di sistema successiva, trova e accedi a [Servizi installati], attiva il servizio [RustDesk Input]",android_new_connection_tip:"\xC8 stata ricevuta una nuova richiesta di controllo, desidera controllare il dispositivo corrente.",android_service_will_start_tip:"L'attivazione di Cattura schermo avvier\xE0 automaticamente il servizio, consentendo ad altri dispositivi di richiedere una connessione da questo dispositivo.",android_stop_service_tip:"La chiusura del servizio chiuder\xE0 automaticamente tutte le connessioni stabilite.",android_version_audio_tip:"L'attuale versione di Android non supporta l'acquisizione audio, esegui l'upgrade ad Android 10 o versioni successive.",android_start_service_tip:"Toccare [Avvia servizio] o APRI l'autorizzazione [Cattura schermo] per avviare il servizio di condivisione dello schermo.",Account:"Account"},tw:{Status:"\u72C0\u614B","Your Desktop":"\u60A8\u7684\u684C\u9762",desk_tip:"\u60A8\u53EF\u4EE5\u900F\u904E\u6B64 ID \u53CA\u5BC6\u78BC\u5B58\u53D6\u60A8\u7684\u684C\u9762",Password:"\u5BC6\u78BC",Ready:"\u5C31\u7DD2",Established:"\u5DF2\u5EFA\u7ACB",connecting_status:"\u6B63\u5728\u9023\u63A5\u81F3 RustDesk \u7DB2\u8DEF...","Enable Service":"\u555F\u7528\u670D\u52D9","Start Service":"\u555F\u52D5\u670D\u52D9","Service is running":"\u670D\u52D9\u6B63\u5728\u904B\u884C","Service is not running":"\u670D\u52D9\u5C1A\u672A\u57F7\u884C",not_ready_status:"\u5C1A\u672A\u5C31\u7DD2\u3002\u8ACB\u6AA2\u67E5\u60A8\u7684\u7DB2\u8DEF\u9023\u7DDA","Control Remote Desktop":"\u63A7\u5236\u9060\u7AEF\u684C\u9762","Transfer File":"\u50B3\u8F38\u6A94\u6848",Connect:"\u9023\u63A5","Recent Sessions":"\u8FD1\u671F\u7684\u5DE5\u4F5C\u968E\u6BB5","Address Book":"\u901A\u8A0A\u9304",Confirmation:"\u78BA\u8A8D","TCP Tunneling":"TCP \u901A\u9053",Remove:"\u79FB\u9664","Refresh random password":"\u91CD\u65B0\u7522\u751F\u96A8\u6A5F\u5BC6\u78BC","Set your own password":"\u81EA\u884C\u8A2D\u7F6E\u5BC6\u78BC","Enable Keyboard/Mouse":"\u555F\u7528\u9375\u76E4/\u6ED1\u9F20","Enable Clipboard":"\u555F\u7528\u526A\u8CBC\u7C3F","Enable File Transfer":"\u555F\u7528\u6A94\u6848\u50B3\u8F38","Enable TCP Tunneling":"\u555F\u7528 TCP \u901A\u9053","IP Whitelisting":"IP \u767D\u540D\u55AE","ID/Relay Server":"ID/\u8F49\u9001\u4F3A\u670D\u5668","Stop service":"\u505C\u6B62\u670D\u52D9","Change ID":"\u66F4\u6539 ID",Website:"\u7DB2\u7AD9",About:"\u95DC\u65BC",Mute:"\u975C\u97F3","Audio Input":"\u97F3\u8A0A\u8F38\u5165","ID Server":"ID \u4F3A\u670D\u5668","Relay Server":"\u8F49\u9001\u4F3A\u670D\u5668","API Server":"API \u4F3A\u670D\u5668",invalid_http:"\u958B\u982D\u5FC5\u9808\u70BA http:// \u6216 https://","Invalid IP":"IP \u7121\u6548",id_change_tip:"\u50C5\u80FD\u4F7F\u7528\u4EE5\u4E0B\u5B57\u5143\uFF1Aa-z\u3001A-Z\u30010-9\u3001_ (\u5E95\u7DDA)\u3002\u9996\u5B57\u5143\u5FC5\u9808\u70BA a-z \u6216 A-Z\u3002\u9577\u5EA6\u4ECB\u65BC 6 \u5230 16 \u4E4B\u9593\u3002","Invalid format":"\u683C\u5F0F\u7121\u6548","This function is turned off by the server":"\u6B64\u529F\u80FD\u5DF2\u88AB\u4F3A\u670D\u5668\u505C\u7528","Not available":"\u7121\u6CD5\u4F7F\u7528","Too frequent":"\u4FEE\u6539\u904E\u65BC\u983B\u7E41\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002",Cancel:"\u53D6\u6D88",Skip:"\u8DF3\u904E",Close:"\u95DC\u9589",Retry:"\u91CD\u8A66",OK:"\u78BA\u5B9A","Password Required":"\u9700\u8981\u5BC6\u78BC","Please enter your password":"\u8ACB\u8F38\u5165\u60A8\u7684\u5BC6\u78BC","Remember password":"\u8A18\u4F4F\u5BC6\u78BC","Wrong Password":"\u5BC6\u78BC\u932F\u8AA4","Do you want to enter again?":"\u60A8\u8981\u91CD\u65B0\u8F38\u5165\u55CE\uFF1F","Connection Error":"\u9023\u7DDA\u932F\u8AA4",Error:"\u932F\u8AA4","Reset by the peer":"\u5C0D\u65B9\u91CD\u7F6E\u4E86\u9023\u7DDA","Connecting...":"\u6B63\u5728\u9023\u63A5...","Connection in progress. Please wait.":"\u6B63\u5728\u9023\u63A5\uFF0C\u8ACB\u7A0D\u5019\u3002","Please try 1 minute later":"\u8ACB\u65BC 1 \u5206\u9418\u5F8C\u518D\u8A66","Login Error":"\u767B\u5165\u932F\u8AA4",Successful:"\u6210\u529F","Connected, waiting for image...":"\u5DF2\u9023\u7DDA\uFF0C\u7B49\u5F85\u756B\u9762\u50B3\u8F38...",Name:"\u540D\u7A31",Type:"\u985E\u578B",Modified:"\u4FEE\u6539\u6642\u9593",Size:"\u5927\u5C0F","Show Hidden Files":"\u986F\u793A\u96B1\u85CF\u6A94\u6848",Receive:"\u63A5\u6536",Send:"\u50B3\u9001","Refresh File":"\u5237\u65B0\u6587\u4EF6",Local:"\u672C\u5730",Remote:"\u9060\u7AEF","Remote Computer":"\u9060\u7AEF\u96FB\u8166","Local Computer":"\u672C\u5730\u96FB\u8166","Confirm Delete":"\u78BA\u8A8D\u522A\u9664",Delete:"\u522A\u9664",Properties:"\u5C6C\u6027","Multi Select":"\u591A\u9078","Empty Directory":"\u7A7A\u6587\u4EF6\u593E","Not an empty directory":"\u4E0D\u662F\u4E00\u500B\u7A7A\u6587\u4EF6\u593E","Are you sure you want to delete this file?":"\u60A8\u78BA\u5B9A\u8981\u522A\u9664\u6B64\u6A94\u6848\u55CE\uFF1F","Are you sure you want to delete this empty directory?":"\u60A8\u78BA\u5B9A\u8981\u522A\u9664\u6B64\u7A7A\u6587\u4EF6\u593E?","Are you sure you want to delete the file of this directory?":"\u60A8\u78BA\u5B9A\u8981\u522A\u9664\u6587\u4EF6\u593E\u4E0B\u7684\u6587\u4EF6?","Do this for all conflicts":"\u5957\u7528\u5230\u5176\u4ED6\u885D\u7A81","This is irreversible!":"\u6B64\u64CD\u4F5C\u4E0D\u53EF\u9006\uFF01",Deleting:"\u6B63\u5728\u522A\u9664",files:"\u6A94\u6848",Waiting:"\u6B63\u5728\u7B49\u5019...",Finished:"\u5DF2\u5B8C\u6210",Speed:"\u901F\u5EA6","Custom Image Quality":"\u81EA\u8A02\u5716\u7247\u54C1\u8CEA","Privacy mode":"\u96B1\u79C1\u6A21\u5F0F","Block user input":"\u5C01\u9396\u4F7F\u7528\u8005\u8F38\u5165","Unblock user input":"\u53D6\u6D88\u5C01\u9396\u4F7F\u7528\u8005\u8F38\u5165","Adjust Window":"\u8ABF\u6574\u8996\u7A97",Original:"\u539F\u59CB",Shrink:"\u7E2E\u6E1B",Stretch:"\u5EF6\u5C55","Good image quality":"\u756B\u9762\u54C1\u8CEA\u826F\u597D",Balanced:"\u5E73\u8861","Optimize reaction time":"\u56DE\u61C9\u901F\u5EA6\u6700\u4F73\u5316",Custom:"\u81EA\u8A02","Show remote cursor":"\u986F\u793A\u9060\u7AEF\u6E38\u6A19","Disable clipboard":"\u505C\u7528\u526A\u8CBC\u7C3F","Lock after session end":"\u5DE5\u4F5C\u968E\u6BB5\u7D50\u675F\u5F8C\u9396\u5B9A\u96FB\u8166",Insert:"\u63D2\u5165","Insert Lock":"\u9396\u5B9A\u9060\u7AEF\u96FB\u8166",Refresh:"\u91CD\u65B0\u8F09\u5165","ID does not exist":"ID \u4E0D\u5B58\u5728","Failed to connect to rendezvous server":"\u7121\u6CD5\u9023\u63A5\u81F3 rendezvous \u4F3A\u670D\u5668","Please try later":"\u8ACB\u7A0D\u5019\u518D\u8A66","Remote desktop is offline":"\u9060\u7AEF\u96FB\u8166\u96E2\u7DDA","Key mismatch":"\u91D1\u9470\u4E0D\u7B26",Timeout:"\u903E\u6642","Failed to connect to relay server":"\u7121\u6CD5\u9023\u63A5\u81F3\u8F49\u9001\u4F3A\u670D\u5668","Failed to connect via rendezvous server":"\u7121\u6CD5\u900F\u904E rendezvous \u4F3A\u670D\u5668\u9023\u63A5","Failed to connect via relay server":"\u7121\u6CD5\u900F\u904E\u8F49\u9001\u4F3A\u670D\u5668\u9023\u63A5","Failed to make direct connection to remote desktop":"\u7121\u6CD5\u76F4\u63A5\u9023\u7DDA\u81F3\u9060\u7AEF\u96FB\u8166","Set Password":"\u8A2D\u7F6E\u5BC6\u78BC","OS Password":"\u4F5C\u696D\u7CFB\u7D71\u5BC6\u78BC",install_tip:"UAC \u6703\u5C0E\u81F4 RustDesk \u5728\u67D0\u4E9B\u60C5\u6CC1\u4E0B\u7121\u6CD5\u6B63\u5E38\u4EE5\u9060\u7AEF\u96FB\u8166\u904B\u4F5C\u3002\u82E5\u8981\u907F\u958B UAC\uFF0C\u8ACB\u9EDE\u64CA\u4E0B\u65B9\u6309\u9215\u5C07 RustDesk \u5B89\u88DD\u5230\u7CFB\u7D71\u4E2D\u3002","Click to upgrade":"\u9EDE\u64CA\u4EE5\u5347\u7D1A","Click to download":"\u9EDE\u64CA\u4EE5\u4E0B\u8F09","Click to update":"\u9EDE\u64CA\u4EE5\u66F4\u65B0","Configuration Permissions":"\u8A2D\u5B9A\u6B0A\u9650",Configure:"\u8A2D\u5B9A",config_acc:"\u60A8\u9700\u8981\u6388\u4E88 RustDesk \uFF62\u5354\u52A9\u5DE5\u5177\u300D \u6B0A\u9650\u624D\u80FD\u9060\u7AEF\u5B58\u53D6\u96FB\u8166\u3002",config_screen:"\u60A8\u9700\u8981\u6388\u4E88 RustDesk \uFF62\u756B\u9762\u9304\u88FD\u300D \u6B0A\u9650\u624D\u80FD\u9060\u7AEF\u5B58\u53D6\u96FB\u8166\u3002","Installing ...":"\u6B63\u5728\u5B89\u88DD...",Install:"\u5B89\u88DD",Installation:"\u5B89\u88DD","Installation Path":"\u5B89\u88DD\u8DEF\u5F91","Create start menu shortcuts":"\u5EFA\u7ACB\u958B\u59CB\u9078\u55AE\u6377\u5F91","Create desktop icon":"\u5EFA\u7ACB\u684C\u9762\u5716\u793A",agreement_tip:"","Accept and Install":"\u63A5\u53D7\u4E26\u5B89\u88DD","End-user license agreement":"\u4F7F\u7528\u8005\u6388\u6B0A\u5408\u7D04","Generating ...":"\u6B63\u5728\u7522\u751F ...","Your installation is lower version.":"\u60A8\u7684\u5B89\u88DD\u7248\u672C\u904E\u820A\u3002",not_close_tcp_tip:"\u4F7F\u7528\u901A\u9053\u6642\u8ACB\u4E0D\u8981\u95DC\u9589\u6B64\u8996\u7A97","Listening ...":"\u6B63\u5728\u7B49\u5F85\u901A\u9053\u9023\u63A5...","Remote Host":"\u9060\u7AEF\u4E3B\u6A5F","Remote Port":"\u9060\u7AEF\u9023\u63A5\u57E0",Action:"\u64CD\u4F5C",Add:"\u65B0\u589E","Local Port":"\u672C\u6A5F\u9023\u63A5\u57E0",setup_server_tip:"\u82E5\u60A8\u9700\u8981\u66F4\u5FEB\u7684\u9023\u63A5\u901F\u5EA6\uFF0C\u53EF\u4EE5\u9078\u64C7\u81EA\u884C\u5EFA\u7ACB\u4F3A\u670D\u5668","Too short, at least 6 characters.":"\u904E\u77ED\uFF0C\u81F3\u5C11\u9700 6 \u500B\u5B57\u5143\u3002","The confirmation is not identical.":"\u5169\u6B21\u8F38\u5165\u4E0D\u76F8\u7B26",Permissions:"\u6B0A\u9650",Accept:"\u63A5\u53D7",Dismiss:"\u95DC\u9589",Disconnect:"\u65B7\u958B\u9023\u7DDA","Allow using keyboard and mouse":"\u5141\u8A31\u4F7F\u7528\u9375\u76E4\u548C\u6ED1\u9F20","Allow using clipboard":"\u5141\u8A31\u4F7F\u7528\u526A\u8CBC\u7C3F","Allow hearing sound":"\u5141\u8A31\u5206\u4EAB\u97F3\u8A0A","Allow file transfer":"\u5141\u8A31\u6587\u4EF6\u50B3\u8F38","File transfer":"\u6587\u4EF6\u50B3\u8F38",Connected:"\u5DF2\u9023\u63A5","Direct and encrypted connection":"\u52A0\u5BC6\u76F4\u63A5\u9023\u7DDA","Relayed and encrypted connection":"\u52A0\u5BC6\u8F49\u9001\u9023\u7DDA","Direct and unencrypted connection":"\u672A\u52A0\u5BC6\u76F4\u63A5\u9023\u7DDA","Relayed and unencrypted connection":"\u672A\u52A0\u5BC6\u8F49\u9001\u9023\u7DDA","Enter Remote ID":"\u8F38\u5165\u9060\u7AEF ID","Enter your password":"\u8F38\u5165\u60A8\u7684\u5BC6\u78BC","Logging in...":"\u6B63\u5728\u767B\u5165...","Enable RDP session sharing":"\u555F\u7528 RDP \u5DE5\u4F5C\u968E\u6BB5\u5171\u4EAB","Auto Login":"\u81EA\u52D5\u767B\u5165 (\u9396\u5B9A\u5C07\u5728\u8A2D\u5B9A\u95DC\u9589\u5F8C\u5957\u7528)","Enable Direct IP Access":"\u5141\u8A31 IP \u76F4\u63A5\u5B58\u53D6",Rename:"\u91CD\u65B0\u547D\u540D",Space:"\u7A7A\u767D","Create Desktop Shortcut":"\u5EFA\u7ACB\u684C\u9762\u6377\u5F91","Change Path":"\u66F4\u6539\u8DEF\u5F91","Create Folder":"\u5EFA\u7ACB\u8CC7\u6599\u593E","Please enter the folder name":"\u8ACB\u8F38\u5165\u8CC7\u6599\u593E\u540D\u7A31","Fix it":"\u4FEE\u5FA9",Warning:"\u8B66\u544A","Login screen using Wayland is not supported":"\u4E0D\u652F\u63F4\u4F7F\u7528 Wayland \u7684\u767B\u5165\u756B\u9762","Reboot required":"\u9700\u8981\u91CD\u65B0\u555F\u52D5","Unsupported display server ":"\u4E0D\u652F\u63F4\u986F\u793A\u4F3A\u670D\u5668","x11 expected":"\u9810\u671F x11",Port:"\u9023\u63A5\u57E0",Settings:"\u8A2D\u5B9A",Username:" \u4F7F\u7528\u8005\u540D\u7A31","Invalid port":"\u9023\u63A5\u57E0\u7121\u6548","Closed manually by the peer":"\u7531\u5C0D\u65B9\u624B\u52D5\u95DC\u9589","Enable remote configuration modification":"\u555F\u7528\u9060\u7AEF\u66F4\u6539\u8A2D\u5B9A","Run without install":"\u8DF3\u904E\u5B89\u88DD\u76F4\u63A5\u57F7\u884C","Always connected via relay":"\u4E00\u5F8B\u900F\u904E\u8F49\u9001\u9023\u7DDA","Always connect via relay":"\u4E00\u5F8B\u900F\u904E\u8F49\u9001\u9023\u7DDA",whitelist_tip:"\u53EA\u6709\u767D\u540D\u55AE\u4E2D\u7684 IP \u53EF\u4EE5\u5B58\u53D6",Login:"\u767B\u5165",Logout:"\u767B\u51FA",Tags:"\u6A19\u7C64","Search ID":"\u641C\u5C0B ID","Current Wayland display server is not supported":"\u76EE\u524D\u4E0D\u652F\u63F4 Wayland \u986F\u793A\u4F3A\u670D\u5668",whitelist_sep:"\u4F7F\u7528\u9017\u865F\u3001\u5206\u865F\u3001\u7A7A\u767D\uFF0C\u6216\u662F\u63DB\u884C\u4F86\u5206\u9694","Add ID":"\u65B0\u589E ID","Add Tag":"\u65B0\u589E\u6A19\u7C64","Unselect all tags":"\u53D6\u6D88\u9078\u53D6\u6240\u6709\u6A19\u7C64","Network error":"\u7DB2\u8DEF\u932F\u8AA4","Username missed":"\u7F3A\u5C11\u4F7F\u7528\u8005\u540D\u7A31","Password missed":"\u7F3A\u5C11\u5BC6\u78BC","Wrong credentials":"\u63D0\u4F9B\u7684\u767B\u5165\u8CC7\u8A0A\u6709\u8AA4","Edit Tag":"\u7DE8\u8F2F\u6A19\u7C64","Unremember Password":"\u5FD8\u6389\u5BC6\u78BC",Favorites:"\u6536\u85CF","Add to Favorites":"\u52A0\u5165\u5230\u6536\u85CF","Remove from Favorites":"\u5F9E\u6536\u85CF\u4E2D\u522A\u9664",Empty:"\u7A7A\u7A7A\u5982\u4E5F","Invalid folder name":"\u8CC7\u6599\u593E\u540D\u7A31\u7121\u6548","Socks5 Proxy":"Socks5 \u4EE3\u7406",Hostname:"\u4E3B\u6A5F\u540D\u7A31",Discovered:"\u5DF2\u767C\u73FE",install_daemon_tip:"\u70BA\u4E86\u958B\u6A5F\u555F\u52D5\uFF0C\u8ACB\u5B89\u88DD\u7CFB\u7D71\u670D\u52D9\u3002","Remote ID":"\u9060\u7AEF ID",Paste:"\u8CBC\u4E0A","Paste here?":"\u8CBC\u4E0A\u5230\u9019\u88E1?","Are you sure to close the connection?":"\u60A8\u78BA\u5B9A\u8981\u95DC\u9589\u9023\u7DDA\u55CE\uFF1F","Download new version":"\u4E0B\u8F09\u65B0\u7248\u672C","Touch mode":"\u89F8\u63A7\u6A21\u5F0F","Mouse mode":"\u9F20\u6A19\u6A21\u5F0F","One-Finger Tap":"\u55AE\u6307\u8F15\u89F8","Left Mouse":"\u9F20\u6A19\u5DE6\u9375","One-Long Tap":"\u55AE\u6307\u9577\u6309","Two-Finger Tap":"\u96D9\u6307\u8F15\u89F8","Right Mouse":"\u9F20\u6A19\u53F3\u9375","One-Finger Move":"\u55AE\u6307\u79FB\u52D5","Double Tap & Move":"\u96D9\u64CA\u4E26\u79FB\u52D5","Mouse Drag":"\u9F20\u6A19\u9078\u4E2D\u62D6\u52D5","Two-Finger vertically":"\u96D9\u6307\u5782\u76F4\u6ED1\u52D5","Mouse Wheel":"\u9F20\u6A19\u6EFE\u8F2A","Two-Finger Move":"\u96D9\u6307\u79FB\u52D5","Canvas Move":"\u79FB\u52D5\u756B\u5E03","Pinch to Zoom":"\u96D9\u6307\u7E2E\u653E","Canvas Zoom":"\u7E2E\u653E\u756B\u5E03","Reset canvas":"\u91CD\u7F6E\u756B\u5E03","No permission of file transfer":"\u7121\u6587\u4EF6\u50B3\u8F38\u6B0A\u9650",Note:"\u5099\u8A3B",Connection:"\u9023\u63A5","Share Screen":"\u5C4F\u5E55\u9304\u88FD",CLOSE:"\u95DC\u9589",OPEN:"\u958B\u555F",Chat:"\u804A\u5929\u6D88\u606F",Total:"\u7E3D\u8A08",items:"\u500B\u9805\u76EE",Selected:"\u5DF2\u9078\u64C7","Screen Capture":"\u5C4F\u5E55\u9304\u88FD","Mouse Control":"\u9F20\u6A19\u8F38\u5165","File Transfer":"\u6587\u4EF6\u50B3\u8F38","Audio Capture":"\u97F3\u983B\u9304\u88FD","File Connection":"\u6587\u4EF6\u9023\u63A5","Screen Connection":"\u5C4F\u5E55\u9023\u63A5","Do you accept?":"\u662F\u5426\u63A5\u53D7\uFF1F","Open System Setting":"\u6253\u958B\u7CFB\u7D71\u8A2D\u7F6E","How to get Android input permission?":"\u5982\u4F55\u7372\u53D6\u5B89\u5353\u7684\u8F38\u5165\u6B0A\u9650\uFF1F",android_input_permission_tip1:"\u7372\u53D6\u8F38\u5165\u6B0A\u9650\u5F8C\u53EF\u4EE5\u8B93\u9060\u7A0B\u8A2D\u5099\u901A\u904E\u9F20\u6A19\u63A7\u5236\u9019\u53F0\u5B89\u5353\u8A2D\u5099",android_input_permission_tip2:"\u8ACB\u5728\u63A5\u4E0B\u4F86\u7684\u7CFB\u7D71\u8A2D\u7F6E\u9801\u9762\u88E1\uFF0C\u627E\u5230\u4E26\u9032\u5165 [\u5DF2\u5B89\u88DD\u7684\u670D\u52D9] \u9801\u9762\uFF0C\u5C07 [RustDesk Input] \u670D\u52D9\u958B\u555F",android_new_connection_tip:"\u6536\u5230\u65B0\u7684\u9023\u63A5\u63A7\u5236\u8ACB\u6C42\uFF0C\u5C0D\u65B9\u60F3\u8981\u63A7\u5236\u4F60\u7576\u524D\u7684\u8A2D\u5099",android_service_will_start_tip:"\u958B\u555F\u9304\u5C4F\u6B0A\u9650\u5C07\u81EA\u52D5\u958B\u555F\u670D\u52D9\uFF0C\u5141\u8A31\u5176\u4ED6\u8A2D\u5099\u5411\u6B64\u8A2D\u5099\u8ACB\u6C42\u5EFA\u7ACB\u9023\u63A5\u3002",android_stop_service_tip:"\u95DC\u9589\u670D\u52D9\u5C07\u81EA\u52D5\u95DC\u9589\u6240\u6709\u5DF2\u5EFA\u7ACB\u7684\u9023\u63A5\u3002",android_version_audio_tip:"\u7576\u524D\u5B89\u5353\u7248\u672C\u4E0D\u652F\u6301\u97F3\u983B\u9304\u88FD\uFF0C\u8ACB\u5347\u7D1A\u81F3\u5B89\u535310\u6216\u66F4\u9AD8\u3002",android_start_service_tip:"\u9EDE\u64CA [\u555F\u52D5\u670D\u52D9] \u6216\u6253\u958B [\u5C4F\u5E55\u9304\u88FD] \u6B0A\u9650\u958B\u555F\u624B\u6A5F\u5C4F\u5E55\u5171\u4EAB\u670D\u52D9\u3002",Account:"\u5E33\u6236"},en:{desk_tip:"Your desktop can be accessed with this ID and password.",connecting_status:"Connecting to the RustDesk network...",not_ready_status:"Not ready. Please check your connection",id_change_tip:"Only a-z, A-Z, 0-9 and _ (underscore) characters allowed. The first letter must be a-z, A-Z. Length between 6 and 16.",install_tip:"Due to UAC, RustDesk can not work properly as the remote side in some cases. To avoid UAC, please click the button below to install RustDesk to the system.",config_acc:'In order to control your Desktop remotely, you need to grant RustDesk "Accessibility" permissions.',config_screen:'In order to access your Desktop remotely, you need to grant RustDesk "Screen Recording" permissions.',agreement_tip:"By starting the installation, you accept the license agreement.",not_close_tcp_tip:"Don't close this window while you are using the tunnel",setup_server_tip:"For faster connection, please set up your own server","Auto Login":'Auto Login (Only valid if you set "Lock after session end")',whitelist_tip:"Only whitelisted IP can access me",whitelist_sep:"Seperated by comma, semicolon, spaces or new line","Wrong credentials":"Wrong username or password",invalid_http:"must start with http:// or https://",install_daemon_tip:"For starting on boot, you need to install system service.",android_input_permission_tip1:"After obtaining the input permission, the remote device can control this Android device by mouse",android_input_permission_tip2:"Please go to the next system settings page,find and enter [Installed Services],turn [RustDesk Input] service ON",android_new_connection_tip:"New control request has been received,it want to control your current device.",android_service_will_start_tip:"Turning on the Screen Capture will automatically start the service,allowing other devices to request a connection from this device.",android_stop_service_tip:"Closing the service will automatically close all established connections.",android_version_audio_tip:"The current Android version does not support audio capture, please upgrade to Android 10 or higher.",android_start_service_tip:"Tap [Start Service] or OPEN [Screen Capture] permission to start the screen sharing service."},fr:{Status:"Statut","Your Desktop":"Votre bureau",desk_tip:"Votre bureau est accessible via l'identifiant et le mot de passe ci-dessous.",Password:"Mot de passe",Ready:"Pr\xEAt",Established:"\xC9tabli",connecting_status:"Connexion au r\xE9seau RustDesk...","Enable Service":"Autoriser le service","Start Service":"D\xE9marrer le service","Service is running":"Le service est en cours d'ex\xE9cution","Service is not running":"Le service ne fonctionne pas",not_ready_status:"Pas pr\xEAt, veuillez v\xE9rifier la connexion r\xE9seau","Control Remote Desktop":"Contr\xF4ler le bureau \xE0 distance","Transfer File":"Transf\xE9rer le fichier",Connect:"Connecter","Recent Sessions":"Sessions r\xE9centes","Address Book":"Carnet d'adresses",Confirmation:"Confirmation","TCP Tunneling":"Tunneling TCP",Remove:"Supprimer","Refresh random password":"Actualiser le mot de passe al\xE9atoire","Set your own password":"D\xE9finir votre propre mot de passe","Enable Keyboard/Mouse":"Activer le contr\xF4le clavier/souris","Enable Clipboard":"Activer la synchronisation du presse-papier","Enable File Transfer":"Activer le transfert de fichiers","Enable TCP Tunneling":"Activer le tunneling TCP","IP Whitelisting":"Liste blanche IP","ID/Relay Server":"ID/Serveur Relais","Stop service":"Arr\xEAter le service","Change ID":"Changer d'ID",Website:"Site Web",About:"\xC0 propos de",Mute:"Muet","Audio Input":"Entr\xE9e audio","ID Server":"Serveur ID","Relay Server":"Serveur relais","API Server":"Serveur API",invalid_http:"Doit commencer par http:// ou https://","Invalid IP":"IP invalide",id_change_tip:"Seules les lettres a-z, A-Z, 0-9, _ (trait de soulignement) peuvent \xEAtre utilis\xE9es. La premi\xE8re lettre doit \xEAtre a-z, A-Z. La longueur doit \xEAtre comprise entre 6 et 16.","Invalid format":"Format invalide","This function is turned off by the server":"Cette fonction est d\xE9sactiv\xE9e par le serveur","Not available":"Indisponible","Too frequent":"Modifi\xE9 trop fr\xE9quemment, veuillez r\xE9essayer plus tard",Cancel:"Annuler",Skip:"Ignorer",Close:"Fermer",Retry:"R\xE9essayer",OK:"Confirmer","Password Required":"Mot de passe requis","Please enter your password":"Veuillez saisir votre mot de passe","Remember password":"M\xE9moriser le mot de passe","Wrong Password":"Mauvais mot de passe","Do you want to enter again?":"Voulez-vous participer \xE0 nouveau ?","Connection Error":"Erreur de connexion",Error:"Erreur","Reset by the peer":"La connexion a \xE9t\xE9 ferm\xE9e par le pair","Connecting...":"Connexion...","Connection in progress. Please wait.":"Connexion en cours. Veuillez patienter.","Please try 1 minute later":"R\xE9essayez dans une minute","Login Error":"Erreur de connexion",Successful:"Succ\xE8s","Connected, waiting for image...":"Connect\xE9, en attente de transmission d'image...",Name:"Nom",Type:"Taper",Modified:"Modifi\xE9",Size:"Taille","Show Hidden Files":"Afficher les fichiers cach\xE9s",Receive:"Accepter",Send:"Envoyer","Refresh File":"Actualiser le fichier",Local:"Local",Remote:"Distant","Remote Computer":"Ordinateur distant","Local Computer":"Ordinateur local","Confirm Delete":"Confirmer la suppression",Delete:"Supprimer",Properties:"Propri\xE9t\xE9s","Multi Select":"Choix multiple","Empty Directory":"R\xE9pertoire vide","Not an empty directory":"Pas un r\xE9pertoire vide","Are you sure you want to delete this file?":"Voulez-vous vraiment supprimer ce fichier?","Are you sure you want to delete this empty directory?":"Voulez-vous vraiment supprimer ce r\xE9pertoire vide\xA0?","Are you sure you want to delete the file of this directory?":"Voulez-vous vraiment supprimer le fichier de ce r\xE9pertoire\xA0?","Do this for all conflicts":"Appliquer \xE0 d'autres conflits","This is irreversible!":"C'est irr\xE9versible !",Deleting:"Suppression",files:"fichier",Waiting:"En attente...",Finished:"Termin\xE9",Speed:"Vitesse","Custom Image Quality":"D\xE9finir la qualit\xE9 d'image","Privacy mode":"Mode priv\xE9","Block user input":"Bloquer la saisie de l'utilisateur","Unblock user input":"D\xE9bloquer l'entr\xE9e de l'utilisateur","Adjust Window":"Ajuster la fen\xEAtre",Original:"Ratio d'origine",Shrink:"R\xE9tr\xE9cir",Stretch:"\xC9tirer","Good image quality":"Bonne qualit\xE9 d'image",Balanced:"Qualit\xE9 d'image normale","Optimize reaction time":"Optimiser le temps de r\xE9action",Custom:"Qualit\xE9 d'image personnalis\xE9e","Show remote cursor":"Afficher le curseur distant","Disable clipboard":"D\xE9sactiver le presse-papier","Lock after session end":"Verrouiller l'ordinateur distant apr\xE8s la d\xE9connexion",Insert:"Ins\xE9rer","Insert Lock":"Verrouiller l'ordinateur distant",Refresh:"Rafra\xEEchir l'\xE9cran","ID does not exist":"L'ID n'existe pas","Failed to connect to rendezvous server":"\xC9chec de la connexion au serveur rendezvous","Please try later":"Veuillez essayer plus tard","Remote desktop is offline":"Le bureau \xE0 distance est hors ligne","Key mismatch":"Discordance de cl\xE9s",Timeout:"Connexion expir\xE9e","Failed to connect to relay server":"\xC9chec de la connexion au serveur relais","Failed to connect via rendezvous server":"\xC9chec de l'\xE9tablissement d'une connexion via le serveur rendezvous","Failed to connect via relay server":"Impossible d'\xE9tablir une connexion via le serveur relais","Failed to make direct connection to remote desktop":"Impossible d'\xE9tablir une connexion directe","Set Password":"D\xE9finir le mot de passe","OS Password":"Mot de passe du syst\xE8me d'exploitation",install_tip:"Vous utilisez une version non install\xE9e. En raison des restrictions UAC, en tant que terminal contr\xF4l\xE9, dans certains cas, il ne sera pas en mesure de contr\xF4ler la souris et le clavier ou d'enregistrer l'\xE9cran. Veuillez cliquer sur le bouton ci-dessous pour installer RustDesk au syst\xE8me pour \xE9viter la question ci-dessus.","Click to upgrade":"Cliquez pour mettre \xE0 niveau","Click to download":"Cliquez pour t\xE9l\xE9charger","Click to update":"Cliquez pour mettre \xE0 jour","Configuration Permissions":"Autorisations de configuration",Configure:"Configurer",config_acc:`Afin de pouvoir contr\xF4ler votre bureau \xE0 distance, veuillez donner l'autorisation "accessibilit\xE9" \xE0 RustDesk.`,config_screen:`Afin de pouvoir acc\xE9der \xE0 votre bureau \xE0 distance, veuillez donner \xE0 RustDesk l'autorisation "enregistrement d'\xE9cran".`,"Installing ...":"Installation...",Install:"Installer",Installation:"Installation","Installation Path":"Chemin d'installation","Create start menu shortcuts":"Cr\xE9er des raccourcis dans le menu d\xE9marrer","Create desktop icon":"Cr\xE9er une ic\xF4ne sur le bureau",agreement_tip:"D\xE9marrer l'installation signifie accepter le contrat de licence.","Accept and Install":"Accepter et installer","End-user license agreement":"Contrat d'utilisateur","Generating ...":"G\xE9n\xE9ration...","Your installation is lower version.":"La version que vous avez install\xE9e est inf\xE9rieure \xE0 la version en cours d'ex\xE9cution.",not_close_tcp_tip:"Veuillez ne pas fermer cette fen\xEAtre lors de l'utilisation du tunnel","Listening ...":"En attente de connexion tunnel...","Remote Host":"H\xF4te distant","Remote Port":"Port distant",Action:"Action",Add:"Ajouter","Local Port":"Port local",setup_server_tip:"Si vous avez besoin d'une vitesse de connexion plus rapide, vous pouvez choisir de cr\xE9er votre propre serveur","Too short, at least 6 characters.":"Trop court, au moins 6 caract\xE8res.","The confirmation is not identical.":"Les deux entr\xE9es ne correspondent pas",Permissions:"Autorisations",Accept:"Accepter",Dismiss:"Rejeter",Disconnect:"D\xE9connecter","Allow using keyboard and mouse":"Autoriser l'utilisation du clavier et de la souris","Allow using clipboard":"Autoriser l'utilisation du presse-papier","Allow hearing sound":"Autoriser l'audition du son","Allow file transfer":"Autoriser le transfert de fichiers","File transfer":"Transfert de fichiers",Connected:"Connect\xE9","Direct and encrypted connection":"Connexion directe chiffr\xE9e","Relayed and encrypted connection":"Connexion relais chiffr\xE9e","Direct and unencrypted connection":"Connexion directe non chiffr\xE9e","Relayed and unencrypted connection":"Connexion relais non chiffr\xE9e","Enter Remote ID":"Entrez l'ID de l'appareil \xE0 distance","Enter your password":"Entrez votre mot de passe","Logging in...":"Se connecter...","Enable RDP session sharing":"Activer le partage de session RDP","Auto Login":"Connexion automatique (le verrouillage ne sera effectif qu'apr\xE8s la d\xE9sactivation du premier param\xE8tre)","Enable Direct IP Access":"Autoriser l'acc\xE8s direct par IP",Rename:"Renommer",Space:"Espace","Create Desktop Shortcut":"Cr\xE9er un raccourci sur le bureau","Change Path":"Changer de chemin","Create Folder":"Cr\xE9er un dossier","Please enter the folder name":"Veuillez saisir le nom du dossier","Fix it":"R\xE9parez-le",Warning:"Avertissement","Login screen using Wayland is not supported":"L'\xE9cran de connexion utilisant Wayland n'est pas pris en charge","Reboot required":"Red\xE9marrage pour prendre effet","Unsupported display server ":"Le serveur d'affichage actuel n'est pas pris en charge","x11 expected":"Veuillez passer \xE0 x11",Port:"Port",Settings:"Param\xE8tres",Username:" Nom d'utilisateur","Invalid port":"Port invalide","Closed manually by the peer":"Ferm\xE9 manuellement par le pair","Enable remote configuration modification":"Autoriser la modification de la configuration \xE0 distance","Run without install":"Ex\xE9cuter sans installer","Always connected via relay":"Forcer la connexion relais","Always connect via relay":"Forcer la connexion relais",whitelist_tip:"Seul l'IP dans la liste blanche peut acc\xE9der \xE0 mon appareil",Login:"Connexion",Logout:"D\xE9connexion",Tags:"\xC9tiqueter","Search ID":"Rechercher un ID","Current Wayland display server is not supported":"Le serveur d'affichage Wayland n'est pas pris en charge",whitelist_sep:"Vous pouvez utiliser une virgule, un point-virgule, un espace ou une nouvelle ligne comme s\xE9parateur","Add ID":"Ajouter un ID","Add Tag":"Ajouter une balise","Unselect all tags":"D\xE9s\xE9lectionner toutes les balises","Network error":"Erreur r\xE9seau","Username missed":"Nom d'utilisateur manqu\xE9","Password missed":"Mot de passe manqu\xE9","Wrong credentials":"Identifiant ou mot de passe erron\xE9","Edit Tag":"Modifier la balise","Unremember Password":"Mot de passe oubli\xE9",Favorites:"Favoris","Add to Favorites":"Ajouter aux Favoris","Remove from Favorites":"Retirer des favoris",Empty:"Vide","Invalid folder name":"Nom de dossier invalide","Socks5 Proxy":"Socks5 Agents",Hostname:"Nom d'h\xF4te",Discovered:"D\xE9couvert",install_daemon_tip:"Pour d\xE9marrer au d\xE9marrage, vous devez installer le service syst\xE8me.","Remote ID":"ID de l'appareil \xE0 distance",Paste:"Coller","Paste here?":"Coller ici\xA0?","Are you sure to close the connection?":"\xCAtes-vous s\xFBr de fermer la connexion?","Download new version":"T\xE9l\xE9charger la nouvelle version","Touch mode":"Mode tactile","Mouse mode":"Mode souris","One-Finger Tap":"Tapez d'un doigt","Left Mouse":"Souris gauche","One-Long Tap":"Un long robinet","Two-Finger Tap":"Tapez \xE0 deux doigts","Right Mouse":"Bouton droit de la souris","One-Finger Move":"Mouvement \xE0 un doigt","Double Tap & Move":"Appuyez deux fois et d\xE9placez","Mouse Drag":"Glissement de la souris","Two-Finger vertically":"Deux doigts verticalement","Mouse Wheel":"Roulette de la souris","Two-Finger Move":"Mouvement \xE0 deux doigts","Canvas Move":"D\xE9placement de la toile","Pinch to Zoom":"Pincer pour zoomer","Canvas Zoom":"Zoom sur la toile","Reset canvas":"R\xE9initialiser le canevas","No permission of file transfer":"Aucune autorisation de transfert de fichiers",Note:"Noter",Connection:"Connexion","Share Screen":"Partager l'\xE9cran",CLOSE:"FERMER",OPEN:"OUVRIR",Chat:"Discuter",Total:"Total",items:"\xE9l\xE9ments",Selected:"Choisi","Screen Capture":"Capture d'\xE9cran","Mouse Control":"Contr\xF4le de la souris","File Transfer":"Transfert de fichier","Audio Capture":"Capture audio","File Connection":"Connexion de fichier","Screen Connection":"Connexion de l'\xE9cran","Do you accept?":"Do you accept?","Open System Setting":"Ouvrir les param\xE8tres syst\xE8me","How to get Android input permission?":"Comment obtenir l'autorisation d'entr\xE9e Android\xA0?",android_input_permission_tip1:"Apr\xE8s avoir obtenu l'autorisation d'entr\xE9e, l'appareil distant peut contr\xF4ler cet appareil Android avec la souris",android_input_permission_tip2:"Veuillez acc\xE9der \xE0 la page suivante des param\xE8tres syst\xE8me, recherchez et entrez [Services install\xE9s], activez le service [RustDesk Input]",android_new_connection_tip:"Une nouvelle demande de contr\xF4le a \xE9t\xE9 re\xE7ue, elle souhaite contr\xF4ler votre appareil actuel.",android_service_will_start_tip:"L'activation de la capture d'\xE9cran d\xE9marrera automatiquement le service, permettant \xE0 d'autres appareils de demander une connexion \xE0 partir de cet appareil.",android_stop_service_tip:"La fermeture du service fermera automatiquement toutes les connexions \xE9tablies.",android_version_audio_tip:"La version actuelle d'Android ne prend pas en charge la capture audio, veuillez passer \xE0 Android 10 ou sup\xE9rieur.",android_start_service_tip:"Appuyez sur [D\xE9marrer le service] ou sur l'autorisation OUVRIR [Capture d'\xE9cran] pour d\xE9marrer le service de partage d'\xE9cran.",Account:"Compte"}};function Ti(e,u,r){return e=="error"&&u=="Connection Error"&&r.toLowerCase().indexOf("offline")<0&&r.toLowerCase().indexOf("exist")<0&&r.toLowerCase().indexOf("handshake")<0&&r.toLowerCase().indexOf("failed")<0&&r.toLowerCase().indexOf("resolve")<0&&r.toLowerCase().indexOf("mismatch")<0&&r.toLowerCase().indexOf("manually")<0&&r.toLowerCase().indexOf("not allowed")<0}const Mi={VK_A:"a",VK_B:"b",VK_C:"c",VK_D:"d",VK_E:"e",VK_F:"f",VK_G:"g",VK_H:"h",VK_I:"i",VK_J:"j",VK_K:"k",VK_L:"l",VK_M:"m",VK_N:"n",VK_O:"o",VK_P:"p",VK_Q:"q",VK_R:"r",VK_S:"s",VK_T:"t",VK_U:"u",VK_V:"v",VK_W:"w",VK_X:"x",VK_Y:"y",VK_Z:"z",VK_0:"0",VK_1:"1",VK_2:"2",VK_3:"3",VK_4:"4",VK_5:"5",VK_6:"6",VK_7:"7",VK_8:"8",VK_9:"9",VK_COMMA:",",VK_SLASH:"/",VK_SEMICOLON:";",VK_QUOTE:"'",VK_LBRACKET:"[",VK_RBRACKET:"]",VK_BACKSLASH:"\\",VK_MINUS:"-",VK_PLUS:"=",VK_DIVIDE:"Divide",VK_MULTIPLY:"Multiply",VK_SUBTRACT:"Subtract",VK_ADD:"Add",VK_DECIMAL:"Decimal",VK_F1:"F1",VK_F2:"F2",VK_F3:"F3",VK_F4:"F4",VK_F5:"F5",VK_F6:"F6",VK_F7:"F7",VK_F8:"F8",VK_F9:"F9",VK_F10:"F10",VK_F11:"F11",VK_F12:"F12",VK_ENTER:"Return",VK_CANCEL:"Cancel",VK_BACK:"Backspace",VK_TAB:"Tab",VK_CLEAR:"Clear",VK_RETURN:"Return",VK_SHIFT:"Shift",VK_CONTROL:"Control",VK_MENU:"Alt",VK_PAUSE:"Pause",VK_CAPITAL:"CapsLock",VK_KANA:"Kana",VK_HANGUL:"Hangul",VK_JUNJA:"Junja",VK_FINAL:"Final",VK_HANJA:"Hanja",VK_KANJI:"Kanji",VK_ESCAPE:"Escape",VK_CONVERT:"Convert",VK_SPACE:"Space",VK_PRIOR:"PageUp",VK_NEXT:"PageDown",VK_END:"End",VK_HOME:"Home",VK_LEFT:"LeftArrow",VK_UP:"UpArrow",VK_RIGHT:"RightArrow",VK_DOWN:"DownArrow",VK_SELECT:"Select",VK_PRINT:"Print",VK_EXECUTE:"Execute",VK_SNAPSHOT:"Snapshot",VK_INSERT:"Insert",VK_DELETE:"Delete",VK_HELP:"Help",VK_SLEEP:"Sleep",VK_SEPARATOR:"Separator",VK_NUMPAD0:"Numpad0",VK_NUMPAD1:"Numpad1",VK_NUMPAD2:"Numpad2",VK_NUMPAD3:"Numpad3",VK_NUMPAD4:"Numpad4",VK_NUMPAD5:"Numpad5",VK_NUMPAD6:"Numpad6",VK_NUMPAD7:"Numpad7",VK_NUMPAD8:"Numpad8",VK_NUMPAD9:"Numpad9",Apps:"Apps",Meta:"Meta",RAlt:"RAlt",RWin:"RWin",RControl:"RControl",RShift:"RShift",CTRL_ALT_DEL:"CtrlAltDel",LOCK_SCREEN:"LockScreen"},qi="1.1.9";let pu;async function ui(){const e=new mi;await e.init(),console.log("zstd ready"),pu=e}async function ri(e){const u=1024*1024*64,r=1024*1024;let n=30*e.length;n>u&&(n=u),nLi||isetTimeout(u,e))}function Wi(){try{const e=window.location.search;return new URLSearchParams(e).get("lang")||""}catch{return""}}const Hi=21116,ii=["rs-sg.rustdesk.com","rs-cn.rustdesk.com","rs-us.rustdesk.com"];let ni=localStorage.getItem("rendezvous-server")||ii[0];const Zi="ws://";class Gi{constructor(){_(this,"_msgs");_(this,"_ws");_(this,"_interval");_(this,"_id");_(this,"_hash");_(this,"_msgbox");_(this,"_draw");_(this,"_peerInfo");_(this,"_firstFrame");_(this,"_videoDecoder");_(this,"_password");_(this,"_options");_(this,"_videoTestSpeed");this._msgbox=Qi,this._draw=mu,this._msgs=[],this._id="",this._videoTestSpeed=[0,0]}async start(u){try{await this._start(u)}catch(r){this.msgbox("error","Connection Error",r.type=="close"?"Reset by the peer":String(r))}}async _start(u){if(this._options||(this._options=nu()[u]||{}),!this._password){const v=this.getOption("password");if(v)try{this._password=Uint8Array.from(JSON.parse("["+v+"]"))}catch(tu){console.error(tu)}}this._interval=setInterval(()=>{var v;for(;this._msgs.length;)(v=this._ws)==null||v.sendMessage(this._msgs[0]),this._msgs.splice(0,1)},1),this.loadVideoDecoder();const r=ti(),n=new cu(r,!0);this._ws=n,this._id=u,console.log(new Date+": Conntecting to rendezvoous server: "+r+", for "+u),await n.open(),console.log(new Date+": Connected to rendezvoous server");const i=su.DEFAULT_CONN,t=du.SYMMETRIC,s=J.fromPartial({id:u,licence_key:localStorage.getItem("key")||void 0,conn_type:i,nat_type:t,token:localStorage.getItem("access_token")||void 0});n.sendRendezvous({punch_hole_request:s});const l=await n.next();n.close(),console.log(new Date+": Got relay response");const c=l.punch_hole_response,p=l.relay_response;if(c){if(c==null?void 0:c.other_failure){this.msgbox("error","Error",c==null?void 0:c.other_failure);return}if(c.failure!=O.UNRECOGNIZED)switch(c==null?void 0:c.failure){case O.ID_NOT_EXIST:this.msgbox("error","Error","ID does not exist");break;case O.OFFLINE:this.msgbox("error","Error","Remote desktop is offline");break;case O.LICENSE_MISMATCH:this.msgbox("error","Error","Key mismatch");break;case O.LICENSE_OVERUSE:this.msgbox("error","Error","Key overuse");break}}else if(p){if(!p.version){this.msgbox("error","Error","Remote version is low, not support web");return}await this.connectRelay(p)}}async connectRelay(u){const r=u.pk;let n=u.relay_server;n?n=fu(n,!0,2):n=ti(!0);const i=u.uuid;console.log(new Date+": Connecting to relay server: "+n);const t=new cu(n,!1);await t.open(),console.log(new Date+": Connected to relay server"),this._ws=t;const s=L.fromPartial({licence_key:localStorage.getItem("key")||void 0,uuid:i});t.sendRendezvous({request_relay:s});const l=await this.secure(r)||!1;N("connection_ready",{secure:l,direct:!1}),await this.msgLoop()}async secure(u){var Au,ku,yu,Cu,Bu,Su,wu,gu;if(u){const A="OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=";try{if(u=await ci(u,localStorage.getItem("key")||A),u){const I=Mu.decode(u);I.id==this._id&&(u=I.pk)}(u==null?void 0:u.length)!=32&&(u=void 0)}catch(I){console.error(I),u=void 0}u||console.error("Handshake failed: invalid public key from rendezvous server")}if(!u){const A=k.fromPartial({});(Au=this._ws)==null||Au.sendMessage({public_key:A});return}const r=await((ku=this._ws)==null?void 0:ku.next());let n=r==null?void 0:r.signed_id;if(!n){console.error("Handshake failed: invalid message type");const A=k.fromPartial({});(yu=this._ws)==null||yu.sendMessage({public_key:A});return}try{n=await ci(n.id,Uint8Array.from(u))}catch(A){console.error(A),console.error("pk mismatch, fall back to non-secure");const I=k.fromPartial({});(Cu=this._ws)==null||Cu.sendMessage({public_key:I});return}const i=Mu.decode(n),t=i.id,s=i.pk;if(t!=this._id){console.error("Handshake failed: sign failure");const A=k.fromPartial({});(Bu=this._ws)==null||Bu.sendMessage({public_key:A});return}if(s.length!=32){console.error("Handshake failed: invalid public box key length from peer");const A=k.fromPartial({});(Su=this._ws)==null||Su.sendMessage({public_key:A});return}const[l,c]=en(),p=un(),v=rn(p,s,l),tu=k.fromPartial({asymmetric_value:c,symmetric_value:v});return(wu=this._ws)==null||wu.sendMessage({public_key:tu}),(gu=this._ws)==null||gu.setSecretKey(p),console.log("secured"),!0}async msgLoop(){var u,r;for(;;){const n=await((u=this._ws)==null?void 0:u.next());if(n==null?void 0:n.hash)this._hash=n==null?void 0:n.hash,this._password||this.msgbox("input-password","Password Required",""),this.login();else if(n==null?void 0:n.test_delay){const i=n==null?void 0:n.test_delay;console.log(i),i.from_client||(r=this._ws)==null||r.sendMessage({test_delay:i})}else if(n==null?void 0:n.login_response){const i=n==null?void 0:n.login_response;i.error?i.error=="Wrong Password"?(this._password=void 0,this.msgbox("re-input-password",i.error,"Do you want to enter again?")):this.msgbox("error","Login Error",i.error):i.peer_info&&this.handlePeerInfo(i.peer_info)}else if(n==null?void 0:n.video_frame)this.handleVideoFrame(n==null?void 0:n.video_frame);else if(n==null?void 0:n.clipboard){const i=n==null?void 0:n.clipboard;if(i.compress){const t=await ri(i.content);if(!t)continue;i.content=t}try{cn(new TextDecoder().decode(i.content))}catch(t){console.error(t)}}else if(n==null?void 0:n.cursor_data){const i=n==null?void 0:n.cursor_data,t=await ri(i.colors);if(!t)continue;i.colors=t,N("cursor_data",i)}else if(n==null?void 0:n.cursor_id)N("cursor_id",{id:n==null?void 0:n.cursor_id});else if(n==null?void 0:n.cursor_position)N("cursor_position",n==null?void 0:n.cursor_position);else if(n==null?void 0:n.misc){if(!this.handleMisc(n==null?void 0:n.misc))break}else(n==null?void 0:n.audio_frame)&&dn(n==null?void 0:n.audio_frame.data)}}msgbox(u,r,n){var i;(i=this._msgbox)==null||i.call(this,u,r,n)}draw(u){var r;(r=this._draw)==null||r.call(this,u),mu(u)}close(){var u,r;this._msgs=[],clearInterval(this._interval),(u=this._ws)==null||u.close(),(r=this._videoDecoder)==null||r.close()}refresh(){var r;const u=B.fromPartial({refresh_video:!0});(r=this._ws)==null||r.sendMessage({misc:u})}setMsgbox(u){this._msgbox=u}setDraw(u){this._draw=u}login(u=void 0){var r,n,i;if(u){const t=(r=this._hash)==null?void 0:r.salt;let s=vu([u,t]);this._password=s;const l=(n=this._hash)==null?void 0:n.challenge;s=vu([s,l]),this.msgbox("connecting","Connecting...","Logging in..."),this._sendLoginMessage(s)}else{let t=this._password;if(t){const s=(i=this._hash)==null?void 0:i.challenge;t=vu([t,s])}this._sendLoginMessage(t)}}async reconnect(){this.close(),await this.start(this._id)}_sendLoginMessage(u=void 0){var n;const r=T.fromPartial({username:this._id,my_id:"web",my_name:"web",password:u,option:this.getOptionMessage(),video_ack_required:!0});(n=this._ws)==null||n.sendMessage({login_request:r})}getOptionMessage(){let u=0;const r=f.fromPartial({}),n=this.getImageQualityEnum(this.getImageQuality(),!0),i=x.Yes;return n!=null&&(r.image_quality=n,u+=1),this._options["show-remote-cursor"]&&(r.show_remote_cursor=i,u+=1),this._options["lock-after-session-end"]&&(r.lock_after_session_end=i,u+=1),this._options["privacy-mode"]&&(r.privacy_mode=i,u+=1),this._options["disable-audio"]&&(r.disable_audio=i,u+=1),this._options["disable-clipboard"]&&(r.disable_clipboard=i,u+=1),u>0?r:void 0}sendVideoReceived(){var r;const u=B.fromPartial({video_received:!0});(r=this._ws)==null||r.sendMessage({misc:u})}handleVideoFrame(u){var i;if(this._firstFrame||(this.msgbox("","",""),this._firstFrame=!0),u.vp9s){const t=this._videoDecoder;var r=new Date().getTime(),n=0;const s=(i=u.vp9s)==null?void 0:i.frames.length;u.vp9s.frames.forEach(l=>{t.processFrame(l.data.slice(0).buffer,c=>{if(n++,n==s&&this.sendVideoReceived(),c&&t.frameBuffer&&s==n){this.draw(t.frameBuffer);var p=new Date().getTime()-r;this._videoTestSpeed[1]+=p,this._videoTestSpeed[0]+=1,this._videoTestSpeed[0]>=30&&(console.log("video decoder: "+parseInt(""+this._videoTestSpeed[1]/this._videoTestSpeed[0])),this._videoTestSpeed=[0,0])}})})}}handlePeerInfo(u){var i,t;if(this._peerInfo=u,u.displays.length==0){this.msgbox("error","Remote Error","No Display");return}this.msgbox("success","Successful","Connected, waiting for image..."),N("peer_info",u);const r=this.shouldAutoLogin();r&&this.inputOsPassword(r);const n=(i=this.getOption("info"))==null?void 0:i.username;if(n&&!u.username&&(u.username=n),this.setOption("info",u),this.getRemember()){if((t=this._password)==null?void 0:t.length){const s=this._password.toString();s!=this.getOption("password")&&(this.setOption("password",s),console.log("remember password of "+this._id))}}else this.setOption("password",void 0)}shouldAutoLogin(){const u=this.getOption("lock-after-session-end"),r=!!this.getOption("auto-login"),n=this.getOption("os-password");return n&&u&&r?n:""}handleMisc(u){if(u.audio_format)sn(u.audio_format.channels,u.audio_format.sample_rate);else if(u.chat_message)N("chat",{text:u.chat_message.text});else if(u.permission_info){const r=u.permission_info;console.info("Change permission "+r.permission+" -> "+r.enabled);let n;switch(r.permission){case Z.Keyboard:n="keyboard";break;case Z.Clipboard:n="clipboard";break;case Z.Audio:n="audio";break;default:return}N("permission",{[n]:r.enabled})}else if(u.switch_display)this.loadVideoDecoder(),N("switch_display",u.switch_display);else if(u.close_reason)return this.msgbox("error","Connection Error",u.close_reason),this.close(),!1;return!0}getRemember(){return this._options.remember||!1}setRemember(u){this.setOption("remember",u)}getOption(u){return this._options[u]}setOption(u,r){r==null?delete this._options[u]:this._options[u]=r,this._options.tm=new Date().getTime();const n=nu();n[this._id]=this._options,localStorage.setItem("peers",JSON.stringify(n))}inputKey(u,r,n,i,t,s,l){var p;const c=Vi(u,Yi());!c||(i&&(u=="VK_MENU"||u=="RAlt")&&(i=!1),t&&(u=="VK_CONTROL"||u=="RControl")&&(t=!1),s&&(u=="VK_SHIFT"||u=="RShift")&&(s=!1),l&&(u=="Meta"||u=="RWin")&&(l=!1),c.down=r,c.press=n,c.modifiers=this.getMod(i,t,s,l),(p=this._ws)==null||p.sendMessage({key_event:c}))}ctrlAltDel(){var r,n;const u=E.fromPartial({down:!0});((r=this._peerInfo)==null?void 0:r.platform)=="Windows"?u.control_key=y.CtrlAltDel:(u.control_key=y.Delete,u.modifiers=this.getMod(!0,!0,!1,!1)),(n=this._ws)==null||n.sendMessage({key_event:u})}inputString(u){var n;const r=E.fromPartial({seq:u});(n=this._ws)==null||n.sendMessage({key_event:r})}switchDisplay(u){var i;const r=q.fromPartial({display:u}),n=B.fromPartial({switch_display:r});(i=this._ws)==null||i.sendMessage({misc:n})}async inputOsPassword(u){var n;this.inputMouse(),await _u(50),this.inputMouse(0,3,3),await _u(50),this.inputMouse(1|1<<3),this.inputMouse(2|1<<3),await _u(1200);const r=E.fromPartial({press:!0,seq:u});(n=this._ws)==null||n.sendMessage({key_event:r})}lockScreen(){var r;const u=E.fromPartial({down:!0,control_key:y.LockScreen});(r=this._ws)==null||r.sendMessage({key_event:u})}getMod(u,r,n,i){const t=[];return u&&t.push(y.Alt),r&&t.push(y.Control),n&&t.push(y.Shift),i&&t.push(y.Meta),t}inputMouse(u=0,r=0,n=0,i=!1,t=!1,s=!1,l=!1){var p;const c=M.fromPartial({mask:u,x:r,y:n,modifiers:this.getMod(i,t,s,l)});(p=this._ws)==null||p.sendMessage({mouse_event:c})}toggleOption(u){var s;const r=!this._options[u],n=f.fromPartial({}),i=r?x.Yes:x.No;switch(u){case"show-remote-cursor":n.show_remote_cursor=i;break;case"disable-audio":n.disable_audio=i;break;case"disable-clipboard":n.disable_clipboard=i;break;case"lock-after-session-end":n.lock_after_session_end=i;break;case"privacy-mode":n.privacy_mode=i;break;case"block-input":n.block_input=x.Yes;break;case"unblock-input":n.block_input=x.No;break;default:return}u.indexOf("block-input")<0&&this.setOption(u,r);const t=B.fromPartial({option:n});(s=this._ws)==null||s.sendMessage({misc:t})}getImageQuality(){return this.getOption("image-quality")}getImageQualityEnum(u,r){switch(u){case"low":return H.Low;case"best":return H.Best;case"balanced":return r?void 0:H.Balanced;default:return}}setImageQuality(u){var t;this.setOption("image-quality",u);const r=this.getImageQualityEnum(u,!1);if(r==null)return;const n=f.fromPartial({image_quality:r}),i=B.fromPartial({option:n});(t=this._ws)==null||t.sendMessage({misc:i})}loadVideoDecoder(){var u;(u=this._videoDecoder)==null||u.close(),jr(r=>{this._videoDecoder=r,console.log("vp9 loaded"),console.log(r)})}}function Ki(){ii.forEach(e=>{const u=new Date().getTime();new cu(fu(e),!0).open().then(()=>{console.log("latency of "+e+": "+(new Date().getTime()-u)),ni=e,localStorage.setItem("rendezvous-server",e)})})}Ki();function ti(e=!1){const u=localStorage.getItem("custom-rendezvous-server");return fu(u||ni,e)}function fu(e,u=!1,r=0){if(e.indexOf(":")>0){const n=e.split(":"),i=parseInt(n[1]);e=n[0]+":"+(i+(u?r||3:2))}else e+=":"+(Hi+(u?3:2));return Zi+e}function vu(e){const u=new Fi.exports.Hash;return e.forEach(r=>(typeof r=="string"&&(r=new TextEncoder().encode(r)),u.update(r))),u.digest()}var V=void 0,w=[];window.curConn=void 0;window.getRgba=()=>{const e=V;return V=void 0,e||null};window.isMobile=()=>/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4));function Yi(){return!isMobile()}function Qi(e,u,r){if(!!w&&!(!e||e=="error"&&!r)){r.toLowerCase();var n=Ti(e,u,r)?"true":"";w.push({name:"msgbox",type:e,title:u,text:r,hasRetry:n})}}function Xi(e){var u={};for(const[r,n]of Object.entries(e))!r||(u[r]=n instanceof Uint8Array?"["+n.toString()+"]":JSON.stringify(n));return u}function N(e,u){!w||(u=Xi(u),u.name=e,w.push(u))}let Xe,oi,ru,Eu,hu,ai;if(YUVCanvas.WebGLFrameSink.isAvailable()){var iu=document.createElement("canvas");oi=YUVCanvas.attach(iu,{webGL:!0}),ru=iu.getContext("webgl")}else Xe=new Worker("./yuv.js");let W=[0,0];function mu(e){if(Xe)Xe.postMessage(e);else{var u=new Date().getTime();oi.drawFrame(e);var r=iu.width,n=iu.height,i=r*n*4;i!=ai&&(Eu=new Uint8Array(i),hu=new Uint8Array(i),ai=i),ru.readPixels(0,0,r,n,ru.RGBA,ru.UNSIGNED_BYTE,Eu);const t=r*4,s=(n-1)*t;for(let l=0;l30&&(console.log("gl: "+parseInt(""+W[1]/W[0])),W=[0,0])}}function si(e){window.curConn=e}function Fu(){return window.curConn}async function $i(e){V=void 0,w=[],setByName("remote_id",e),await curConn.start(e)}function di(){var e;(e=Fu())==null||e.close(),si(void 0),V=void 0,w=void 0}function li(){var u;(u=window.curConn)==null||u.close();const e=new Gi;return si(e),e}let g;async function ci(e,u){return g||(await Nu.ready,g=Nu),typeof u=="string"&&(u=ji(u)),g.crypto_sign_open(e,u)}function ji(e){return g.from_base64(e,g.base64_variants.ORIGINAL)}function en(){const e=g.crypto_box_keypair(),u=e.privateKey,r=e.publicKey;return[u,r]}function un(){return g.crypto_secretbox_keygen()}function rn(e,u,r){const n=Uint8Array.from(Array(24).fill(0));return g.crypto_box_easy(e,n,u,r)}function pi(e){for(var u=Array(24).fill(0),r=0;r0;r++){var n=e&255;u[r]=n,e=(e-n)/256}return Uint8Array.from(u)}function nn(e,u,r){return g.crypto_secretbox_easy(e,pi(u),r)}function tn(e,u,r){return g.crypto_secretbox_open_easy(e,pi(u),r)}window.setByName=(e,u)=>{switch(e){case"remote_id":localStorage.setItem("remote-id",u);break;case"connect":li(),$i(u);break;case"login":u=JSON.parse(u),curConn.setRemember(u.remember=="true"),curConn.login(u.password);break;case"close":di();break;case"refresh":curConn.refresh();break;case"reconnect":curConn.reconnect();break;case"toggle_option":curConn.toggleOption(u);break;case"image_quality":curConn.setImageQuality(u);break;case"lock_screen":curConn.lockScreen();break;case"ctrl_alt_del":curConn.ctrlAltDel();break;case"switch_display":curConn.switchDisplay(u);break;case"remove":const r=nu();delete r[u],localStorage.setItem("peers",JSON.stringify(r));break;case"input_key":u=JSON.parse(u),curConn.inputKey(u.name,u.down=="true",u.press=="true",u.alt=="true",u.ctrl=="true",u.shift=="true",u.command=="true");break;case"input_string":curConn.inputString(u);break;case"send_mouse":let n=0;switch(u=JSON.parse(u),u.type){case"down":n=1;break;case"up":n=2;break;case"wheel":n=3;break}switch(u.buttons){case"left":n|=1<<3;break;case"right":n|=2<<3;break;case"wheel":n|=4<<3}curConn.inputMouse(n,parseInt(u.x||"0"),parseInt(u.y||"0"),u.alt=="true",u.ctrl=="true",u.shift=="true",u.command=="true");break;case"option":u=JSON.parse(u),localStorage.setItem(u.name,u.value);break;case"peer_option":u=JSON.parse(u),curConn.setOption(u.name,u.value);break;case"input_os_password":curConn.inputOsPassword(u);break}};window.getByName=(e,u)=>{let r=an(e,u);return typeof r=="string"||r instanceof String?r:r==null||r==null?"":JSON.stringify(r)};function on(){const e=[];for(const[u,r]of Object.entries(nu())){if(!u)continue;const n=r.tm,i=r.info;!n||!i||e.push([n,u,i])}return e.sort().reverse().map(u=>u.slice(1))}function an(e,u){switch(e){case"peers":return on();case"remote_id":return localStorage.getItem("remote-id");case"remember":return curConn.getRemember();case"event":if(w&&w.length){const r=w[0];return w.splice(0,1),JSON.stringify(r)}break;case"toggle_option":return curConn.getOption(u)||!1;case"option":return localStorage.getItem(u);case"image_quality":return curConn.getImageQuality();case"translate":return u=JSON.parse(u),Ji(u.locale,u.text);case"peer_option":return curConn.getOption(u);case"test_if_valid_server":break;case"version":return qi}return""}let Du=new Worker("./libopus.js"),_i;function sn(e,u){_i=ln(e,u),Du.postMessage({channels:e,sampleRate:u})}function dn(e){Du.postMessage(e,[e.buffer])}window.init=async()=>{Xe&&(Xe.onmessage=e=>{V=e.data}),Du.onmessage=e=>{_i.feed(e.data)},jr(()=>{}),await ui(),console.log("init done")};function nu(){try{return JSON.parse(localStorage.getItem("peers"))||{}}catch{return{}}}function ln(e,u){return new Di({channels:e,sampleRate:u,flushingTime:2e3})}function cn(e){if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){var u=document.createElement("textarea");u.textContent=e,u.style.position="fixed",document.body.appendChild(u),u.select();try{return document.execCommand("copy")}catch(r){console.warn("Copy to clipboard failed.",r)}finally{document.body.removeChild(u)}}}const fi=document.querySelector("#app");if(fi){let u=function(r,n,i){!Fu()||(r=="input-password"?(document.querySelector("div#status").style.display="none",document.querySelector("div#password").style.display="block"):r?r=="error"?(document.querySelector("div#status").style.display="block",document.querySelector("div#canvas").style.display="none",document.querySelector("div#text").innerHTML='
'+i+"
"):(document.querySelector("div#password").style.display="none",document.querySelector("div#status").style.display="block",document.querySelector("div#text").innerHTML='
'+i+"
"):(document.querySelector("div#canvas").style.display="block",document.querySelector("div#password").style.display="none",document.querySelector("div#status").style.display="none"))};fi.innerHTML=` +
+ + + + +
Host:
Key:
Id:
+ + + +`;let e;window.init(),document.body.onload=()=>{const r=document.querySelector("#host");r.value=localStorage.getItem("custom-rendezvous-server");const n=document.querySelector("#id");n.value=localStorage.getItem("id");const i=document.querySelector("#key");i.value=localStorage.getItem("key"),e=YUVCanvas.attach(document.getElementById("player"))},window.connect=()=>{const r=document.querySelector("#host");localStorage.setItem("custom-rendezvous-server",r.value);const n=document.querySelector("#id");localStorage.setItem("id",n.value);const i=document.querySelector("#key");localStorage.setItem("key",i.value),(async()=>{const s=li();s.setMsgbox(u),s.setDraw(l=>{mu(l),e.drawFrame(l)}),document.querySelector("div#status").style.display="block",document.querySelector("div#connect").style.display="none",document.querySelector("div#text").innerHTML="Connecting ...",await s.start(n.value)})()},window.cancel=()=>{di(),document.querySelector("div#connect").style.display="block",document.querySelector("div#password").style.display="none",document.querySelector("div#status").style.display="none",document.querySelector("div#canvas").style.display="none"},window.confirm=()=>{const r=document.querySelector("input#password").value;r&&(document.querySelector("div#password").style.display="none",Fu().login(r))}} diff --git a/flutter/web/assets/vendor.32e42528.js b/flutter/web/assets/vendor.32e42528.js new file mode 100644 index 000000000..a4e577a6b --- /dev/null +++ b/flutter/web/assets/vendor.32e42528.js @@ -0,0 +1 @@ +var commonjsGlobal=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function getAugmentedNamespace(oA){if(oA.__esModule)return oA;var J=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(oA).forEach(function(sA){var GA=Object.getOwnPropertyDescriptor(oA,sA);Object.defineProperty(J,sA,GA.get?GA:{enumerable:!0,get:function(){return oA[sA]}})}),J}var long=Long,wasm=null;try{wasm=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}function Long(oA,J,sA){this.low=oA|0,this.high=J|0,this.unsigned=!!sA}Long.prototype.__isLong__;Object.defineProperty(Long.prototype,"__isLong__",{value:!0});function isLong(oA){return(oA&&oA.__isLong__)===!0}Long.isLong=isLong;var INT_CACHE={},UINT_CACHE={};function fromInt(oA,J){var sA,GA,uA;return J?(oA>>>=0,(uA=0<=oA&&oA<256)&&(GA=UINT_CACHE[oA],GA)?GA:(sA=fromBits(oA,(oA|0)<0?-1:0,!0),uA&&(UINT_CACHE[oA]=sA),sA)):(oA|=0,(uA=-128<=oA&&oA<128)&&(GA=INT_CACHE[oA],GA)?GA:(sA=fromBits(oA,oA<0?-1:0,!1),uA&&(INT_CACHE[oA]=sA),sA))}Long.fromInt=fromInt;function fromNumber(oA,J){if(isNaN(oA))return J?UZERO:ZERO;if(J){if(oA<0)return UZERO;if(oA>=TWO_PWR_64_DBL)return MAX_UNSIGNED_VALUE}else{if(oA<=-TWO_PWR_63_DBL)return MIN_VALUE;if(oA+1>=TWO_PWR_63_DBL)return MAX_VALUE}return oA<0?fromNumber(-oA,J).neg():fromBits(oA%TWO_PWR_32_DBL|0,oA/TWO_PWR_32_DBL|0,J)}Long.fromNumber=fromNumber;function fromBits(oA,J,sA){return new Long(oA,J,sA)}Long.fromBits=fromBits;var pow_dbl=Math.pow;function fromString(oA,J,sA){if(oA.length===0)throw Error("empty string");if(oA==="NaN"||oA==="Infinity"||oA==="+Infinity"||oA==="-Infinity")return ZERO;if(typeof J=="number"?(sA=J,J=!1):J=!!J,sA=sA||10,sA<2||360)throw Error("interior hyphen");if(GA===0)return fromString(oA.substring(1),J,sA).neg();for(var uA=fromNumber(pow_dbl(sA,8)),vA=ZERO,P=0;P>>0:this.low};LongPrototype.toNumber=function(){return this.unsigned?(this.high>>>0)*TWO_PWR_32_DBL+(this.low>>>0):this.high*TWO_PWR_32_DBL+(this.low>>>0)};LongPrototype.toString=function(J){if(J=J||10,J<2||36>>0,e0=LA.toString(J);if(P=JA,P.isZero())return e0+PA;for(;e0.length<6;)e0="0"+e0;PA=""+e0+PA}};LongPrototype.getHighBits=function(){return this.high};LongPrototype.getHighBitsUnsigned=function(){return this.high>>>0};LongPrototype.getLowBits=function(){return this.low};LongPrototype.getLowBitsUnsigned=function(){return this.low>>>0};LongPrototype.getNumBitsAbs=function(){if(this.isNegative())return this.eq(MIN_VALUE)?64:this.neg().getNumBitsAbs();for(var J=this.high!=0?this.high:this.low,sA=31;sA>0&&(J&1<=0};LongPrototype.isOdd=function(){return(this.low&1)==1};LongPrototype.isEven=function(){return(this.low&1)==0};LongPrototype.equals=function(J){return isLong(J)||(J=fromValue(J)),this.unsigned!==J.unsigned&&this.high>>>31==1&&J.high>>>31==1?!1:this.high===J.high&&this.low===J.low};LongPrototype.eq=LongPrototype.equals;LongPrototype.notEquals=function(J){return!this.eq(J)};LongPrototype.neq=LongPrototype.notEquals;LongPrototype.ne=LongPrototype.notEquals;LongPrototype.lessThan=function(J){return this.comp(J)<0};LongPrototype.lt=LongPrototype.lessThan;LongPrototype.lessThanOrEqual=function(J){return this.comp(J)<=0};LongPrototype.lte=LongPrototype.lessThanOrEqual;LongPrototype.le=LongPrototype.lessThanOrEqual;LongPrototype.greaterThan=function(J){return this.comp(J)>0};LongPrototype.gt=LongPrototype.greaterThan;LongPrototype.greaterThanOrEqual=function(J){return this.comp(J)>=0};LongPrototype.gte=LongPrototype.greaterThanOrEqual;LongPrototype.ge=LongPrototype.greaterThanOrEqual;LongPrototype.compare=function(J){if(isLong(J)||(J=fromValue(J)),this.eq(J))return 0;var sA=this.isNegative(),GA=J.isNegative();return sA&&!GA?-1:!sA&&GA?1:this.unsigned?J.high>>>0>this.high>>>0||J.high===this.high&&J.low>>>0>this.low>>>0?-1:1:this.sub(J).isNegative()?-1:1};LongPrototype.comp=LongPrototype.compare;LongPrototype.negate=function(){return!this.unsigned&&this.eq(MIN_VALUE)?MIN_VALUE:this.not().add(ONE)};LongPrototype.neg=LongPrototype.negate;LongPrototype.add=function(J){isLong(J)||(J=fromValue(J));var sA=this.high>>>16,GA=this.high&65535,uA=this.low>>>16,vA=this.low&65535,P=J.high>>>16,PA=J.high&65535,JA=J.low>>>16,LA=J.low&65535,e0=0,R=0,i0=0,$A=0;return $A+=vA+LA,i0+=$A>>>16,$A&=65535,i0+=uA+JA,R+=i0>>>16,i0&=65535,R+=GA+PA,e0+=R>>>16,R&=65535,e0+=sA+P,e0&=65535,fromBits(i0<<16|$A,e0<<16|R,this.unsigned)};LongPrototype.subtract=function(J){return isLong(J)||(J=fromValue(J)),this.add(J.neg())};LongPrototype.sub=LongPrototype.subtract;LongPrototype.multiply=function(J){if(this.isZero())return ZERO;if(isLong(J)||(J=fromValue(J)),wasm){var sA=wasm.mul(this.low,this.high,J.low,J.high);return fromBits(sA,wasm.get_high(),this.unsigned)}if(J.isZero())return ZERO;if(this.eq(MIN_VALUE))return J.isOdd()?MIN_VALUE:ZERO;if(J.eq(MIN_VALUE))return this.isOdd()?MIN_VALUE:ZERO;if(this.isNegative())return J.isNegative()?this.neg().mul(J.neg()):this.neg().mul(J).neg();if(J.isNegative())return this.mul(J.neg()).neg();if(this.lt(TWO_PWR_24)&&J.lt(TWO_PWR_24))return fromNumber(this.toNumber()*J.toNumber(),this.unsigned);var GA=this.high>>>16,uA=this.high&65535,vA=this.low>>>16,P=this.low&65535,PA=J.high>>>16,JA=J.high&65535,LA=J.low>>>16,e0=J.low&65535,R=0,i0=0,$A=0,pA=0;return pA+=P*e0,$A+=pA>>>16,pA&=65535,$A+=vA*e0,i0+=$A>>>16,$A&=65535,$A+=P*LA,i0+=$A>>>16,$A&=65535,i0+=uA*e0,R+=i0>>>16,i0&=65535,i0+=vA*LA,R+=i0>>>16,i0&=65535,i0+=P*JA,R+=i0>>>16,i0&=65535,R+=GA*e0+uA*LA+vA*JA+P*PA,R&=65535,fromBits($A<<16|pA,R<<16|i0,this.unsigned)};LongPrototype.mul=LongPrototype.multiply;LongPrototype.divide=function(J){if(isLong(J)||(J=fromValue(J)),J.isZero())throw Error("division by zero");if(wasm){if(!this.unsigned&&this.high===-2147483648&&J.low===-1&&J.high===-1)return this;var sA=(this.unsigned?wasm.div_u:wasm.div_s)(this.low,this.high,J.low,J.high);return fromBits(sA,wasm.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?UZERO:ZERO;var GA,uA,vA;if(this.unsigned){if(J.unsigned||(J=J.toUnsigned()),J.gt(this))return UZERO;if(J.gt(this.shru(1)))return UONE;vA=UZERO}else{if(this.eq(MIN_VALUE)){if(J.eq(ONE)||J.eq(NEG_ONE))return MIN_VALUE;if(J.eq(MIN_VALUE))return ONE;var P=this.shr(1);return GA=P.div(J).shl(1),GA.eq(ZERO)?J.isNegative()?ONE:NEG_ONE:(uA=this.sub(J.mul(GA)),vA=GA.add(uA.div(J)),vA)}else if(J.eq(MIN_VALUE))return this.unsigned?UZERO:ZERO;if(this.isNegative())return J.isNegative()?this.neg().div(J.neg()):this.neg().div(J).neg();if(J.isNegative())return this.div(J.neg()).neg();vA=ZERO}for(uA=this;uA.gte(J);){GA=Math.max(1,Math.floor(uA.toNumber()/J.toNumber()));for(var PA=Math.ceil(Math.log(GA)/Math.LN2),JA=PA<=48?1:pow_dbl(2,PA-48),LA=fromNumber(GA),e0=LA.mul(J);e0.isNegative()||e0.gt(uA);)GA-=JA,LA=fromNumber(GA,this.unsigned),e0=LA.mul(J);LA.isZero()&&(LA=ONE),vA=vA.add(LA),uA=uA.sub(e0)}return vA};LongPrototype.div=LongPrototype.divide;LongPrototype.modulo=function(J){if(isLong(J)||(J=fromValue(J)),wasm){var sA=(this.unsigned?wasm.rem_u:wasm.rem_s)(this.low,this.high,J.low,J.high);return fromBits(sA,wasm.get_high(),this.unsigned)}return this.sub(this.div(J).mul(J))};LongPrototype.mod=LongPrototype.modulo;LongPrototype.rem=LongPrototype.modulo;LongPrototype.not=function(){return fromBits(~this.low,~this.high,this.unsigned)};LongPrototype.and=function(J){return isLong(J)||(J=fromValue(J)),fromBits(this.low&J.low,this.high&J.high,this.unsigned)};LongPrototype.or=function(J){return isLong(J)||(J=fromValue(J)),fromBits(this.low|J.low,this.high|J.high,this.unsigned)};LongPrototype.xor=function(J){return isLong(J)||(J=fromValue(J)),fromBits(this.low^J.low,this.high^J.high,this.unsigned)};LongPrototype.shiftLeft=function(J){return isLong(J)&&(J=J.toInt()),(J&=63)==0?this:J<32?fromBits(this.low<>>32-J,this.unsigned):fromBits(0,this.low<>>J|this.high<<32-J,this.high>>J,this.unsigned):fromBits(this.high>>J-32,this.high>=0?0:-1,this.unsigned)};LongPrototype.shr=LongPrototype.shiftRight;LongPrototype.shiftRightUnsigned=function(J){if(isLong(J)&&(J=J.toInt()),J&=63,J===0)return this;var sA=this.high;if(J<32){var GA=this.low;return fromBits(GA>>>J|sA<<32-J,sA>>>J,this.unsigned)}else return J===32?fromBits(sA,0,this.unsigned):fromBits(sA>>>J-32,0,this.unsigned)};LongPrototype.shru=LongPrototype.shiftRightUnsigned;LongPrototype.shr_u=LongPrototype.shiftRightUnsigned;LongPrototype.toSigned=function(){return this.unsigned?fromBits(this.low,this.high,!1):this};LongPrototype.toUnsigned=function(){return this.unsigned?this:fromBits(this.low,this.high,!0)};LongPrototype.toBytes=function(J){return J?this.toBytesLE():this.toBytesBE()};LongPrototype.toBytesLE=function(){var J=this.high,sA=this.low;return[sA&255,sA>>>8&255,sA>>>16&255,sA>>>24,J&255,J>>>8&255,J>>>16&255,J>>>24]};LongPrototype.toBytesBE=function(){var J=this.high,sA=this.low;return[J>>>24,J>>>16&255,J>>>8&255,J&255,sA>>>24,sA>>>16&255,sA>>>8&255,sA&255]};Long.fromBytes=function(J,sA,GA){return GA?Long.fromBytesLE(J,sA):Long.fromBytesBE(J,sA)};Long.fromBytesLE=function(J,sA){return new Long(J[0]|J[1]<<8|J[2]<<16|J[3]<<24,J[4]|J[5]<<8|J[6]<<16|J[7]<<24,sA)};Long.fromBytesBE=function(J,sA){return new Long(J[4]<<24|J[5]<<16|J[6]<<8|J[7],J[0]<<24|J[1]<<16|J[2]<<8|J[3],sA)};var indexMinimal={},minimal$1={},aspromise=asPromise;function asPromise(oA,J){for(var sA=new Array(arguments.length-1),GA=0,uA=2,vA=!0;uA1&&PA.charAt(JA)==="=";)++LA;return Math.ceil(PA.length*3)/4-LA};for(var sA=new Array(64),GA=new Array(123),uA=0;uA<64;)GA[sA[uA]=uA<26?uA+65:uA<52?uA+71:uA<62?uA-4:uA-59|43]=uA++;J.encode=function(PA,JA,LA){for(var e0=null,R=[],i0=0,$A=0,pA;JA>2],pA=(u0&3)<<4,$A=1;break;case 1:R[i0++]=sA[pA|u0>>4],pA=(u0&15)<<2,$A=2;break;case 2:R[i0++]=sA[pA|u0>>6],R[i0++]=sA[u0&63],$A=0;break}i0>8191&&((e0||(e0=[])).push(String.fromCharCode.apply(String,R)),i0=0)}return $A&&(R[i0++]=sA[pA],R[i0++]=61,$A===1&&(R[i0++]=61)),e0?(i0&&e0.push(String.fromCharCode.apply(String,R.slice(0,i0))),e0.join("")):String.fromCharCode.apply(String,R.slice(0,i0))};var vA="invalid encoding";J.decode=function(PA,JA,LA){for(var e0=LA,R=0,i0,$A=0;$A1)break;if((pA=GA[pA])===void 0)throw Error(vA);switch(R){case 0:i0=pA,R=1;break;case 1:JA[LA++]=i0<<2|(pA&48)>>4,i0=pA,R=2;break;case 2:JA[LA++]=(i0&15)<<4|(pA&60)>>2,i0=pA,R=3;break;case 3:JA[LA++]=(i0&3)<<6|pA,R=0;break}}if(R===1)throw Error(vA);return LA-e0},J.test=function(PA){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(PA)}})(base64$1);var eventemitter=EventEmitter;function EventEmitter(){this._listeners={}}EventEmitter.prototype.on=function(J,sA,GA){return(this._listeners[J]||(this._listeners[J]=[])).push({fn:sA,ctx:GA||this}),this};EventEmitter.prototype.off=function(J,sA){if(J===void 0)this._listeners={};else if(sA===void 0)this._listeners[J]=[];else for(var GA=this._listeners[J],uA=0;uA0?0:2147483648,vA,P);else if(isNaN(uA))GA(2143289344,vA,P);else if(uA>34028234663852886e22)GA((PA<<31|2139095040)>>>0,vA,P);else if(uA<11754943508222875e-54)GA((PA<<31|Math.round(uA/1401298464324817e-60))>>>0,vA,P);else{var JA=Math.floor(Math.log(uA)/Math.LN2),LA=Math.round(uA*Math.pow(2,-JA)*8388608)&8388607;GA((PA<<31|JA+127<<23|LA)>>>0,vA,P)}}oA.writeFloatLE=J.bind(null,writeUintLE),oA.writeFloatBE=J.bind(null,writeUintBE);function sA(GA,uA,vA){var P=GA(uA,vA),PA=(P>>31)*2+1,JA=P>>>23&255,LA=P&8388607;return JA===255?LA?NaN:PA*(1/0):JA===0?PA*1401298464324817e-60*LA:PA*Math.pow(2,JA-150)*(LA+8388608)}oA.readFloatLE=sA.bind(null,readUintLE),oA.readFloatBE=sA.bind(null,readUintBE)}(),typeof Float64Array!="undefined"?function(){var J=new Float64Array([-0]),sA=new Uint8Array(J.buffer),GA=sA[7]===128;function uA(JA,LA,e0){J[0]=JA,LA[e0]=sA[0],LA[e0+1]=sA[1],LA[e0+2]=sA[2],LA[e0+3]=sA[3],LA[e0+4]=sA[4],LA[e0+5]=sA[5],LA[e0+6]=sA[6],LA[e0+7]=sA[7]}function vA(JA,LA,e0){J[0]=JA,LA[e0]=sA[7],LA[e0+1]=sA[6],LA[e0+2]=sA[5],LA[e0+3]=sA[4],LA[e0+4]=sA[3],LA[e0+5]=sA[2],LA[e0+6]=sA[1],LA[e0+7]=sA[0]}oA.writeDoubleLE=GA?uA:vA,oA.writeDoubleBE=GA?vA:uA;function P(JA,LA){return sA[0]=JA[LA],sA[1]=JA[LA+1],sA[2]=JA[LA+2],sA[3]=JA[LA+3],sA[4]=JA[LA+4],sA[5]=JA[LA+5],sA[6]=JA[LA+6],sA[7]=JA[LA+7],J[0]}function PA(JA,LA){return sA[7]=JA[LA],sA[6]=JA[LA+1],sA[5]=JA[LA+2],sA[4]=JA[LA+3],sA[3]=JA[LA+4],sA[2]=JA[LA+5],sA[1]=JA[LA+6],sA[0]=JA[LA+7],J[0]}oA.readDoubleLE=GA?P:PA,oA.readDoubleBE=GA?PA:P}():function(){function J(GA,uA,vA,P,PA,JA){var LA=P<0?1:0;if(LA&&(P=-P),P===0)GA(0,PA,JA+uA),GA(1/P>0?0:2147483648,PA,JA+vA);else if(isNaN(P))GA(0,PA,JA+uA),GA(2146959360,PA,JA+vA);else if(P>17976931348623157e292)GA(0,PA,JA+uA),GA((LA<<31|2146435072)>>>0,PA,JA+vA);else{var e0;if(P<22250738585072014e-324)e0=P/5e-324,GA(e0>>>0,PA,JA+uA),GA((LA<<31|e0/4294967296)>>>0,PA,JA+vA);else{var R=Math.floor(Math.log(P)/Math.LN2);R===1024&&(R=1023),e0=P*Math.pow(2,-R),GA(e0*4503599627370496>>>0,PA,JA+uA),GA((LA<<31|R+1023<<20|e0*1048576&1048575)>>>0,PA,JA+vA)}}}oA.writeDoubleLE=J.bind(null,writeUintLE,0,4),oA.writeDoubleBE=J.bind(null,writeUintBE,4,0);function sA(GA,uA,vA,P,PA){var JA=GA(P,PA+uA),LA=GA(P,PA+vA),e0=(LA>>31)*2+1,R=LA>>>20&2047,i0=4294967296*(LA&1048575)+JA;return R===2047?i0?NaN:e0*(1/0):R===0?e0*5e-324*i0:e0*Math.pow(2,R-1075)*(i0+4503599627370496)}oA.readDoubleLE=sA.bind(null,readUintLE,0,4),oA.readDoubleBE=sA.bind(null,readUintBE,4,0)}(),oA}function writeUintLE(oA,J,sA){J[sA]=oA&255,J[sA+1]=oA>>>8&255,J[sA+2]=oA>>>16&255,J[sA+3]=oA>>>24}function writeUintBE(oA,J,sA){J[sA]=oA>>>24,J[sA+1]=oA>>>16&255,J[sA+2]=oA>>>8&255,J[sA+3]=oA&255}function readUintLE(oA,J){return(oA[J]|oA[J+1]<<8|oA[J+2]<<16|oA[J+3]<<24)>>>0}function readUintBE(oA,J){return(oA[J]<<24|oA[J+1]<<16|oA[J+2]<<8|oA[J+3])>>>0}var inquire_1=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(oA){}return null}var utf8$2={};(function(oA){var J=oA;J.length=function(GA){for(var uA=0,vA=0,P=0;P191&&e0<224?JA[LA++]=(e0&31)<<6|GA[uA++]&63:e0>239&&e0<365?(e0=((e0&7)<<18|(GA[uA++]&63)<<12|(GA[uA++]&63)<<6|GA[uA++]&63)-65536,JA[LA++]=55296+(e0>>10),JA[LA++]=56320+(e0&1023)):JA[LA++]=(e0&15)<<12|(GA[uA++]&63)<<6|GA[uA++]&63,LA>8191&&((PA||(PA=[])).push(String.fromCharCode.apply(String,JA)),LA=0);return PA?(LA&&PA.push(String.fromCharCode.apply(String,JA.slice(0,LA))),PA.join("")):String.fromCharCode.apply(String,JA.slice(0,LA))},J.write=function(GA,uA,vA){for(var P=vA,PA,JA,LA=0;LA>6|192,uA[vA++]=PA&63|128):(PA&64512)==55296&&((JA=GA.charCodeAt(LA+1))&64512)==56320?(PA=65536+((PA&1023)<<10)+(JA&1023),++LA,uA[vA++]=PA>>18|240,uA[vA++]=PA>>12&63|128,uA[vA++]=PA>>6&63|128,uA[vA++]=PA&63|128):(uA[vA++]=PA>>12|224,uA[vA++]=PA>>6&63|128,uA[vA++]=PA&63|128);return vA-P}})(utf8$2);var pool_1=pool;function pool(oA,J,sA){var GA=sA||8192,uA=GA>>>1,vA=null,P=GA;return function(JA){if(JA<1||JA>uA)return oA(JA);P+JA>GA&&(vA=oA(GA),P=0);var LA=J.call(vA,P,P+=JA);return P&7&&(P=(P|7)+1),LA}}var longbits=LongBits$2,util$5=minimal$1;function LongBits$2(oA,J){this.lo=oA>>>0,this.hi=J>>>0}var zero=LongBits$2.zero=new LongBits$2(0,0);zero.toNumber=function(){return 0};zero.zzEncode=zero.zzDecode=function(){return this};zero.length=function(){return 1};var zeroHash=LongBits$2.zeroHash="\0\0\0\0\0\0\0\0";LongBits$2.fromNumber=function oA(J){if(J===0)return zero;var sA=J<0;sA&&(J=-J);var GA=J>>>0,uA=(J-GA)/4294967296>>>0;return sA&&(uA=~uA>>>0,GA=~GA>>>0,++GA>4294967295&&(GA=0,++uA>4294967295&&(uA=0))),new LongBits$2(GA,uA)};LongBits$2.from=function oA(J){if(typeof J=="number")return LongBits$2.fromNumber(J);if(util$5.isString(J))if(util$5.Long)J=util$5.Long.fromString(J);else return LongBits$2.fromNumber(parseInt(J,10));return J.low||J.high?new LongBits$2(J.low>>>0,J.high>>>0):zero};LongBits$2.prototype.toNumber=function oA(J){if(!J&&this.hi>>>31){var sA=~this.lo+1>>>0,GA=~this.hi>>>0;return sA||(GA=GA+1>>>0),-(sA+GA*4294967296)}return this.lo+this.hi*4294967296};LongBits$2.prototype.toLong=function oA(J){return util$5.Long?new util$5.Long(this.lo|0,this.hi|0,Boolean(J)):{low:this.lo|0,high:this.hi|0,unsigned:Boolean(J)}};var charCodeAt=String.prototype.charCodeAt;LongBits$2.fromHash=function oA(J){return J===zeroHash?zero:new LongBits$2((charCodeAt.call(J,0)|charCodeAt.call(J,1)<<8|charCodeAt.call(J,2)<<16|charCodeAt.call(J,3)<<24)>>>0,(charCodeAt.call(J,4)|charCodeAt.call(J,5)<<8|charCodeAt.call(J,6)<<16|charCodeAt.call(J,7)<<24)>>>0)};LongBits$2.prototype.toHash=function oA(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};LongBits$2.prototype.zzEncode=function oA(){var J=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^J)>>>0,this.lo=(this.lo<<1^J)>>>0,this};LongBits$2.prototype.zzDecode=function oA(){var J=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^J)>>>0,this.hi=(this.hi>>>1^J)>>>0,this};LongBits$2.prototype.length=function oA(){var J=this.lo,sA=(this.lo>>>28|this.hi<<4)>>>0,GA=this.hi>>>24;return GA===0?sA===0?J<16384?J<128?1:2:J<2097152?3:4:sA<16384?sA<128?5:6:sA<2097152?7:8:GA<128?9:10};(function(oA){var J=oA;J.asPromise=aspromise,J.base64=base64$1,J.EventEmitter=eventemitter,J.float=float,J.inquire=inquire_1,J.utf8=utf8$2,J.pool=pool_1,J.LongBits=longbits,J.isNode=Boolean(typeof commonjsGlobal!="undefined"&&commonjsGlobal&&commonjsGlobal.process&&commonjsGlobal.process.versions&&commonjsGlobal.process.versions.node),J.global=J.isNode&&commonjsGlobal||typeof window!="undefined"&&window||typeof self!="undefined"&&self||commonjsGlobal,J.emptyArray=Object.freeze?Object.freeze([]):[],J.emptyObject=Object.freeze?Object.freeze({}):{},J.isInteger=Number.isInteger||function(vA){return typeof vA=="number"&&isFinite(vA)&&Math.floor(vA)===vA},J.isString=function(vA){return typeof vA=="string"||vA instanceof String},J.isObject=function(vA){return vA&&typeof vA=="object"},J.isset=J.isSet=function(vA,P){var PA=vA[P];return PA!=null&&vA.hasOwnProperty(P)?typeof PA!="object"||(Array.isArray(PA)?PA.length:Object.keys(PA).length)>0:!1},J.Buffer=function(){try{var uA=J.inquire("buffer").Buffer;return uA.prototype.utf8Write?uA:null}catch{return null}}(),J._Buffer_from=null,J._Buffer_allocUnsafe=null,J.newBuffer=function(vA){return typeof vA=="number"?J.Buffer?J._Buffer_allocUnsafe(vA):new J.Array(vA):J.Buffer?J._Buffer_from(vA):typeof Uint8Array=="undefined"?vA:new Uint8Array(vA)},J.Array=typeof Uint8Array!="undefined"?Uint8Array:Array,J.Long=J.global.dcodeIO&&J.global.dcodeIO.Long||J.global.Long||J.inquire("long"),J.key2Re=/^true|false|0|1$/,J.key32Re=/^-?(?:0|[1-9][0-9]*)$/,J.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,J.longToHash=function(vA){return vA?J.LongBits.from(vA).toHash():J.LongBits.zeroHash},J.longFromHash=function(vA,P){var PA=J.LongBits.fromHash(vA);return J.Long?J.Long.fromBits(PA.lo,PA.hi,P):PA.toNumber(Boolean(P))};function sA(uA,vA,P){for(var PA=Object.keys(vA),JA=0;JA-1;--LA)if(P[JA[LA]]===1&&this[JA[LA]]!==void 0&&this[JA[LA]]!==null)return JA[LA]}},J.oneOfSetter=function(vA){return function(P){for(var PA=0;PA127;)J[sA++]=oA&127|128,oA>>>=7;J[sA]=oA}function VarintOp(oA,J){this.len=oA,this.next=void 0,this.val=J}VarintOp.prototype=Object.create(Op.prototype);VarintOp.prototype.fn=writeVarint32;Writer$1.prototype.uint32=function oA(J){return this.len+=(this.tail=this.tail.next=new VarintOp((J=J>>>0)<128?1:J<16384?2:J<2097152?3:J<268435456?4:5,J)).len,this};Writer$1.prototype.int32=function oA(J){return J<0?this._push(writeVarint64,10,LongBits$1.fromNumber(J)):this.uint32(J)};Writer$1.prototype.sint32=function oA(J){return this.uint32((J<<1^J>>31)>>>0)};function writeVarint64(oA,J,sA){for(;oA.hi;)J[sA++]=oA.lo&127|128,oA.lo=(oA.lo>>>7|oA.hi<<25)>>>0,oA.hi>>>=7;for(;oA.lo>127;)J[sA++]=oA.lo&127|128,oA.lo=oA.lo>>>7;J[sA++]=oA.lo}Writer$1.prototype.uint64=function oA(J){var sA=LongBits$1.from(J);return this._push(writeVarint64,sA.length(),sA)};Writer$1.prototype.int64=Writer$1.prototype.uint64;Writer$1.prototype.sint64=function oA(J){var sA=LongBits$1.from(J).zzEncode();return this._push(writeVarint64,sA.length(),sA)};Writer$1.prototype.bool=function oA(J){return this._push(writeByte,1,J?1:0)};function writeFixed32(oA,J,sA){J[sA]=oA&255,J[sA+1]=oA>>>8&255,J[sA+2]=oA>>>16&255,J[sA+3]=oA>>>24}Writer$1.prototype.fixed32=function oA(J){return this._push(writeFixed32,4,J>>>0)};Writer$1.prototype.sfixed32=Writer$1.prototype.fixed32;Writer$1.prototype.fixed64=function oA(J){var sA=LongBits$1.from(J);return this._push(writeFixed32,4,sA.lo)._push(writeFixed32,4,sA.hi)};Writer$1.prototype.sfixed64=Writer$1.prototype.fixed64;Writer$1.prototype.float=function oA(J){return this._push(util$4.float.writeFloatLE,4,J)};Writer$1.prototype.double=function oA(J){return this._push(util$4.float.writeDoubleLE,8,J)};var writeBytes=util$4.Array.prototype.set?function oA(J,sA,GA){sA.set(J,GA)}:function oA(J,sA,GA){for(var uA=0;uA>>0;if(!sA)return this._push(writeByte,1,0);if(util$4.isString(J)){var GA=Writer$1.alloc(sA=base64.length(J));base64.decode(J,GA,0),J=GA}return this.uint32(sA)._push(writeBytes,sA,J)};Writer$1.prototype.string=function oA(J){var sA=utf8$1.length(J);return sA?this.uint32(sA)._push(utf8$1.write,sA,J):this._push(writeByte,1,0)};Writer$1.prototype.fork=function oA(){return this.states=new State(this),this.head=this.tail=new Op(noop,0,0),this.len=0,this};Writer$1.prototype.reset=function oA(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Op(noop,0,0),this.len=0),this};Writer$1.prototype.ldelim=function oA(){var J=this.head,sA=this.tail,GA=this.len;return this.reset().uint32(GA),GA&&(this.tail.next=J.next,this.tail=sA,this.len+=GA),this};Writer$1.prototype.finish=function oA(){for(var J=this.head.next,sA=this.constructor.alloc(this.len),GA=0;J;)J.fn(J.val,sA,GA),GA+=J.len,J=J.next;return sA};Writer$1._configure=function(oA){BufferWriter$1=oA,Writer$1.create=create$1(),BufferWriter$1._configure()};var writer_buffer=BufferWriter,Writer=writer;(BufferWriter.prototype=Object.create(Writer.prototype)).constructor=BufferWriter;var util$3=minimal$1;function BufferWriter(){Writer.call(this)}BufferWriter._configure=function(){BufferWriter.alloc=util$3._Buffer_allocUnsafe,BufferWriter.writeBytesBuffer=util$3.Buffer&&util$3.Buffer.prototype instanceof Uint8Array&&util$3.Buffer.prototype.set.name==="set"?function(J,sA,GA){sA.set(J,GA)}:function(J,sA,GA){if(J.copy)J.copy(sA,GA,0,J.length);else for(var uA=0;uA>>0;return this.uint32(sA),sA&&this._push(BufferWriter.writeBytesBuffer,sA,J),this};function writeStringBuffer(oA,J,sA){oA.length<40?util$3.utf8.write(oA,J,sA):J.utf8Write?J.utf8Write(oA,sA):J.write(oA,sA)}BufferWriter.prototype.string=function oA(J){var sA=util$3.Buffer.byteLength(J);return this.uint32(sA),sA&&this._push(writeStringBuffer,sA,J),this};BufferWriter._configure();var reader=Reader$1,util$2=minimal$1,BufferReader$1,LongBits=util$2.LongBits,utf8=util$2.utf8;function indexOutOfRange(oA,J){return RangeError("index out of range: "+oA.pos+" + "+(J||1)+" > "+oA.len)}function Reader$1(oA){this.buf=oA,this.pos=0,this.len=oA.length}var create_array=typeof Uint8Array!="undefined"?function oA(J){if(J instanceof Uint8Array||Array.isArray(J))return new Reader$1(J);throw Error("illegal buffer")}:function oA(J){if(Array.isArray(J))return new Reader$1(J);throw Error("illegal buffer")},create=function oA(){return util$2.Buffer?function(sA){return(Reader$1.create=function(uA){return util$2.Buffer.isBuffer(uA)?new BufferReader$1(uA):create_array(uA)})(sA)}:create_array};Reader$1.create=create();Reader$1.prototype._slice=util$2.Array.prototype.subarray||util$2.Array.prototype.slice;Reader$1.prototype.uint32=function oA(){var J=4294967295;return function(){if(J=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(J=(J|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(J=(J|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(J=(J|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(J=(J|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return J;if((this.pos+=5)>this.len)throw this.pos=this.len,indexOutOfRange(this,10);return J}}();Reader$1.prototype.int32=function oA(){return this.uint32()|0};Reader$1.prototype.sint32=function oA(){var J=this.uint32();return J>>>1^-(J&1)|0};function readLongVarint(){var oA=new LongBits(0,0),J=0;if(this.len-this.pos>4){for(;J<4;++J)if(oA.lo=(oA.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return oA;if(oA.lo=(oA.lo|(this.buf[this.pos]&127)<<28)>>>0,oA.hi=(oA.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return oA;J=0}else{for(;J<3;++J){if(this.pos>=this.len)throw indexOutOfRange(this);if(oA.lo=(oA.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return oA}return oA.lo=(oA.lo|(this.buf[this.pos++]&127)<>>0,oA}if(this.len-this.pos>4){for(;J<5;++J)if(oA.hi=(oA.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return oA}else for(;J<5;++J){if(this.pos>=this.len)throw indexOutOfRange(this);if(oA.hi=(oA.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return oA}throw Error("invalid varint encoding")}Reader$1.prototype.bool=function oA(){return this.uint32()!==0};function readFixed32_end(oA,J){return(oA[J-4]|oA[J-3]<<8|oA[J-2]<<16|oA[J-1]<<24)>>>0}Reader$1.prototype.fixed32=function oA(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return readFixed32_end(this.buf,this.pos+=4)};Reader$1.prototype.sfixed32=function oA(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return readFixed32_end(this.buf,this.pos+=4)|0};function readFixed64(){if(this.pos+8>this.len)throw indexOutOfRange(this,8);return new LongBits(readFixed32_end(this.buf,this.pos+=4),readFixed32_end(this.buf,this.pos+=4))}Reader$1.prototype.float=function oA(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);var J=util$2.float.readFloatLE(this.buf,this.pos);return this.pos+=4,J};Reader$1.prototype.double=function oA(){if(this.pos+8>this.len)throw indexOutOfRange(this,4);var J=util$2.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,J};Reader$1.prototype.bytes=function oA(){var J=this.uint32(),sA=this.pos,GA=this.pos+J;if(GA>this.len)throw indexOutOfRange(this,J);return this.pos+=J,Array.isArray(this.buf)?this.buf.slice(sA,GA):sA===GA?new this.buf.constructor(0):this._slice.call(this.buf,sA,GA)};Reader$1.prototype.string=function oA(){var J=this.bytes();return utf8.read(J,0,J.length)};Reader$1.prototype.skip=function oA(J){if(typeof J=="number"){if(this.pos+J>this.len)throw indexOutOfRange(this,J);this.pos+=J}else do if(this.pos>=this.len)throw indexOutOfRange(this);while(this.buf[this.pos++]&128);return this};Reader$1.prototype.skipType=function(oA){switch(oA){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(oA=this.uint32()&7)!=4;)this.skipType(oA);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+oA+" at offset "+this.pos)}return this};Reader$1._configure=function(oA){BufferReader$1=oA,Reader$1.create=create(),BufferReader$1._configure();var J=util$2.Long?"toLong":"toNumber";util$2.merge(Reader$1.prototype,{int64:function(){return readLongVarint.call(this)[J](!1)},uint64:function(){return readLongVarint.call(this)[J](!0)},sint64:function(){return readLongVarint.call(this).zzDecode()[J](!1)},fixed64:function(){return readFixed64.call(this)[J](!0)},sfixed64:function(){return readFixed64.call(this)[J](!1)}})};var reader_buffer=BufferReader,Reader=reader;(BufferReader.prototype=Object.create(Reader.prototype)).constructor=BufferReader;var util$1=minimal$1;function BufferReader(oA){Reader.call(this,oA)}BufferReader._configure=function(){util$1.Buffer&&(BufferReader.prototype._slice=util$1.Buffer.prototype.slice)};BufferReader.prototype.string=function oA(){var J=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+J,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+J,this.len))};BufferReader._configure();var rpc={},service=Service,util=minimal$1;(Service.prototype=Object.create(util.EventEmitter.prototype)).constructor=Service;function Service(oA,J,sA){if(typeof oA!="function")throw TypeError("rpcImpl must be a function");util.EventEmitter.call(this),this.rpcImpl=oA,this.requestDelimited=Boolean(J),this.responseDelimited=Boolean(sA)}Service.prototype.rpcCall=function oA(J,sA,GA,uA,vA){if(!uA)throw TypeError("request must be specified");var P=this;if(!vA)return util.asPromise(oA,P,J,sA,GA,uA);if(!P.rpcImpl){setTimeout(function(){vA(Error("already ended"))},0);return}try{return P.rpcImpl(J,sA[P.requestDelimited?"encodeDelimited":"encode"](uA).finish(),function(JA,LA){if(JA)return P.emit("error",JA,J),vA(JA);if(LA===null){P.end(!0);return}if(!(LA instanceof GA))try{LA=GA[P.responseDelimited?"decodeDelimited":"decode"](LA)}catch(e0){return P.emit("error",e0,J),vA(e0)}return P.emit("data",LA,J),vA(null,LA)})}catch(PA){P.emit("error",PA,J),setTimeout(function(){vA(PA)},0);return}};Service.prototype.end=function oA(J){return this.rpcImpl&&(J||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this};(function(oA){var J=oA;J.Service=service})(rpc);var roots={};(function(oA){var J=oA;J.build="minimal",J.Writer=writer,J.BufferWriter=writer_buffer,J.Reader=reader,J.BufferReader=reader_buffer,J.util=minimal$1,J.rpc=rpc,J.roots=roots,J.configure=sA;function sA(){J.util._configure(),J.Writer._configure(J.BufferWriter),J.Reader._configure(J.BufferReader)}sA()})(indexMinimal);var minimal=indexMinimal;const simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));var sha256={exports:{}};(function(oA){(function(J,sA){var GA={};sA(GA);var uA=GA.default;for(var vA in GA)uA[vA]=GA[vA];oA.exports=uA})(commonjsGlobal,function(J){J.__esModule=!0,J.digestLength=32,J.blockSize=64;var sA=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function GA(i0,$A,pA,u0,kA){for(var dA,QA,F0,FA,KA,IA,l0,EA,At,j0,Pt,Kt,qt;kA>=64;){for(dA=$A[0],QA=$A[1],F0=$A[2],FA=$A[3],KA=$A[4],IA=$A[5],l0=$A[6],EA=$A[7],j0=0;j0<16;j0++)Pt=u0+j0*4,i0[j0]=(pA[Pt]&255)<<24|(pA[Pt+1]&255)<<16|(pA[Pt+2]&255)<<8|pA[Pt+3]&255;for(j0=16;j0<64;j0++)At=i0[j0-2],Kt=(At>>>17|At<<32-17)^(At>>>19|At<<32-19)^At>>>10,At=i0[j0-15],qt=(At>>>7|At<<32-7)^(At>>>18|At<<32-18)^At>>>3,i0[j0]=(Kt+i0[j0-7]|0)+(qt+i0[j0-16]|0);for(j0=0;j0<64;j0++)Kt=(((KA>>>6|KA<<32-6)^(KA>>>11|KA<<32-11)^(KA>>>25|KA<<32-25))+(KA&IA^~KA&l0)|0)+(EA+(sA[j0]+i0[j0]|0)|0)|0,qt=((dA>>>2|dA<<32-2)^(dA>>>13|dA<<32-13)^(dA>>>22|dA<<32-22))+(dA&QA^dA&F0^QA&F0)|0,EA=l0,l0=IA,IA=KA,KA=FA+Kt|0,FA=F0,F0=QA,QA=dA,dA=Kt+qt|0;$A[0]+=dA,$A[1]+=QA,$A[2]+=F0,$A[3]+=FA,$A[4]+=KA,$A[5]+=IA,$A[6]+=l0,$A[7]+=EA,u0+=64,kA-=64}return u0}var uA=function(){function i0(){this.digestLength=J.digestLength,this.blockSize=J.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return i0.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},i0.prototype.clean=function(){for(var $A=0;$A0){for(;this.bufferLength<64&&pA>0;)this.buffer[this.bufferLength++]=$A[u0++],pA--;this.bufferLength===64&&(GA(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(pA>=64&&(u0=GA(this.temp,this.state,$A,u0,pA),pA%=64);pA>0;)this.buffer[this.bufferLength++]=$A[u0++],pA--;return this},i0.prototype.finish=function($A){if(!this.finished){var pA=this.bytesHashed,u0=this.bufferLength,kA=pA/536870912|0,dA=pA<<3,QA=pA%64<56?64:128;this.buffer[u0]=128;for(var F0=u0+1;F0>>24&255,this.buffer[QA-7]=kA>>>16&255,this.buffer[QA-6]=kA>>>8&255,this.buffer[QA-5]=kA>>>0&255,this.buffer[QA-4]=dA>>>24&255,this.buffer[QA-3]=dA>>>16&255,this.buffer[QA-2]=dA>>>8&255,this.buffer[QA-1]=dA>>>0&255,GA(this.temp,this.state,this.buffer,0,QA),this.finished=!0}for(var F0=0;F0<8;F0++)$A[F0*4+0]=this.state[F0]>>>24&255,$A[F0*4+1]=this.state[F0]>>>16&255,$A[F0*4+2]=this.state[F0]>>>8&255,$A[F0*4+3]=this.state[F0]>>>0&255;return this},i0.prototype.digest=function(){var $A=new Uint8Array(this.digestLength);return this.finish($A),$A},i0.prototype._saveState=function($A){for(var pA=0;pAthis.blockSize)new uA().update($A).finish(pA).clean();else for(var u0=0;u0<$A.length;u0++)pA[u0]=$A[u0];for(var u0=0;u01&&$A.update(i0),pA&&$A.update(pA),$A.update(u0),$A.finish(i0),u0[0]++}var LA=new Uint8Array(J.digestLength);function e0(i0,$A,pA,u0){$A===void 0&&($A=LA),u0===void 0&&(u0=32);for(var kA=new Uint8Array([1]),dA=PA($A,i0),QA=new vA(dA),F0=new Uint8Array(QA.digestLength),FA=F0.length,KA=new Uint8Array(u0),IA=0;IA>>24&255,QA[1]=l0>>>16&255,QA[2]=l0>>>8&255,QA[3]=l0>>>0&255,kA.reset(),kA.update($A),kA.update(QA),kA.finish(FA);for(var EA=0;EAJ.arrayBuffer()).then(J=>WebAssembly.instantiate(J,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,"base64"),g).then(this._init),A)}_init(J){I=J.instance,g.env.emscripten_notify_memory_growth(0)}decode(J,sA=0){if(!I)throw new Error("ZSTDDecoder: Await .init() before decoding.");const GA=J.byteLength,uA=I.exports.malloc(GA);B.set(J,uA),sA=sA||Number(I.exports.ZSTD_findDecompressedSize(uA,GA));const vA=I.exports.malloc(sA),P=I.exports.ZSTD_decompress(vA,sA,uA,GA),PA=B.slice(vA,vA+P);return I.exports.free(uA),I.exports.free(vA),PA}}const C="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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";var libsodiumWrappers={},libsodium={exports:{}},__viteBrowserExternal={},__viteBrowserExternal$1=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",default:__viteBrowserExternal}),require$$0=getAugmentedNamespace(__viteBrowserExternal$1);(function(oA,J){(function(sA){function GA(uA){var vA;(vA=uA)===void 0&&(vA={});var P=vA;typeof P.sodium!="object"&&(typeof commonjsGlobal=="object"?P=commonjsGlobal:typeof window=="object"&&(P=window)),typeof P.sodium=="object"&&typeof P.sodium.totalMemory=="number"&&(vA.TOTAL_MEMORY=P.sodium.totalMemory);var PA=vA;return vA.ready=new Promise(function(JA,LA){(R=PA).onAbort=LA,R.print=function(MA){},R.printErr=function(MA){},R.onRuntimeInitialized=function(){try{R._crypto_secretbox_keybytes(),JA()}catch(MA){LA(MA)}},R.useBackupModule=function(){return new Promise(function(MA,WA){(L={}).onAbort=WA,L.onRuntimeInitialized=function(){Object.keys(PA).forEach(function(UA){UA!=="getRandomValue"&&delete PA[UA]}),Object.keys(L).forEach(function(UA){PA[UA]=L[UA]}),MA()};var c0,L=L!==void 0?L:{},b0={};for(c0 in L)L.hasOwnProperty(c0)&&(b0[c0]=L[c0]);var K0=!1,J0=!1,st=!1,Ft=!1;K0=typeof window=="object",J0=typeof importScripts=="function",st=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",Ft=!K0&&!st&&!J0;var ut,te,Ig,ge,ee,mt="";function gB(UA){return L.locateFile?L.locateFile(UA,mt):mt+UA}st?(mt=J0?require$$0.dirname(mt)+"/":__dirname+"/",ut=function(UA,d){var S=jt(UA);return S?d?S:S.toString():(ge||(ge=require$$0),ee||(ee=require$$0),UA=ee.normalize(UA),ge.readFileSync(UA,d?null:"utf8"))},Ig=function(UA){var d=ut(UA,!0);return d.buffer||(d=new Uint8Array(d)),Le(d.buffer),d},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),oA.exports=L,L.inspect=function(){return"[Emscripten Module object]"}):Ft?(typeof read!="undefined"&&(ut=function(UA){var d=jt(UA);return d?je(d):read(UA)}),Ig=function(UA){var d;return(d=jt(UA))?d:typeof readbuffer=="function"?new Uint8Array(readbuffer(UA)):(Le(typeof(d=read(UA,"binary"))=="object"),d)},typeof scriptArgs!="undefined"&&scriptArgs,typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(K0||J0)&&(J0?mt=self.location.href:typeof document!="undefined"&&document.currentScript&&(mt=document.currentScript.src),mt=mt.indexOf("blob:")!==0?mt.substr(0,mt.lastIndexOf("/")+1):"",ut=function(UA){try{var d=new XMLHttpRequest;return d.open("GET",UA,!1),d.send(null),d.responseText}catch(G){var S=jt(UA);if(S)return je(S);throw G}},J0&&(Ig=function(UA){try{var d=new XMLHttpRequest;return d.open("GET",UA,!1),d.responseType="arraybuffer",d.send(null),new Uint8Array(d.response)}catch(G){var S=jt(UA);if(S)return S;throw G}}),te=function(UA,d,S){var G=new XMLHttpRequest;G.open("GET",UA,!0),G.responseType="arraybuffer",G.onload=function(){if(G.status==200||G.status==0&&G.response)d(G.response);else{var m=jt(UA);m?d(m.buffer):S()}},G.onerror=S,G.send(null)}),L.print;var rg,ug=L.printErr||void 0;for(c0 in b0)b0.hasOwnProperty(c0)&&(L[c0]=b0[c0]);b0=null,L.arguments&&L.arguments,L.thisProgram&&L.thisProgram,L.quit&&L.quit,L.wasmBinary&&(rg=L.wasmBinary),L.noExitRuntime&&L.noExitRuntime;var _g,Yt={Memory:function(UA){this.buffer=new ArrayBuffer(65536*UA.initial)},Module:function(UA){},Instance:function(UA,d){this.exports=function(S){for(var G,m=new Uint8Array(123),M=25;M>=0;--M)m[48+M]=52+M,m[65+M]=M,m[97+M]=26+M;function T(q,Z,nA){for(var p,lA,r=0,u=Z,OA=nA.length,xA=Z+(3*OA>>2)-(nA[OA-2]=="=")-(nA[OA-1]=="=");r>4,u>2),u>2]=u[0|RA]|u[RA+1|0]<<8|u[RA+2|0]<<16|u[RA+3|0]<<24,r[rA+4>>2]=r0,(0|(VA=VA+1|0))!=16;);for(n=V0(YA,e,64),RA=r[(t=n)>>2],VA=r[t+4>>2],E=RA,RA=(r0=r[t+32>>2])+(YA=r[t+128>>2])|0,t=($=r[t+36>>2])+r[t+132>>2]|0,t=RA>>>0>>0?t+1|0:t,YA=RA,t=t+VA|0,YA=t=(RA=E+RA|0)>>>0>>0?t+1|0:t,mA=x((VA=RA)^(u[0|(RA=e- -64|0)]|u[RA+1|0]<<8|u[RA+2|0]<<16|u[RA+3|0]<<24)^-1377402159,t^(u[RA+4|0]|u[RA+5|0]<<8|u[RA+6|0]<<16|u[RA+7|0]<<24)^1359893119,32),RA=t=h,t=t+1779033703|0,E=r0^(rA=mA-205731576|0),r0=t=rA>>>0<4089235720?t+1|0:t,z=x(E,$^t,24),tA=t=h,NA=RA,E=mA,t=t+YA|0,t=(t=(mA=z+VA|0)>>>0>>0?t+1|0:t)+(w=o=r[n+140>>2])|0,E=x(E^(y=VA=(RA=r[n+136>>2])+mA|0),(F=mA>>>0>y>>>0?t+1|0:t)^NA,16),t=r0+(yA=h)|0,w=x((N=VA=rA+E|0)^z,(YA=rA>>>0>N>>>0?t+1|0:t)^tA,63),D=h,rA=r[n+12>>2],VA=(z=r[n+144>>2])+($=r0=r[n+40>>2])|0,t=(SA=r[n+148>>2])+(NA=r[n+44>>2])|0,t=VA>>>0<$>>>0?t+1|0:t,$=VA,t=t+rA|0,t=(VA=VA+r[n+8>>2]|0)>>>0<$>>>0?t+1|0:t,mA=x(VA^(u[e+72|0]|u[e+73|0]<<8|u[e+74|0]<<16|u[e+75|0]<<24)^725511199,(u[e+76|0]|u[e+77|0]<<8|u[e+78|0]<<16|u[e+79|0]<<24)^t^-1694144372,32),NA=x(s=(rA=mA-2067093701|0)^r0,NA^(tA=(r0=h)-((mA>>>0<2067093701)+1150833018|0)|0),24),v=r[n+156>>2],s=NA,t=t+($=h)|0,t=(t=(NA=NA+VA|0)>>>0>>0?t+1|0:t)+v|0,h0=x((c=VA=NA+r[n+152>>2]|0)^mA,(b=NA>>>0>c>>>0?t+1|0:t)^r0,16),t=tA+(W=h)|0,d0=VA=rA+h0|0,mA=x(s^VA,(rA=rA>>>0>VA>>>0?t+1|0:t)^$,63),tA=h,r0=r[n+20>>2],VA=(gA=r[n+160>>2])+(NA=r[n+48>>2])|0,t=(B0=r[n+164>>2])+(Y=r[n+52>>2])|0,$=VA,t=(t=VA>>>0>>0?t+1|0:t)+r0|0,eA=VA=VA+r[n+16>>2]|0,VA=VA>>>0<$>>>0?t+1|0:t,U=x(eA^(u[e+80|0]|u[e+81|0]<<8|u[e+82|0]<<16|u[e+83|0]<<24)^-79577749,VA^(u[e+84|0]|u[e+85|0]<<8|u[e+86|0]<<16|u[e+87|0]<<24)^528734635,32),r0=t=h,t=t+1013904242|0,s=NA^($=U-23791573|0),NA=t=$>>>0<4271175723?t+1|0:t,t=x(s,Y^t,24),v=r0,a=r[n+172>>2],s=t,_=U,U=t,eA=t+eA|0,t=(Y=h)+VA|0,t=(t=U>>>0>eA>>>0?t+1|0:t)+(wA=a)|0,cA=x(_^(l=VA=(r0=r[n+168>>2])+(U=eA)|0),(wA=U>>>0>l>>>0?t+1|0:t)^v,16),t=NA+(hA=h)|0,Y=x(s^(V=VA=$+cA|0),(NA=V>>>0<$>>>0?t+1|0:t)^Y,63),v=h,U=r[n+28>>2],$=(VA=r[n+176>>2])+(i=eA=r[n+56>>2])|0,t=(S0=r[n+180>>2])+(H=r[n+60>>2])|0,t=(t=i>>>0>$>>>0?t+1|0:t)+U|0,t=(i=$)>>>0>(AA=$=i+r[n+24>>2]|0)>>>0?t+1|0:t,aA=x(AA^(u[e+88|0]|u[e+89|0]<<8|u[e+90|0]<<16|u[e+91|0]<<24)^327033209,t^(u[e+92|0]|u[e+93|0]<<8|u[e+94|0]<<16|u[e+95|0]<<24)^1541459225,32),U=x(_=(s=(U=aA)+1595750129|0)^eA,H^(eA=($=h)-((U>>>0<2699217167)+1521486533|0)|0),24),H=eA,O=$,eA=r[n+188>>2],_=U,fA=s,t=(i=h)+t|0,t=(t=(AA=U+AA|0)>>>0>>0?t+1|0:t)+(iA=eA)|0,XA=U=($=r[n+184>>2])+AA|0,s=x(U^aA,(s=O)^(O=U>>>0>>0?t+1|0:t),16),t=(t=H)+(H=h)|0,AA=U=fA+s|0,aA=i,i=t=U>>>0>>0?t+1|0:t,_=x(_^U,aA^t,63),U=h,aA=tA,fA=mA,bA=V,t=tA+F|0,tA=y=y+mA|0,t=(t=y>>>0>>0?t+1|0:t)+(iA=j=r[n+196>>2])|0,V=x((y=mA=(zA=r[n+192>>2])+y|0)^s,(mA=tA>>>0>y>>>0?t+1|0:t)^H,32),t=(t=NA)+(NA=h)|0,F=t=(tA=bA+(F=V)|0)>>>0>>0?t+1|0:t,t=x(fA^tA,t^aA,24),w0=r[n+204>>2],fA=t,s=V,H=y,y=t,V=H+t|0,t=(H=h)+mA|0,t=(t=y>>>0>V>>>0?t+1|0:t)+(iA=w0)|0,o0=mA=(aA=r[n+200>>2])+(y=V)|0,I0=x(s^mA,(y=y>>>0>mA>>>0?t+1|0:t)^NA,16),t=F+(V=h)|0,iA=x(fA^(s=NA=tA+I0|0),(F=H)^(H=tA>>>0>s>>>0?t+1|0:t),63),F=h,NA=v,bA=Y,t=v+b|0,t=(t=(tA=Y+c|0)>>>0>>0?t+1|0:t)+(fA=CA=r[n+212>>2])|0,c=x((_A=E)^(E=tA=(mA=r[n+208>>2])+(Y=tA)|0),(Y=Y>>>0>E>>>0?t+1|0:t)^yA,32),t=i+(tA=h)|0,NA=x(bA^(v=AA+c|0),(t=v>>>0>>0?t+1|0:t)^NA,24),yA=t,b=tA,g0=r[n+220>>2],bA=NA,_A=v,t=(v=h)+Y|0,t=(t=(i=E+NA|0)>>>0>>0?t+1|0:t)+(fA=g0)|0,b=x((i=NA=(tA=r[n+216>>2])+(Y=i)|0)^c,(AA=Y>>>0>i>>>0?t+1|0:t)^b,16),t=(E=h)+yA|0,X=NA=_A+(Y=b)|0,fA=x(bA^NA,(Y=Y>>>0>NA>>>0?t+1|0:t)^v,63),v=h,yA=U,bA=_,t=U+wA|0,t=(t=(_=_+l|0)>>>0>>0?t+1|0:t)+(c=f=r[n+228>>2])|0,_=x((wA=U=(NA=r[n+224>>2])+_|0)^h0,(U=U>>>0<_>>>0?t+1|0:t)^W,32),t=(W=h)+YA|0,N=l=N+_|0,YA=x(bA^l,(t=l>>>0<_>>>0?t+1|0:t)^yA,24),l=t,bA=r[n+236>>2],c=YA,t=(yA=h)+U|0,t=(t=(wA=wA+YA|0)>>>0>>0?t+1|0:t)+bA|0,n0=x((wA=YA=(t0=r[n+232>>2])+(U=wA)|0)^_,(YA=W)^(W=U>>>0>wA>>>0?t+1|0:t),16),t=(t=l)+(l=h)|0,U=x(c^(_=YA=(U=n0)+N|0),(N=U>>>0>_>>>0?t+1|0:t)^yA,63),yA=h,c=D,ZA=w,E0=d0,t=D+O|0,t=(t=(d0=w+XA|0)>>>0>>0?t+1|0:t)+(_A=h0=r[n+244>>2])|0,D=t=(w=(YA=r[n+240>>2])+(D=d0)|0)>>>0>>0?t+1|0:t,cA=x(w^cA,t^hA,32),t=(t=rA)+(rA=h)|0,XA=hA=E0+(O=cA)|0,c=x(ZA^hA,(t=O>>>0>hA>>>0?t+1|0:t)^c,24),ZA=E0=h,hA=t,O=rA,Y0=c,t=D+E0|0,t=(t=(c=w+c|0)>>>0>>0?t+1|0:t)+(d0=r[n+252>>2])|0,c=w=(rA=r[n+248>>2])+(D=c)|0,_A=x(w^cA,(_A=O)^(O=w>>>0>>0?t+1|0:t),16),t=(t=hA)+(hA=h)|0,cA=x(Y0^(E0=w=(D=_A)+XA|0),(w=w>>>0>>0?t+1|0:t)^ZA,63),ZA=t=h,D=t,Y0=b,t=y+h0|0,t=(t=(b=YA)>>>0>(XA=b+o0|0)>>>0?t+1|0:t)+D|0,XA=x(Y0^(D=b=(y=XA)+cA|0),(b=y>>>0>D>>>0?t+1|0:t)^E,32),t=N+(y=h)|0,_=t=(E=_+XA|0)>>>0<_>>>0?t+1|0:t,o0=cA=x(cA^E,ZA^t,24),ZA=t=h,N=t,T0=cA,t=b+CA|0,t=(t=(cA=D+mA|0)>>>0>>0?t+1|0:t)+N|0,o0=D=o0+(b=cA)|0,Y0=x(D^XA,(N=y)^(y=D>>>0>>0?t+1|0:t),16),t=_+(N=h)|0,_=t=(D=E+Y0|0)>>>0>>0?t+1|0:t,cA=x(T0^(E=D),t^ZA,63),b=h,XA=iA,t=B0+(D=F)|0,t=(t=(iA=gA+iA|0)>>>0>>0?t+1|0:t)+AA|0,gA=t=(F=i+iA|0)>>>0>>0?t+1|0:t,AA=x(F^n0,t^l,32),t=(t=w)+(w=h)|0,t=(l=(i=AA)+E0|0)>>>0>>0?t+1|0:t,i=D,D=t,iA=x(XA^l,i^t,24),B0=t=h,i=t,XA=AA,t=gA+j|0,t=(t=(AA=F+zA|0)>>>0>>0?t+1|0:t)+i|0,t=(F=(gA=AA)+iA|0)>>>0>>0?t+1|0:t,gA=F,i=t,n0=x(XA^F,t^w,16),t=D+(AA=h)|0,E0=w=l+n0|0,iA=x(w^iA,(D=w>>>0>>0?t+1|0:t)^B0,63),w=h,F=v,t=v+w0|0,t=(t=(l=aA+fA|0)>>>0>>0?t+1|0:t)+W|0,hA=x((aA=v=l+wA|0)^_A,(v=v>>>0>>0?t+1|0:t)^hA,32),t=H+(W=h)|0,t=s>>>0>(l=s+hA|0)>>>0?t+1|0:t,s=F,F=t,s=H=x(l^fA,s^t,24),fA=t=h,wA=t,XA=hA,t=v+d0|0,t=(t=(H=(hA=rA)+aA|0)>>>0>>0?t+1|0:t)+wA|0,_A=v=s+H|0,ZA=x(XA^v,(hA=W)^(W=v>>>0>>0?t+1|0:t),16),t=F+(wA=h)|0,fA=x((aA=v=l+ZA|0)^s,(v=v>>>0>>0?t+1|0:t)^fA,63),F=h,s=U,t=(l=yA)+bA|0,t=(t=(hA=U+t0|0)>>>0>>0?t+1|0:t)+O|0,H=x((hA=U=c+hA|0)^I0,(U=U>>>0>>0?t+1|0:t)^V,32),t=(t=Y)+(Y=h)|0,V=x(s^(O=yA=H+X|0),(t=yA>>>0>>0?t+1|0:t)^l,24),c=yA=h,l=t,XA=O,O=H,H=(t=hA)+(hA=VA)|0,t=U+S0|0,t=(t=H>>>0>>0?t+1|0:t)+yA|0,hA=U=H+(s=V)|0,H=t=U>>>0>>0?t+1|0:t,O=x(O^U,t^Y,16),t=(yA=h)+l|0,XA=x(V^(s=Y=XA+(U=O)|0),(U=s>>>0>>0?t+1|0:t)^c,63),Y=h,l=w,V=aA,c=O,t=y+o|0,t=(t=(O=RA)>>>0>(aA=O+o0|0)>>>0?t+1|0:t)+w|0,aA=x(c^(w=O=aA+iA|0),(y=yA)^(yA=w>>>0>>0?t+1|0:t),32),t=(t=v)+(v=h)|0,t=(y=aA)>>>0>(O=V+y|0)>>>0?t+1|0:t,c=V=x((y=O)^iA,t^l,24),iA=l=h,O=t,o0=aA,t=yA+f|0,t=(t=(aA=w+NA|0)>>>0>>0?t+1|0:t)+l|0,l=w=(yA=aA)+V|0,I0=x(o0^w,(aA=w>>>0>>0?t+1|0:t)^v,16),t=(t=O)+(O=h)|0,y=w=(v=I0)+y|0,B0=x(w^c,(V=w>>>0>>0?t+1|0:t)^iA,63),v=h,iA=s,t=i+(w=F)|0,t=(t=(yA=gA+fA|0)>>>0>>0?t+1|0:t)+(c=X=r[n+132>>2])|0,yA=t=(F=(s=r[n+128>>2])+yA|0)>>>0>>0?t+1|0:t,i=x(F^Y0,t^N,32),t=(t=U)+(U=h)|0,N=gA=iA+i|0,iA=c=x(gA^fA,(t=gA>>>0>>0?t+1|0:t)^w,24),fA=w=h,gA=t,o0=i,t=yA+SA|0,yA=i=z+F|0,t=(t=i>>>0>>0?t+1|0:t)+w|0,w=x(o0^(i=F=i+c|0),(w=U)^(U=i>>>0>>0?t+1|0:t),16),t=(t=gA)+(gA=h)|0,N=F=w+N|0,w0=x(F^iA,(c=F>>>0>>0?t+1|0:t)^fA,63),F=h,yA=Y,t=W+g0|0,t=(t=(fA=tA+_A|0)>>>0>>0?t+1|0:t)+Y|0,t=(W=(iA=fA)+XA|0)>>>0>>0?t+1|0:t,iA=W,Y=t,fA=x(W^n0,t^AA,32),t=_+(W=h)|0,t=E>>>0>(AA=E+fA|0)>>>0?t+1|0:t,XA=_=x((E=AA)^XA,t^yA,24),o0=yA=h,AA=t,_A=E,t=Y+eA|0,t=(E=$)>>>0>(_=E+iA|0)>>>0?t+1|0:t,E=_,t=t+yA|0,_=W,W=t=E>>>0>(Y=XA+E|0)>>>0?t+1|0:t,n0=x((E=Y)^fA,_^t,16),t=(Y=h)+AA|0,XA=x((AA=yA=_A+(_=n0)|0)^XA,(t=_>>>0>AA>>>0?t+1|0:t)^o0,63),yA=h,iA=t,fA=w,_A=cA,t=a+(_=b)|0,t=(t=(w=r0)>>>0>(cA=w+cA|0)>>>0?t+1|0:t)+H|0,b=w=hA+cA|0,H=x(w^ZA,(H=wA)^(wA=w>>>0>>0?t+1|0:t),32),t=(w=h)+D|0,o0=hA=H+E0|0,_=x(_A^hA,(t=hA>>>0>>0?t+1|0:t)^_,24),ZA=E0=h,D=t,hA=w,E0=_,_A=H,t=wA+ZA|0,t=(t=(H=_+b|0)>>>0>>0?t+1|0:t)+(cA=r[n+156>>2])|0,wA=b=(w=r[n+152>>2])+H|0,_=hA,hA=t=b>>>0>>0?t+1|0:t,_A=x(_A^b,_^t,16),t=(t=D)+(D=h)|0,_=t=(H=_A)>>>0>(b=H+o0|0)>>>0?t+1|0:t,o0=x(E0^(H=b),t^ZA,63),E0=t=h,b=t,ZA=AA,t=aA+g0|0,t=(t=(AA=l+tA|0)>>>0>>0?t+1|0:t)+b|0,b=l=AA+o0|0,fA=x(l^fA,(aA=gA)^(gA=l>>>0>>0?t+1|0:t),32),t=(l=h)+iA|0,aA=t=(AA=ZA+(aA=fA)|0)>>>0>>0?t+1|0:t,E0=o0=x(o0^AA,E0^t,24),ZA=t=h,iA=t,Y0=fA,t=gA+j|0,t=(t=(fA=b+zA|0)>>>0>>0?t+1|0:t)+iA|0,t=(b=(gA=fA)+o0|0)>>>0>>0?t+1|0:t,gA=b,iA=l,l=t,o0=x(Y0^b,iA^t,16),t=aA+(iA=h)|0,t=(b=AA+o0|0)>>>0>>0?t+1|0:t,AA=b,aA=t,zA=x(b^E0,t^ZA,63),b=h,fA=v,ZA=B0,t=v+f|0,t=U+(NA>>>0>(B0=NA+B0|0)>>>0?t+1|0:t)|0,j=v=i+B0|0,B0=x(v^n0,(U=Y)^(Y=v>>>0>>0?t+1|0:t),32),t=_+(v=h)|0,i=t=(U=H+B0|0)>>>0>>0?t+1|0:t,fA=_=x(ZA^U,t^fA,24),n0=t=h,H=t,t=Y+X|0,t=(t=(_=s+j|0)>>>0>>0?t+1|0:t)+H|0,j=Y=fA+(s=_)|0,B0=x(Y^B0,(H=Y>>>0>>0?t+1|0:t)^v,16),t=i+(s=h)|0,X=Y=U+B0|0,_=x(Y^fA,(U=Y>>>0>>0?t+1|0:t)^n0,63),Y=h,t=a+(v=F)|0,t=W+((i=r0)>>>0>(fA=i+w0|0)>>>0?t+1|0:t)|0,i=D,D=t=E>>>0>(F=E+fA|0)>>>0?t+1|0:t,fA=x((E=F)^_A,i^t,32),t=V+(F=h)|0,t=y>>>0>(W=y+fA|0)>>>0?t+1|0:t,y=v,v=t,y=x(W^w0,y^t,24),w0=t=h,i=t,ZA=y,t=D+SA|0,t=(t=(y=z)>>>0>(V=y+E|0)>>>0?t+1|0:t)+i|0,n0=D=ZA+(y=V)|0,_A=x(D^fA,(i=D>>>0>>0?t+1|0:t)^F,16),t=v+(y=h)|0,fA=D=W+_A|0,V=x(ZA^D,(F=D>>>0>>0?t+1|0:t)^w0,63),D=h,t=d0+(v=yA)|0,t=hA+((E=(W=rA)+XA|0)>>>0>>0?t+1|0:t)|0,W=t=(yA=wA+E|0)>>>0>>0?t+1|0:t,E=x(yA^I0,t^O,32),t=c+(wA=h)|0,O=v,v=t=N>>>0>(hA=N+E|0)>>>0?t+1|0:t,N=x(hA^XA,O^t,24),XA=t=h,O=t,ZA=E,t=W+bA|0,t=(t=(E=yA+t0|0)>>>0>>0?t+1|0:t)+O|0,E=x(ZA^(O=yA=E+(c=N)|0),(c=wA)^(wA=E>>>0>O>>>0?t+1|0:t),16),t=v+(W=h)|0,N=x(N^(c=yA=hA+E|0),(yA=c>>>0>>0?t+1|0:t)^XA,63),v=h,hA=Y,XA=_,ZA=E,t=l+CA|0,l=E=gA+mA|0,t=(t=E>>>0>>0?t+1|0:t)+Y|0,_=x(ZA^(E=gA=E+_|0),(Y=l>>>0>E>>>0?t+1|0:t)^W,32),t=(t=F)+(F=h)|0,gA=t=(W=_+fA|0)>>>0<_>>>0?t+1|0:t,fA=hA=x(XA^W,t^hA,24),XA=t=h,l=t,t=Y+h0|0,t=(t=(E=(hA=YA)+E|0)>>>0>>0?t+1|0:t)+l|0,w0=Y=fA+E|0,I0=x(Y^_,(l=Y>>>0>>0?t+1|0:t)^F,16),t=gA+(hA=h)|0,fA=x((E0=Y=W+I0|0)^fA,(Y=Y>>>0>>0?t+1|0:t)^XA,63),F=h,W=D,_=V,t=H+cA|0,t=(t=(V=w+j|0)>>>0>>0?t+1|0:t)+D|0,D=t=(H=V)>>>0>(gA=_+H|0)>>>0?t+1|0:t,V=x((H=gA)^o0,t^iA,32),t=(t=yA)+(yA=h)|0,t=(E=V)>>>0>(gA=E+c|0)>>>0?t+1|0:t,c=_=x(_^(E=gA),t^W,24),gA=t,iA=E,E=V,V=(t=H)+(H=VA)|0,t=D+S0|0,t=(t=H>>>0>V>>>0?t+1|0:t)+(W=h)|0,t=(D=(H=V)+_|0)>>>0>>0?t+1|0:t,H=D,V=t,E=x(E^D,t^yA,16),t=(_=h)+gA|0,yA=x((o0=D=iA+E|0)^c,(D=D>>>0>>0?t+1|0:t)^W,63),W=h,gA=v,iA=N,t=i+eA|0,t=(t=(c=(N=$)+n0|0)>>>0>>0?t+1|0:t)+v|0,N=i=iA+c|0,v=t=i>>>0>>0?t+1|0:t,c=x(i^B0,t^s,32),t=aA+(i=h)|0,aA=s=AA+c|0,iA=s=x(iA^s,(t=s>>>0>>0?t+1|0:t)^gA,24),j=gA=h,AA=t,XA=aA,t=v+o|0,t=(t=(s=(aA=RA)+N|0)>>>0>>0?t+1|0:t)+gA|0,t=(v=iA+s|0)>>>0>>0?t+1|0:t,aA=v,s=i,i=t,n0=x(v^c,s^t,16),t=(t=AA)+(AA=h)|0,iA=x((v=XA+(gA=n0)|0)^iA,(t=v>>>0>>0?t+1|0:t)^j,63),gA=h,N=v,c=t,t=wA+(s=b)|0,b=v=O+zA|0,t=(t=v>>>0>>0?t+1|0:t)+(j=r[n+204>>2])|0,b=t=(v=(XA=r[n+200>>2])+v|0)>>>0>>0?t+1|0:t,O=x(v^_A,t^y,32),t=(t=U)+(U=h)|0,t=(y=O)>>>0>(wA=y+X|0)>>>0?t+1|0:t,s=x((y=wA)^zA,t^s,24),_A=X=h,wA=t,ZA=y,X=O,t=b+_A|0,t=(t=(O=v+s|0)>>>0>>0?t+1|0:t)+(zA=r[n+164>>2])|0,O=v=(B0=r[n+160>>2])+(b=O)|0,X=x(X^v,(y=v>>>0>>0?t+1|0:t)^U,16),t=(t=wA)+(wA=h)|0,s=x(s^(ZA=v=ZA+(U=X)|0),(v=v>>>0>>0?t+1|0:t)^_A,63),_A=t=h,U=t,Y0=E,t=l+eA|0,t=(t=(E=(b=$)+w0|0)>>>0>>0?t+1|0:t)+U|0,_=x(Y0^(U=b=E+s|0),(b=E>>>0>U>>>0?t+1|0:t)^_,32),t=(l=h)+c|0,N=E=N+_|0,c=x(s^E,(t=E>>>0<_>>>0?t+1|0:t)^_A,24),_A=s=h,E=t,w0=N,Y0=_,t=b+j|0,t=(t=(_=U+XA|0)>>>0>>0?t+1|0:t)+s|0,N=U=_+c|0,Y0=x(Y0^U,(s=l)^(l=U>>>0<_>>>0?t+1|0:t),16),t=(s=h)+E|0,w0=x((T0=U=w0+(b=Y0)|0)^c,(U=U>>>0>>0?t+1|0:t)^_A,63),b=h,t=cA+(E=F)|0,t=(t=(_=w+fA|0)>>>0>>0?t+1|0:t)+V|0,_=x((V=w=_+H|0)^n0,(w=w>>>0>>0?t+1|0:t)^AA,32),t=(t=v)+(v=h)|0,H=t=_>>>0>(F=_+ZA|0)>>>0?t+1|0:t,c=E=x(F^fA,t^E,24),fA=t=h,AA=t,E=(t=V)+(V=RA)|0,t=w+o|0,t=(t=E>>>0>>0?t+1|0:t)+AA|0,cA=w=c+E|0,n0=x(w^_,(AA=w>>>0>>0?t+1|0:t)^v,16),t=H+(V=h)|0,_A=w=F+n0|0,E=x(w^c,(v=w>>>0>>0?t+1|0:t)^fA,63),w=h,_=yA,t=(F=W)+bA|0,t=(t=(H=yA+t0|0)>>>0>>0?t+1|0:t)+i|0,W=t=(yA=H+aA|0)>>>0>>0?t+1|0:t,i=x(yA^X,t^wA,32),t=(t=Y)+(Y=h)|0,t=(H=i)>>>0>(wA=H+E0|0)>>>0?t+1|0:t,aA=x(_^(H=wA),t^F,24),c=F=h,wA=t,fA=H,bA=i,t=W+f|0,W=i=yA+NA|0,t=(t=i>>>0>>0?t+1|0:t)+F|0,X=x(bA^(i=yA=i+(_=aA)|0),(H=W>>>0>i>>>0?t+1|0:t)^Y,16),t=(t=wA)+(wA=h)|0,c=x(aA^(_=Y=fA+(F=X)|0),(F=_>>>0>>0?t+1|0:t)^c,63),Y=h,yA=gA,t=gA+g0|0,t=(t=(aA=tA+iA|0)>>>0>>0?t+1|0:t)+y|0,t=(W=O+aA|0)>>>0>>0?t+1|0:t,O=W,W=t,aA=x(O^I0,t^hA,32),t=(t=D)+(D=h)|0,y=yA,yA=t=(gA=(hA=aA)+o0|0)>>>0>>0?t+1|0:t,iA=y=x(gA^iA,y^t,24),fA=t=h,hA=t,bA=aA,aA=(t=O)+(O=YA)|0,t=W+h0|0,t=(t=O>>>0>aA>>>0?t+1|0:t)+hA|0,hA=W=(O=aA)+y|0,y=x(bA^W,(O=W>>>0>>0?t+1|0:t)^D,16),t=yA+(W=h)|0,t=(D=gA+y|0)>>>0>>0?t+1|0:t,gA=D,aA=t,iA=x(D^iA,t^fA,63),D=h,yA=w,fA=E,bA=y,t=l+SA|0,t=(t=(E=(y=z)+N|0)>>>0>>0?t+1|0:t)+w|0,w=t=E>>>0>(l=fA+E|0)>>>0?t+1|0:t,y=x(bA^l,t^W,32),t=(t=F)+(F=h)|0,t=(E=y)>>>0>(W=E+_|0)>>>0?t+1|0:t,N=_=x(fA^(E=W),t^yA,24),W=t,fA=y,y=(t=l)+(l=VA)|0,t=w+S0|0,t=(t=y>>>0>>0?t+1|0:t)+(yA=h)|0,l=w=y+_|0,y=t=w>>>0>>0?t+1|0:t,w=(F=I0=x(fA^w,t^F,16))+E|0,t=(E=h)+W|0,_=w,bA=x(W=w^N,(N=w>>>0>>0?t+1|0:t)^yA,63),yA=h,t=AA+a|0,t=(t=(F=r0)>>>0>(W=F+cA|0)>>>0?t+1|0:t)+(w=Y)|0,AA=F=W+c|0,s=x(F^Y0,(Y=F>>>0>>0?t+1|0:t)^s,32),t=aA+(F=h)|0,t=(W=gA+s|0)>>>0>>0?t+1|0:t,gA=W,aA=x(W^c,t^w,24),fA=w=h,W=t,cA=gA,t=Y+CA|0,t=(gA=mA)>>>0>(AA=gA+AA|0)>>>0?t+1|0:t,gA=AA,t=t+w|0,AA=Y=AA+(c=aA)|0,Y=x(Y^s,(aA=Y>>>0>>0?t+1|0:t)^F,16),t=(gA=h)+W|0,E0=w=cA+Y|0,t0=x(w^c,(F=w>>>0>>0?t+1|0:t)^fA,63),W=h,fA=iA,t=H+zA|0,t=(t=(s=i+B0|0)>>>0>>0?t+1|0:t)+(w=D)|0,c=x((D=i=s+iA|0)^n0,(i=s>>>0>D>>>0?t+1|0:t)^V,32),t=(t=U)+(U=h)|0,iA=H=(V=c)+T0|0,s=x(fA^H,(t=H>>>0>>0?t+1|0:t)^w,24),H=w=h,V=t,fA=s,t=i+w|0,t=(t=(s=D+s|0)>>>0>>0?t+1|0:t)+(cA=r[n+132>>2])|0,i=D=(w=r[n+128>>2])+s|0,s=t=D>>>0>>0?t+1|0:t,n0=x(D^c,t^U,16),t=(t=V)+(V=h)|0,o0=x(fA^(D=(U=n0)+iA|0),(t=D>>>0>>0?t+1|0:t)^H,63),U=h,c=D,iA=t,fA=Y,t=d0+(H=b)|0,t=(t=(D=(Y=rA)+w0|0)>>>0>>0?t+1|0:t)+O|0,hA=x((D=Y=D+hA|0)^X,(b=D>>>0>>0?t+1|0:t)^wA,32),t=(Y=h)+v|0,t=(O=hA)>>>0>(wA=O+_A|0)>>>0?t+1|0:t,H=x((O=wA)^w0,t^H,24),ZA=_A=h,v=t,wA=Y,X=hA,t=b+_A|0,t=(t=(hA=D+H|0)>>>0>>0?t+1|0:t)+(w0=r[n+196>>2])|0,hA=D=(Y=r[n+192>>2])+(b=hA)|0,X=x(X^D,(_A=wA)^(wA=D>>>0>>0?t+1|0:t),16),t=(t=v)+(v=h)|0,H=x(H^(_A=D=(b=X)+O|0),(D=D>>>0>>0?t+1|0:t)^ZA,63),ZA=t=h,b=t,t=y+j|0,t=(t=(O=l+XA|0)>>>0>>0?t+1|0:t)+b|0,t=(l=O+H|0)>>>0>>0?t+1|0:t,O=l,b=t,y=x(l^fA,t^gA,32),t=(gA=h)+iA|0,c=l=c+y|0,iA=x(H^l,(t=l>>>0>>0?t+1|0:t)^ZA,24),j=l=h,H=t,fA=y,t=b+cA|0,t=(t=(y=w+O|0)>>>0>>0?t+1|0:t)+l|0,XA=b=y+iA|0,ZA=x(fA^b,(l=b>>>0>>0?t+1|0:t)^gA,16),t=(t=H)+(H=h)|0,O=b=(gA=ZA)+c|0,j=x(b^iA,(y=b>>>0>>0?t+1|0:t)^j,63),gA=h,t=a+(b=yA)|0,t=aA+((c=r0)>>>0>(iA=c+bA|0)>>>0?t+1|0:t)|0,AA=t=(yA=AA+iA|0)>>>0>>0?t+1|0:t,c=x(yA^n0,t^V,32),t=(t=D)+(D=h)|0,t=(V=c)>>>0>(aA=V+_A|0)>>>0?t+1|0:t,V=b,b=t,iA=x(aA^bA,V^t,24),bA=t=h,V=t,fA=c,t=AA+eA|0,t=(t=(c=yA+$|0)>>>0>>0?t+1|0:t)+V|0,V=t=(yA=(AA=c)+iA|0)>>>0>>0?t+1|0:t,n0=x(fA^(AA=yA),t^D,16),t=b+(c=h)|0,_A=D=aA+n0|0,iA=x(D^iA,(yA=D>>>0>>0?t+1|0:t)^bA,63),D=h,b=W,t=W+SA|0,t=s+(z>>>0>(fA=z+t0|0)>>>0?t+1|0:t)|0,s=v,v=t=i>>>0>(W=i+fA|0)>>>0?t+1|0:t,fA=x(W^X,s^t,32),t=N+(i=h)|0,s=b,b=t=_>>>0>(aA=_+fA|0)>>>0?t+1|0:t,N=_=x(aA^t0,s^t,24),s=t=h,t=v+zA|0,t=(t=(_=W+B0|0)>>>0>>0?t+1|0:t)+s|0,zA=v=N+_|0,B0=x(v^fA,(W=v>>>0<_>>>0?t+1|0:t)^i,16),t=b+(i=h)|0,t0=v=aA+B0|0,_=x(v^N,(b=v>>>0>>0?t+1|0:t)^s,63),v=h,aA=U,t=U+CA|0,t=wA+((s=mA)>>>0>(N=s+o0|0)>>>0?t+1|0:t)|0,E=x((s=U=hA+N|0)^I0,(U=s>>>0>>0?t+1|0:t)^E,32),t=(t=F)+(F=h)|0,fA=aA=x((N=wA=E+E0|0)^o0,(t=E>>>0>N>>>0?t+1|0:t)^aA,24),bA=wA=h,hA=t,t=U+d0|0,t=(t=(s=(aA=rA)+s|0)>>>0>>0?t+1|0:t)+wA|0,wA=U=fA+s|0,E=x(U^E,(aA=U>>>0>>0?t+1|0:t)^F,16),t=(t=hA)+(hA=h)|0,o0=U=E+N|0,fA=x(U^fA,(F=U>>>0>>0?t+1|0:t)^bA,63),U=h,bA=iA,X=E,t=l+h0|0,t=(t=(E=YA)>>>0>(N=E+XA|0)>>>0?t+1|0:t)+(s=D)|0,D=t=(E=N)>>>0>(l=E+iA|0)>>>0?t+1|0:t,N=x(X^(E=l),t^hA,32),t=(t=b)+(b=h)|0,iA=l=(hA=N)+t0|0,bA=s=x(bA^l,(t=l>>>0>>0?t+1|0:t)^s,24),t0=l=h,hA=t,t=D+o|0,t=(t=(E=(s=RA)+E|0)>>>0>>0?t+1|0:t)+l|0,I0=D=bA+E|0,X=x(D^N,(s=b)^(b=D>>>0>>0?t+1|0:t),16),t=(l=h)+hA|0,hA=D=(s=X)+iA|0,bA=x(D^bA,(s=D>>>0>>0?t+1|0:t)^t0,63),D=h,iA=_,t=V+g0|0,V=_=tA+AA|0,t=(t=_>>>0>>0?t+1|0:t)+(E=v)|0,N=x((_=AA=iA+_|0)^ZA,(v=_>>>0>>0?t+1|0:t)^H,32),t=(t=F)+(F=h)|0,AA=t=(H=(AA=N)+o0|0)>>>0>>0?t+1|0:t,iA=E=x(iA^H,t^E,24),t0=t=h,V=t,t=v+f|0,t=(t=(E=NA)>>>0>(_=E+_|0)>>>0?t+1|0:t)+V|0,V=v=iA+(E=_)|0,F=x(v^N,(E=v>>>0>>0?t+1|0:t)^F,16),t=AA+(_=h)|0,t=(v=H+F|0)>>>0>>0?t+1|0:t,H=v,AA=t,t0=x(v^iA,t^t0,63),v=h,N=U,XA=fA,t=W+S0|0,t=(t=(iA=VA)>>>0>(fA=iA+zA|0)>>>0?t+1|0:t)+U|0,t=(W=XA+(iA=fA)|0)>>>0>>0?t+1|0:t,iA=W,U=t,fA=x(W^n0,t^c,32),t=y+(W=h)|0,y=t=(c=O+fA|0)>>>0>>0?t+1|0:t,c=x(XA^(O=c),t^N,24),XA=t=h,N=t,t=U+w0|0,t=(t=(iA=Y+iA|0)>>>0>>0?t+1|0:t)+N|0,N=U=(zA=c)+(c=iA)|0,o0=x(U^fA,(iA=W)^(W=U>>>0>>0?t+1|0:t),16),t=y+(c=h)|0,t=(U=O+o0|0)>>>0>>0?t+1|0:t,O=U,zA=x(U^zA,t^XA,63),U=h,iA=t,ZA=j,t=aA+(y=gA)|0,t=(t=(j=wA+j|0)>>>0>>0?t+1|0:t)+(XA=n0=r[n+156>>2])|0,wA=t=(gA=(fA=r[n+152>>2])+(wA=j)|0)>>>0>>0?t+1|0:t,aA=x(gA^B0,t^i,32),t=(t=yA)+(yA=h)|0,j=i=aA+_A|0,XA=y=x(ZA^i,(t=i>>>0>>0?t+1|0:t)^y,24),_A=B0=h,i=t,ZA=E0=r[n+236>>2],E0=j,j=aA,t=wA+_A|0,t=(t=(y=y+gA|0)>>>0>>0?t+1|0:t)+ZA|0,t=(gA=(aA=r[n+232>>2])+y|0)>>>0>>0?t+1|0:t,y=yA,yA=t,B0=x(j^gA,y^t,16),t=(wA=h)+i|0,XA=x((i=y=E0+(j=B0)|0)^XA,(y=y>>>0>>0?t+1|0:t)^_A,63),_A=t=h,j=t,E0=F,t=b+SA|0,t=(t=(F=z+I0|0)>>>0>>0?t+1|0:t)+j|0,_=x(E0^(j=z=F+XA|0),(z=z>>>0>>0?t+1|0:t)^_,32),t=(F=h)+iA|0,iA=b=O+_|0,SA=x(XA^b,_A^(t=b>>>0<_>>>0?t+1|0:t),24),I0=b=h,O=t,XA=iA,_A=_,t=z+f|0,t=(t=(_=NA)>>>0>(iA=_+j|0)>>>0?t+1|0:t)+b|0,_A=x(_A^(b=z=(_=iA)+SA|0),(_=_>>>0>b>>>0?t+1|0:t)^F,16),t=(t=O)+(O=h)|0,iA=z=XA+(F=_A)|0,XA=x(z^SA,(j=z>>>0>>0?t+1|0:t)^I0,63),F=h,z=D,E0=bA,t=D+S0|0,t=E+(VA>>>0>(bA=VA+bA|0)>>>0?t+1|0:t)|0,c=x((SA=D=V+bA|0)^o0,(D=D>>>0>>0?t+1|0:t)^c,32),t=y+(V=h)|0,t=(E=i+c|0)>>>0>>0?t+1|0:t,i=E,y=z,z=t,bA=E=x(E0^E,y^t,24),o0=t=h,y=t,E0=E,I0=c,t=D+CA|0,t=(t=(E=mA)>>>0>(c=E+SA|0)>>>0?t+1|0:t)+y|0,bA=D=bA+(E=c)|0,I0=x(I0^D,(y=D>>>0>>0?t+1|0:t)^V,16),t=z+(V=h)|0,t=(D=i+I0|0)>>>0>>0?t+1|0:t,i=D,E=t,c=x(E0^D,t^o0,63),D=h,z=v,t=v+cA|0,t=(t=(SA=w+t0|0)>>>0>>0?t+1|0:t)+W|0,t=(w=N+SA|0)>>>0>>0?t+1|0:t,N=w,w=t,SA=x(N^B0,t^wA,32),t=s+(v=h)|0,s=z,z=t=(W=hA+SA|0)>>>0>>0?t+1|0:t,s=hA=x(W^t0,s^t,24),t0=t=h,wA=t,t=w+g0|0,t=(t=(hA=tA+N|0)>>>0>>0?t+1|0:t)+wA|0,N=tA=s+(w=hA)|0,SA=x(tA^SA,(hA=v)^(v=w>>>0>tA>>>0?t+1|0:t),16),t=z+(wA=h)|0,g0=tA=W+SA|0,hA=x(tA^s,(w=tA>>>0>>0?t+1|0:t)^t0,63),z=h,tA=U,t=U+w0|0,t=(t=(W=Y+zA|0)>>>0>>0?t+1|0:t)+yA|0,t=(Y=W+gA|0)>>>0>>0?t+1|0:t,gA=Y,Y=t,l=x(gA^X,t^l,32),t=AA+(U=h)|0,s=tA,tA=t=H>>>0>(yA=H+l|0)>>>0?t+1|0:t,AA=H=x(yA^zA,s^t,24),s=t=h,t=Y+n0|0,t=(t=(gA=gA+fA|0)>>>0>>0?t+1|0:t)+s|0,W=Y=gA+H|0,l=x(Y^l,(H=U)^(U=Y>>>0>>0?t+1|0:t),16),t=tA+(gA=h)|0,s=x((H=Y=yA+l|0)^AA,(Y=Y>>>0>>0?t+1|0:t)^s,63),tA=h,yA=D,fA=l,t=D+_|0,t=(l=b+c|0)>>>0>>0?t+1|0:t,b=l,t=t+(AA=r[n+164>>2])|0,AA=x(fA^(l=D=l+r[n+160>>2]|0),(D=D>>>0>>0?t+1|0:t)^gA,32),t=(t=w)+(w=h)|0,_=yA,yA=t=(b=(gA=AA)+g0|0)>>>0>>0?t+1|0:t,_=x(b^c,_^t,24),fA=t=h,gA=t,t=D+ZA|0,t=(t=(l=l+aA|0)>>>0>>0?t+1|0:t)+gA|0,t0=x((g0=D=l+_|0)^AA,(D=D>>>0>>0?t+1|0:t)^w,16),t=yA+(gA=h)|0,yA=w=b+t0|0,c=x(w^_,(b=w>>>0>>0?t+1|0:t)^fA,63),w=h,_=hA,aA=H,t=y+eA|0,t=(t=(H=(hA=$)+bA|0)>>>0>>0?t+1|0:t)+(l=z)|0,O=x((AA=hA=_+H|0)^_A,(z=H>>>0>AA>>>0?t+1|0:t)^O,32),t=(t=Y)+(Y=h)|0,y=l,l=t=(H=O)>>>0>(hA=aA+H|0)>>>0?t+1|0:t,y=aA=x(_^hA,y^t,24),_=t=h,aA=O,t=z+a|0,t=(t=(O=r0)>>>0>(AA=O+AA|0)>>>0?t+1|0:t)+_|0,AA=x(aA^(H=z=AA+y|0),(O=H>>>0>>0?t+1|0:t)^Y,16),t=l+(aA=h)|0,fA=x((l=z=hA+AA|0)^y,(hA=l>>>0>>0?t+1|0:t)^_,63),z=h,bA=s,t=v+d0|0,t=(y=rA)>>>0>(s=y+N|0)>>>0?t+1|0:t,y=s,t=t+(Y=tA)|0,_=x((s=v=bA+s|0)^I0,(tA=s>>>0>>0?t+1|0:t)^V,32),t=j+(v=h)|0,V=Y,Y=t=(y=iA+_|0)>>>0>>0?t+1|0:t,N=x(bA^y,V^t,24),j=t=h,V=t,iA=_,_=(t=s)+(s=YA)|0,t=tA+h0|0,t=(t=s>>>0>_>>>0?t+1|0:t)+V|0,V=t=(s=_)>>>0>(tA=s+N|0)>>>0?t+1|0:t,bA=x(iA^tA,t^v,16),t=Y+(s=h)|0,iA=x((v=y+bA|0)^N,(t=v>>>0>>0?t+1|0:t)^j,63),Y=h,_=t,t=o+(y=F)|0,t=U+((N=RA)>>>0>(j=N+XA|0)>>>0?t+1|0:t)|0,N=F=W+j|0,j=x(F^SA,(U=F>>>0>>0?t+1|0:t)^wA,32),t=E+(F=h)|0,wA=t=i>>>0>(W=i+j|0)>>>0?t+1|0:t,SA=t=x(W^XA,t^y,24),i=t,y=t+N|0,t=(E=h)+U|0,t=(t=y>>>0>>0?t+1|0:t)+(zA=r[n+204>>2])|0,t=(U=y+r[n+200>>2]|0)>>>0>>0?t+1|0:t,y=F,F=t,zA=x(U^j,y^t,16),t=wA+(i=h)|0,t=(y=W+zA|0)>>>0>>0?t+1|0:t,W=y,wA=t,E=x(SA^y,t^E,63),y=t=h,N=v,SA=AA,t=D+f|0,t=(t=(v=NA)>>>0>(AA=v+g0|0)>>>0?t+1|0:t)+y|0,SA=x(SA^(j=D=(v=AA)+E|0),(D=D>>>0>>0?t+1|0:t)^aA,32),t=(v=h)+_|0,aA=t=(AA=N+(aA=SA)|0)>>>0>>0?t+1|0:t,E=x(E^AA,y^t,24),N=t=h,y=t,_A=E,t=D+a|0,t=(t=(E=r0)>>>0>(_=E+j|0)>>>0?t+1|0:t)+y|0,SA=x((y=D=_A+(E=_)|0)^SA,(E=y>>>0>>0?t+1|0:t)^v,16),t=aA+(_=h)|0,t=(D=AA+SA|0)>>>0>>0?t+1|0:t,AA=D,aA=t,D=x(_A^D,t^N,63),v=h,N=w,_A=c,t=w+o|0,t=O+((c=RA)>>>0>(j=_A+c|0)>>>0?t+1|0:t)|0,s=x((c=w=H+j|0)^bA,(w=w>>>0>>0?t+1|0:t)^s,32),t=wA+(H=h)|0,wA=t=W>>>0>(O=W+s|0)>>>0?t+1|0:t,j=N=x(_A^(W=O),t^N,24),g0=t=h,O=t,_A=N,bA=s,t=w+d0|0,t=(t=(s=rA)>>>0>(N=s+c|0)>>>0?t+1|0:t)+O|0,j=w=j+(s=N)|0,bA=x(bA^w,(O=H)^(H=w>>>0>>0?t+1|0:t),16),t=wA+(O=h)|0,t=(w=W+bA|0)>>>0>>0?t+1|0:t,W=w,wA=t,c=x(_A^w,t^g0,63),w=h,_A=fA,t=h0+(s=z)|0,t=V+((N=YA)>>>0>(fA=N+fA|0)>>>0?t+1|0:t)|0,N=x((V=z=tA+fA|0)^zA,(z=tA>>>0>V>>>0?t+1|0:t)^i,32),t=b+(tA=h)|0,t=(i=yA+N|0)>>>0>>0?t+1|0:t,yA=i,b=t,t=x(_A^i,t^s,24),g0=r[n+236>>2],_A=t,s=V,V=t,s=s+t|0,t=(i=h)+z|0,t=(t=s>>>0>>0?t+1|0:t)+g0|0,s=t=(z=s+r[n+232>>2]|0)>>>0>>0?t+1|0:t,g0=x((V=z)^N,t^tA,16),t=b+(N=h)|0,fA=z=yA+g0|0,i=x(_A^z,(tA=z>>>0>>0?t+1|0:t)^i,63),z=h,yA=Y,_A=iA,t=Y+F|0,t=(t=(b=U+iA|0)>>>0>>0?t+1|0:t)+(zA=r[n+164>>2])|0,gA=x((iA=Y=(U=b)+r[n+160>>2]|0)^t0,(Y=Y>>>0>>0?t+1|0:t)^gA,32),t=hA+(U=h)|0,hA=yA,yA=t=l>>>0>(F=l+gA|0)>>>0?t+1|0:t,hA=l=x(_A^F,hA^t,24),t0=t=h,b=t,_A=gA,t=Y+CA|0,t=(t=(l=(gA=mA)+iA|0)>>>0>>0?t+1|0:t)+b|0,zA=Y=hA+l|0,l=x(_A^Y,(b=U)^(U=Y>>>0>>0?t+1|0:t),16),t=yA+(b=h)|0,t=(Y=F+l|0)>>>0>>0?t+1|0:t,F=Y,yA=t,iA=x(Y^hA,t^t0,63),Y=h,gA=w,_A=l,t=w+E|0,t=(t=(l=y+c|0)>>>0>>0?t+1|0:t)+(hA=r[n+132>>2])|0,y=x(_A^(hA=w=l+r[n+128>>2]|0),(w=w>>>0>>0?t+1|0:t)^b,32),t=(t=tA)+(tA=h)|0,E=gA,gA=t=y>>>0>(b=y+fA|0)>>>0?t+1|0:t,E=x(b^c,E^t,24),fA=t=h,l=t,c=y,y=(t=hA)+(hA=$)|0,t=w+eA|0,t=(t=y>>>0>>0?t+1|0:t)+l|0,t0=w=y+E|0,cA=x(c^w,(l=w>>>0>>0?t+1|0:t)^tA,16),t=gA+(hA=h)|0,gA=t=(tA=b+cA|0)>>>0>>0?t+1|0:t,c=x((b=tA)^E,t^fA,63),tA=h,fA=i,t=H+S0|0,H=y=(i=VA)+j|0,t=(t=y>>>0>>0?t+1|0:t)+(w=z)|0,E=x((y=i=fA+y|0)^SA,(z=H>>>0>y>>>0?t+1|0:t)^_,32),t=yA+(i=h)|0,t=(H=F+E|0)>>>0>>0?t+1|0:t,F=H,_=w,w=t,t=x(fA^H,_^t,24),fA=r[n+156>>2],_=t,H=t,y=t+y|0,t=(yA=h)+z|0,t=(t=y>>>0>>0?t+1|0:t)+fA|0,t=y>>>0>(z=y+r[n+152>>2]|0)>>>0?t+1|0:t,y=i,i=t,j=x((H=z)^E,y^t,16),t=w+(y=h)|0,E=yA,yA=t=(z=F+j|0)>>>0>>0?t+1|0:t,fA=x(_^(F=z),E^t,63),w=h,z=Y,t=Y+s|0,t=(t=(E=V+iA|0)>>>0>>0?t+1|0:t)+(_=r[n+204>>2])|0,t=(Y=E+r[n+200>>2]|0)>>>0>>0?t+1|0:t,E=O,O=t,E=x(Y^bA,E^t,32),t=aA+(V=h)|0,t=(s=AA+E|0)>>>0>>0?t+1|0:t,AA=s,_=z,z=t,s=x(s^iA,_^t,24),_=t=h,bA=s,t=t+O|0,t=(t=(s=Y+s|0)>>>0>>0?t+1|0:t)+(iA=r[n+148>>2])|0,t=(Y=s+r[n+144>>2]|0)>>>0>>0?t+1|0:t,O=Y,s=V,V=t,SA=x(Y^E,s^t,16),t=z+(s=h)|0,t=(Y=AA+SA|0)>>>0>>0?t+1|0:t,AA=Y,aA=t,iA=x(bA^Y,_^t,63),Y=h,z=v,bA=D,t=v+U|0,v=E=D+zA|0,t=(t=E>>>0>>0?t+1|0:t)+(_=r[n+196>>2])|0,_=x((E=D=E+r[n+192>>2]|0)^g0,(D=E>>>0>>0?t+1|0:t)^N,32),t=wA+(v=h)|0,z=x(bA^(U=W+_|0),(t=U>>>0>>0?t+1|0:t)^z,24),W=t,g0=r[n+220>>2],N=z,_A=U,t=(U=h)+D|0,D=E=E+z|0,t=(t=E>>>0>>0?t+1|0:t)+(bA=g0)|0,bA=x(z=(E=z=(wA=r[n+216>>2])+E|0)^_,(_=D>>>0>E>>>0?t+1|0:t)^v,16),t=(t=W)+(W=h)|0,t=(D=bA)>>>0>(z=_A+D|0)>>>0?t+1|0:t,D=U,U=t,t=x(N^z,D^t,63),XA=r[n+236>>2],_A=t,v=t,N=t+t0|0,t=(D=h)+l|0,t=(t=v>>>0>N>>>0?t+1|0:t)+XA|0,j=x((N=v=(l=N)+r[n+232>>2]|0)^j,(v=v>>>0>>0?t+1|0:t)^y,32),t=aA+(l=h)|0,t=(y=AA+j|0)>>>0>>0?t+1|0:t,AA=y,aA=D,D=t,t=x(_A^y,aA^t,24),_A=j,y=t,N=t+N|0,t=(aA=h)+v|0,t=g0+(y>>>0>N>>>0?t+1|0:t)|0,j=v=N+wA|0,g0=x(_A^v,(N=l)^(l=v>>>0>>0?t+1|0:t),16),t=D+(wA=h)|0,t=(v=AA+g0|0)>>>0>>0?t+1|0:t,AA=v,D=aA,aA=t,D=x(y^v,D^t,63),v=h,_A=c,t=eA+(y=tA)|0,t=i+((c=(N=$)+c|0)>>>0>>0?t+1|0:t)|0,s=x((N=tA=H+c|0)^SA,(tA=H>>>0>tA>>>0?t+1|0:t)^s,32),t=U+(i=h)|0,t=(H=z+s|0)>>>0>>0?t+1|0:t,z=H,U=t,c=y=x(_A^H,t^y,24),SA=t=h,H=t,_A=s,t=tA+h0|0,t=(t=(y=YA)>>>0>(s=y+N|0)>>>0?t+1|0:t)+H|0,t0=tA=c+(y=s)|0,zA=x(_A^tA,(s=i)^(i=y>>>0>tA>>>0?t+1|0:t),16),t=U+(H=h)|0,N=x((U=tA=z+zA|0)^c,(y=U>>>0>>0?t+1|0:t)^SA,63),z=h,tA=w,t=w+f|0,t=V+((s=NA)>>>0>(c=s+fA|0)>>>0?t+1|0:t)|0,s=x((V=w=O+c|0)^bA,(w=w>>>0>>0?t+1|0:t)^W,32),t=gA+(W=h)|0,t=b>>>0>(O=b+s|0)>>>0?t+1|0:t,b=O,O=tA,tA=t,c=O=x(b^fA,O^t,24),fA=t=h,gA=t,t=w+o|0,t=(t=(O=RA)>>>0>(V=O+V|0)>>>0?t+1|0:t)+gA|0,gA=w=c+V|0,SA=x(w^s,(O=W)^(W=w>>>0>>0?t+1|0:t),16),t=tA+(O=h)|0,t=(w=b+SA|0)>>>0>>0?t+1|0:t,b=w,V=t,c=x(w^c,t^fA,63),tA=h,t=_+(w=Y)|0,t=(t=(s=E+iA|0)>>>0>>0?t+1|0:t)+(fA=r[n+156>>2])|0,E=hA,hA=t=(Y=s+r[n+152>>2]|0)>>>0>>0?t+1|0:t,_=x(Y^cA,E^t,32),t=yA+(s=h)|0,t=(E=F+_|0)>>>0>>0?t+1|0:t,F=E,yA=w,w=t,E=x(E^iA,yA^t,24),iA=t=h,_A=E,t=hA+t|0,t=(t=(E=E+Y|0)>>>0>>0?t+1|0:t)+(fA=r[n+204>>2])|0,bA=Y=E+r[n+200>>2]|0,E=x(Y^_,(hA=Y>>>0>>0?t+1|0:t)^s,16),t=w+(Y=h)|0,t=(s=F+E|0)>>>0>>0?t+1|0:t,F=s,yA=t,iA=x(_A^s,iA^t,63),w=h,fA=E,t=l+a|0,t=(t=(E=r0)>>>0>(_=E+j|0)>>>0?t+1|0:t)+(s=z)|0,z=l=(E=_)+N|0,_=x(fA^l,(_=Y)^(Y=E>>>0>l>>>0?t+1|0:t),32),t=V+(l=h)|0,t=(E=b+_|0)>>>0>>0?t+1|0:t,b=E,V=t,E=x(E^N,t^s,24),s=t=h,N=E,t=Y+t|0,t=(t=(E=E+z|0)>>>0>>0?t+1|0:t)+(fA=r[n+132>>2])|0,j=z=E+r[n+128>>2]|0,cA=x(z^_,(Y=l)^(l=E>>>0>z>>>0?t+1|0:t),16),t=V+(E=h)|0,V=t=(z=b+cA|0)>>>0>>0?t+1|0:t,fA=x(N^(b=z),t^s,63),z=h,t=i+d0|0,t=(t=(s=rA)>>>0>(_=s+t0|0)>>>0?t+1|0:t)+(Y=tA)|0,tA=t=(s=_)>>>0>(i=s+c|0)>>>0?t+1|0:t,_=x((s=i)^g0,t^wA,32),t=yA+(wA=h)|0,t=F>>>0>(i=F+_|0)>>>0?t+1|0:t,F=i,N=Y,Y=t,t=x(i^c,N^t,24),c=r[n+164>>2],N=t,i=t,s=t+s|0,t=(yA=h)+tA|0,t=(t=s>>>0>>0?t+1|0:t)+c|0,t=(tA=s+r[n+160>>2]|0)>>>0>>0?t+1|0:t,s=wA,wA=t,s=x((i=tA)^_,s^t,16),t=Y+(_=h)|0,Y=yA,yA=t=(tA=F+s|0)>>>0>>0?t+1|0:t,tA=x(N^(F=tA),Y^t,63),Y=h,N=w,_A=iA,t=w+W|0,t=(t=(c=gA+iA|0)>>>0>>0?t+1|0:t)+(g0=r[n+196>>2])|0,iA=x((c=w=(W=c)+r[n+192>>2]|0)^zA,(w=w>>>0>>0?t+1|0:t)^H,32),t=aA+(W=h)|0,H=t=(gA=AA+iA|0)>>>0>>0?t+1|0:t,aA=x(_A^gA,t^N,24),g0=t=h,AA=t,_A=aA,t=w+S0|0,t=(t=(N=(aA=VA)+c|0)>>>0>>0?t+1|0:t)+AA|0,t0=w=_A+(aA=N)|0,zA=x(w^iA,(N=W)^(W=w>>>0>>0?t+1|0:t),16),t=H+(AA=h)|0,t=(w=gA+zA|0)>>>0>>0?t+1|0:t,gA=w,N=x(_A^w,t^g0,63),w=h,H=v,aA=t,_A=D,t=v+hA|0,t=(t=(c=D+bA|0)>>>0>>0?t+1|0:t)+(iA=r[n+148>>2])|0,O=x((c=D=(v=c)+r[n+144>>2]|0)^SA,(D=D>>>0>>0?t+1|0:t)^O,32),t=y+(v=h)|0,t=U>>>0>(hA=U+O|0)>>>0?t+1|0:t,U=hA,hA=t,iA=y=x(_A^U,t^H,24),SA=t=h,H=t,bA=O,t=D+CA|0,t=(t=(y=(O=mA)+c|0)>>>0>>0?t+1|0:t)+H|0,H=D=iA+y|0,g0=x(bA^D,(O=D>>>0>>0?t+1|0:t)^v,16),t=hA+(v=h)|0,t=(D=U+g0|0)>>>0>>0?t+1|0:t,U=D,hA=t,y=x(D^iA,t^SA,63),c=t=h,D=t,iA=gA,SA=s,t=l+S0|0,l=s=(gA=VA)+j|0,t=(t=s>>>0>>0?t+1|0:t)+D|0,_=x(SA^(s=gA=s+y|0),(D=l>>>0>s>>>0?t+1|0:t)^_,32),t=(gA=h)+aA|0,aA=t=(l=iA+_|0)>>>0<_>>>0?t+1|0:t,c=x(y^l,c^t,24),j=t=h,y=t,iA=_,_=(t=s)+(s=rA)|0,t=D+d0|0,t=(t=s>>>0>_>>>0?t+1|0:t)+y|0,SA=D=(s=_)+c|0,bA=x(iA^D,(y=gA)^(gA=D>>>0>>0?t+1|0:t),16),t=aA+(y=h)|0,t=(D=l+bA|0)>>>0>>0?t+1|0:t,l=D,aA=t,iA=x(D^c,t^j,63),D=h,t=h0+(s=z)|0,t=wA+((_=YA)>>>0>(c=_+fA|0)>>>0?t+1|0:t)|0,AA=x((_=z=i+c|0)^zA,(z=_>>>0>>0?t+1|0:t)^AA,32),t=hA+(wA=h)|0,hA=t=U>>>0>(i=U+AA|0)>>>0?t+1|0:t,t=x((U=i)^fA,t^s,24),fA=r[n+204>>2],c=t,j=AA,AA=t,s=t+_|0,t=(i=h)+z|0,t=(t=s>>>0>>0?t+1|0:t)+fA|0,fA=z=s+r[n+200>>2]|0,j=x(j^z,(_=wA)^(wA=z>>>0>>0?t+1|0:t),16),t=hA+(AA=h)|0,hA=z=U+j|0,_=x(c^z,(s=i)^(i=U>>>0>z>>>0?t+1|0:t),63),z=h,U=Y,_A=tA,t=Y+W|0,t=(t=(s=tA+t0|0)>>>0>>0?t+1|0:t)+(c=r[n+220>>2])|0,s=x((W=tA=s+r[n+216>>2]|0)^g0,(tA=s>>>0>W>>>0?t+1|0:t)^v,32),t=V+(Y=h)|0,V=U,U=t=(v=b+s|0)>>>0>>0?t+1|0:t,t=x(_A^v,V^t,24),g0=r[n+156>>2],c=t,V=W,W=t,V=V+t|0,t=(b=h)+tA|0,t=(t=W>>>0>V>>>0?t+1|0:t)+g0|0,g0=tA=(W=V)+r[n+152>>2]|0,t0=x(tA^s,(W=tA>>>0>>0?t+1|0:t)^Y,16),t=U+(V=h)|0,Y=x(c^(U=tA=v+t0|0),(s=b)^(b=v>>>0>U>>>0?t+1|0:t),63),v=h,tA=w,t=w+O|0,t=(t=(s=H+N|0)>>>0>>0?t+1|0:t)+(c=r[n+132>>2])|0,H=t=(w=s+r[n+128>>2]|0)>>>0>>0?t+1|0:t,E=x(w^cA,t^E,32),t=yA+(O=h)|0,t=(s=F+E|0)>>>0>>0?t+1|0:t,F=s,c=tA,tA=t,s=x(s^N,c^t,24),N=t=h,_A=s,t=H+t|0,t=(t=(s=w+s|0)>>>0>>0?t+1|0:t)+(c=r[n+196>>2])|0,t=(w=s+r[n+192>>2]|0)>>>0>>0?t+1|0:t,H=w,s=O,O=t,E=x(w^E,s^t,16),t=tA+(w=h)|0,t=(s=F+E|0)>>>0>>0?t+1|0:t,F=s,yA=t,c=x(_A^s,N^t,63),tA=h,_A=_,N=E,t=gA+f|0,t=(t=(E=NA)>>>0>(_=E+SA|0)>>>0?t+1|0:t)+(s=z)|0,z=gA=_A+(E=_)|0,_=x(N^gA,(_=w)^(w=E>>>0>gA>>>0?t+1|0:t),32),t=b+(gA=h)|0,N=E=U+_|0,E=x(_A^E,(t=E>>>0>>0?t+1|0:t)^s,24),b=t,zA=r[n+148>>2],SA=E,t=w+(U=h)|0,t=(t=(E=E+z|0)>>>0>>0?t+1|0:t)+(cA=zA)|0,XA=x((cA=z=(s=r[n+144>>2])+E|0)^_,(z=E>>>0>z>>>0?t+1|0:t)^gA,16),t=(t=b)+(b=h)|0,t=(w=(gA=XA)+N|0)>>>0>>0?t+1|0:t,gA=w,E=t,w=x(SA^w,t^U,63),U=h,_A=Y,t=(_=v)+wA|0,t=(t=(N=Y+fA|0)>>>0>>0?t+1|0:t)+(SA=r[n+236>>2])|0,y=x((N=Y=(v=N)+r[n+232>>2]|0)^bA,(Y=v>>>0>Y>>>0?t+1|0:t)^y,32),t=yA+(v=h)|0,yA=t=F>>>0>(wA=F+y|0)>>>0?t+1|0:t,fA=_=x(_A^(F=wA),t^_,24),SA=t=h,wA=t,_A=y,t=Y+eA|0,t=(t=(y=$)>>>0>(_=y+N|0)>>>0?t+1|0:t)+wA|0,bA=Y=fA+(y=_)|0,y=x(_A^Y,(wA=Y>>>0>>0?t+1|0:t)^v,16),t=yA+(_=h)|0,yA=Y=F+y|0,fA=x(Y^fA,(N=Y>>>0>>0?t+1|0:t)^SA,63),Y=h,SA=c,t=W+o|0,t=(t=(F=RA)>>>0>(c=F+g0|0)>>>0?t+1|0:t)+(v=tA)|0,c=x((tA=F=SA+(W=c)|0)^j,(F=F>>>0>>0?t+1|0:t)^AA,32),t=aA+(W=h)|0,aA=x(SA^(AA=l+c|0),(t=l>>>0>AA>>>0?t+1|0:t)^v,24),l=t,g0=r[n+164>>2],j=aA,_A=AA,t=F+(v=h)|0,F=aA=tA+aA|0,t=(t=aA>>>0>>0?t+1|0:t)+(SA=g0)|0,aA=W,W=t=(tA=(AA=r[n+160>>2])+F|0)>>>0>>0?t+1|0:t,B0=x(tA^c,aA^t,16),t=(t=l)+(l=h)|0,aA=t=(F=_A+(aA=B0)|0)>>>0>>0?t+1|0:t,j=x(j^F,t^v,63),v=h,c=D,_A=iA,t=D+CA|0,t=O+((iA=mA)>>>0>(SA=_A+iA|0)>>>0?t+1|0:t)|0,V=x((iA=D=H+SA|0)^t0,(D=D>>>0>>0?t+1|0:t)^V,32),t=i+(H=h)|0,i=t=(O=hA+V|0)>>>0>>0?t+1|0:t,SA=c=x(_A^(hA=O),t^c,24),t0=t=h,O=t,_A=V,t=D+a|0,t=(t=(c=(V=r0)+iA|0)>>>0>>0?t+1|0:t)+O|0,O=D=SA+c|0,iA=x(_A^D,(V=H)^(H=D>>>0>>0?t+1|0:t),16),t=i+(V=h)|0,t=(D=hA+iA|0)>>>0>>0?t+1|0:t,hA=D,i=t,c=x(D^SA,t^t0,63),SA=t=h,D=t,_A=y,t=z+CA|0,z=y=mA+cA|0,t=(t=y>>>0>>0?t+1|0:t)+D|0,_=x(_A^(y=mA=y+c|0),(z=z>>>0>y>>>0?t+1|0:t)^_,32),t=aA+(D=h)|0,CA=mA=F+_|0,aA=t=F>>>0>mA>>>0?t+1|0:t,_A=mA=x(c^mA,SA^t,24),t=(F=h)+z|0,t=(t=(y=y+mA|0)>>>0>>0?t+1|0:t)+zA|0,SA=x((c=mA=y+s|0)^_,(y=s>>>0>c>>>0?t+1|0:t)^D,16),t=(t=aA)+(aA=h)|0,CA=mA=(z=SA)+CA|0,D=x(_A^mA,(z=z>>>0>mA>>>0?t+1|0:t)^F,63),F=h,mA=U,_A=w,t=U+wA|0,U=s=w+bA|0,t=(t=s>>>0>>0?t+1|0:t)+(_=r[n+196>>2])|0,_=x((s=w=s+r[n+192>>2]|0)^B0,(w=s>>>0>>0?t+1|0:t)^l,32),t=i+(U=h)|0,i=mA,mA=t=(l=hA+_|0)>>>0>>0?t+1|0:t,_A=t=x(_A^l,i^t,24),hA=t,i=t+s|0,t=(wA=h)+w|0,t=g0+(i>>>0>>0?t+1|0:t)|0,g0=w=i+AA|0,bA=x(w^_,(s=U)^(U=w>>>0>>0?t+1|0:t),16),t=mA+(hA=h)|0,t=(w=l+bA|0)>>>0>>0?t+1|0:t,l=w,s=wA,wA=t,s=x(_A^w,s^t,63),mA=h,t=eA+(w=Y)|0,t=W+((i=$)>>>0>(AA=i+fA|0)>>>0?t+1|0:t)|0,i=Y=tA+AA|0,AA=x(Y^iA,(tA=Y>>>0>>0?t+1|0:t)^V,32),t=E+(Y=h)|0,E=w,w=t=(W=gA+AA|0)>>>0>>0?t+1|0:t,E=V=x(W^fA,E^t,24),_=t=h,V=AA,AA=(t=i)+(i=VA)|0,t=tA+S0|0,t=(t=i>>>0>AA>>>0?t+1|0:t)+_|0,gA=tA=(i=AA)+E|0,iA=x(V^tA,(i=tA>>>0>>0?t+1|0:t)^Y,16),t=w+(AA=h)|0,w=x((fA=tA=W+iA|0)^E,(tA=tA>>>0>>0?t+1|0:t)^_,63),Y=h,W=v,t=v+o|0,t=H+((E=(V=RA)+j|0)>>>0>>0?t+1|0:t)|0,t=(v=O+E|0)>>>0>>0?t+1|0:t,O=v,v=t,V=x(O^XA,t^b,32),t=N+(b=h)|0,t=(H=yA+V|0)>>>0>>0?t+1|0:t,yA=H,E=W,W=t,E=x(H^j,E^t,24),N=t=h,H=t,_=V,V=(t=O)+(O=r0)|0,t=v+a|0,t=(t=O>>>0>V>>>0?t+1|0:t)+H|0,j=v=V+E|0,V=x(_^v,(O=b)^(b=v>>>0>>0?t+1|0:t),16),t=W+(H=h)|0,t=(v=yA+V|0)>>>0>>0?t+1|0:t,yA=v,W=t,_=x(v^E,t^N,63),v=h,E=s,N=V,t=y+d0|0,t=(t=(s=(V=rA)+c|0)>>>0>>0?t+1|0:t)+(O=mA)|0,V=y=E+s|0,mA=t=y>>>0>>0?t+1|0:t,s=x(N^y,t^H,32),t=(t=tA)+(tA=h)|0,y=O,O=t=s>>>0>(H=s+fA|0)>>>0?t+1|0:t,t=x(E^H,y^t,24),N=r[n+220>>2],E=t,fA=s,y=V,V=t,s=y+t|0,t=(y=h)+mA|0,t=(t=s>>>0>>0?t+1|0:t)+N|0,fA=x(fA^(c=mA=s+r[n+216>>2]|0),(V=s>>>0>c>>>0?t+1|0:t)^tA,16),t=O+(s=h)|0,O=t=H>>>0>(mA=H+fA|0)>>>0?t+1|0:t,mA=x(E^(H=mA),t^y,63),tA=h,_A=w,t=(y=Y)+U|0,Y=E=w+g0|0,t=(t=E>>>0>>0?t+1|0:t)+(N=r[n+204>>2])|0,aA=x((E=w=E+r[n+200>>2]|0)^SA,(w=E>>>0>>0?t+1|0:t)^aA,32),t=W+(Y=h)|0,yA=t=(U=yA+aA|0)>>>0>>0?t+1|0:t,N=y=x(_A^U,t^y,24),SA=t=h,W=t,_A=aA,t=w+h0|0,t=(t=(y=(aA=YA)+E|0)>>>0>>0?t+1|0:t)+W|0,g0=w=N+y|0,t0=x(_A^w,(W=w>>>0>>0?t+1|0:t)^Y,16),t=yA+(aA=h)|0,t=(w=U+t0|0)>>>0>>0?t+1|0:t,U=w,yA=t,w=x(w^N,t^SA,63),Y=h,_A=_,t=(y=v)+i|0,t=(_=_+gA|0)>>>0>>0?t+1|0:t,gA=_,t=t+(N=SA=r[n+156>>2])|0,N=x((_=v=(E=r[n+152>>2])+_|0)^bA,(v=_>>>0>>0?t+1|0:t)^hA,32),t=(t=z)+(z=h)|0,hA=t=(gA=N+CA|0)>>>0>>0?t+1|0:t,CA=y=x(_A^gA,t^y,24),bA=t=h,i=t,_A=y,t=v+f|0,t=(t=(y=NA)>>>0>(_=y+_|0)>>>0?t+1|0:t)+i|0,CA=v=CA+(y=_)|0,zA=x(v^N,(i=v>>>0>>0?t+1|0:t)^z,16),t=hA+(v=h)|0,t=(z=gA+zA|0)>>>0>>0?t+1|0:t,gA=z,hA=t,N=x(_A^z,t^bA,63),z=h,_A=D,t=(y=F)+b|0,F=_=D+j|0,t=(t=_>>>0>>0?t+1|0:t)+(bA=r[n+236>>2])|0,AA=x((_=D=_+r[n+232>>2]|0)^iA,(F=_>>>0>>0?t+1|0:t)^AA,32),t=wA+(b=h)|0,iA=D=l+AA|0,D=x(_A^D,(t=D>>>0>>0?t+1|0:t)^y,24),wA=t,bA=r[n+132>>2],j=D,_A=iA,iA=AA,t=(l=h)+F|0,t=(t=(y=D+_|0)>>>0>>0?t+1|0:t)+bA|0,t=(D=(AA=r[n+128>>2])+y|0)>>>0>>0?t+1|0:t,F=D,y=b,b=t,iA=x(iA^D,y^t,16),t=(t=wA)+(wA=h)|0,t=(D=_A+(y=iA)|0)>>>0>>0?t+1|0:t,y=D,D=l,l=t,j=t=x(j^y,D^t,63),_=t,c=t+c|0,t=(D=h)+V|0,t=bA+(_>>>0>c>>>0?t+1|0:t)|0,c=x((_=V=c+AA|0)^t0,(AA=AA>>>0>_>>>0?t+1|0:t)^aA,32),t=hA+(aA=h)|0,t=gA>>>0>(V=gA+c|0)>>>0?t+1|0:t,gA=V,V=D,D=t,j=V=x(j^gA,V^t,24),bA=t=h,hA=t,_A=V,t=AA+o|0,t=(t=(_=(V=RA)+_|0)>>>0>>0?t+1|0:t)+hA|0,j=AA=j+_|0,t0=x(AA^c,(hA=AA>>>0<_>>>0?t+1|0:t)^aA,16),t=D+(AA=h)|0,t=gA>>>0>(aA=gA+t0|0)>>>0?t+1|0:t,gA=aA,aA=t,c=x(_A^gA,t^bA,63),D=h,V=tA,_A=mA,t=tA+W|0,tA=_=mA+g0|0,t=(t=_>>>0>>0?t+1|0:t)+(bA=r[n+148>>2])|0,g0=x((_=mA=_+r[n+144>>2]|0)^zA,(mA=tA>>>0>_>>>0?t+1|0:t)^v,32),t=l+(tA=h)|0,W=t=(v=y+g0|0)>>>0>>0?t+1|0:t,bA=t=x(_A^v,t^V,24),y=t,V=t+_|0,t=(l=h)+mA|0,t=SA+(y>>>0>V>>>0?t+1|0:t)|0,SA=mA=E+V|0,g0=x(mA^g0,(y=E>>>0>mA>>>0?t+1|0:t)^tA,16),t=W+(V=h)|0,tA=x(bA^(W=mA=v+g0|0),(E=l)^(l=v>>>0>W>>>0?t+1|0:t),63),v=h,mA=Y,bA=w,t=Y+i|0,Y=E=w+CA|0,t=(t=E>>>0>>0?t+1|0:t)+(_=r[n+164>>2])|0,_=x((E=w=E+r[n+160>>2]|0)^iA,(w=E>>>0>>0?t+1|0:t)^wA,32),t=O+(Y=h)|0,O=mA,mA=t=H>>>0>(wA=H+_|0)>>>0?t+1|0:t,H=x(bA^wA,O^t,24),iA=t=h,i=t,_A=H,t=w+a|0,t=(t=(H=r0)>>>0>(O=H+E|0)>>>0?t+1|0:t)+i|0,CA=w=_A+(H=O)|0,bA=x(w^_,(i=w>>>0>>0?t+1|0:t)^Y,16),t=mA+(H=h)|0,t=(w=wA+bA|0)>>>0>>0?t+1|0:t,wA=w,O=t,w=x(_A^w,t^iA,63),Y=h,mA=z,t=z+S0|0,t=b+((E=VA)>>>0>(_=E+N|0)>>>0?t+1|0:t)|0,s=x((E=z=F+_|0)^fA,(z=E>>>0>>0?t+1|0:t)^s,32),t=yA+(F=h)|0,_=mA,mA=t=U>>>0>(b=U+s|0)>>>0?t+1|0:t,_=b=x((U=b)^N,_^t,24),N=t=h,iA=s,t=z+eA|0,t=(t=(s=(b=$)+E|0)>>>0>>0?t+1|0:t)+N|0,yA=z=_+s|0,s=x(iA^z,(E=F)^(F=z>>>0>>0?t+1|0:t),16),t=mA+(b=h)|0,N=x((E=z=U+s|0)^_,(z=U>>>0>E>>>0?t+1|0:t)^N,63),mA=h,U=v,iA=tA,fA=s,t=v+hA|0,t=(t=(s=tA+j|0)>>>0>>0?t+1|0:t)+(_=r[n+196>>2])|0,s=x(fA^(hA=tA=s+r[n+192>>2]|0),(tA=s>>>0>tA>>>0?t+1|0:t)^b,32),t=O+(v=h)|0,_=U,U=t=(b=wA+s|0)>>>0>>0?t+1|0:t,t=x(iA^b,_^t,24),iA=r[n+204>>2],_=t,O=hA,hA=t,O=O+t|0,t=(wA=h)+tA|0,t=(t=O>>>0>>0?t+1|0:t)+iA|0,fA=tA=O+r[n+200>>2]|0,j=x(tA^s,(hA=tA>>>0>>0?t+1|0:t)^v,16),t=U+(O=h)|0,tA=x(_^(U=tA=b+j|0),(b=U>>>0>>0?t+1|0:t)^wA,63),v=h,wA=Y,iA=w,_A=E,t=Y+y|0,t=(t=(E=w+SA|0)>>>0>>0?t+1|0:t)+(_=zA=r[n+212>>2])|0,E=x((y=w=(s=r[n+208>>2])+E|0)^t0,(w=w>>>0>>0?t+1|0:t)^AA,32),t=(t=z)+(z=h)|0,_=wA,wA=t=(Y=_A+E|0)>>>0>>0?t+1|0:t,t=x(iA^Y,_^t,24),iA=r[n+220>>2],_A=t,_=E,E=y,y=t,E=E+t|0,t=(AA=h)+w|0,t=(t=E>>>0>>0?t+1|0:t)+iA|0,SA=w=E+r[n+216>>2]|0,E=x(_^w,(y=w>>>0>>0?t+1|0:t)^z,16),t=wA+(_=h)|0,wA=z=Y+E|0,z=x(_A^z,(w=AA)^(AA=Y>>>0>z>>>0?t+1|0:t),63),w=h,_A=N,t=i+f|0,t=(t=(N=NA)>>>0>(iA=N+CA|0)>>>0?t+1|0:t)+(Y=mA)|0,iA=x((mA=i=_A+(N=iA)|0)^g0,(i=i>>>0>>0?t+1|0:t)^V,32),t=aA+(V=h)|0,t=gA>>>0>(N=gA+iA|0)>>>0?t+1|0:t,gA=N,N=Y,Y=t,N=x(_A^gA,N^t,24),aA=t=h,_A=N,t=i+t|0,t=(t=(N=N+mA|0)>>>0>>0?t+1|0:t)+(g0=r[n+236>>2])|0,CA=mA=(i=N)+r[n+232>>2]|0,g0=x(mA^iA,(i=i>>>0>mA>>>0?t+1|0:t)^V,16),t=Y+(V=h)|0,iA=x(_A^(Y=mA=gA+g0|0),(gA=gA>>>0>Y>>>0?t+1|0:t)^aA,63),mA=h,aA=D,_A=c,t=D+h0|0,t=F+((c=(N=YA)+c|0)>>>0>>0?t+1|0:t)|0,H=x((N=D=yA+c|0)^bA,(D=D>>>0>>0?t+1|0:t)^H,32),t=l+(F=h)|0,W=t=W>>>0>(yA=W+H|0)>>>0?t+1|0:t,c=aA=x(_A^yA,t^aA,24),bA=t=h,l=t,_A=H,t=D+d0|0,t=(t=(H=rA)>>>0>(aA=H+N|0)>>>0?t+1|0:t)+l|0,l=D=c+(H=aA)|0,N=x(_A^D,(N=F)^(F=D>>>0>>0?t+1|0:t),16),t=W+(H=h)|0,t=(D=yA+N|0)>>>0>>0?t+1|0:t,yA=D,W=t,aA=x(D^c,t^bA,63),c=t=h,D=t,bA=E,t=hA+h0|0,hA=E=fA+YA|0,t=(t=E>>>0>>0?t+1|0:t)+D|0,_=x(bA^(E=YA=E+aA|0),(YA=hA>>>0>E>>>0?t+1|0:t)^_,32),t=gA+(D=h)|0,gA=t=Y>>>0>(hA=Y+_|0)>>>0?t+1|0:t,fA=t=x(aA^(Y=hA),c^t,24),aA=t,E=t+E|0,t=(hA=h)+YA|0,t=zA+(E>>>0>>0?t+1|0:t)|0,c=x((c=_)^(_=YA=E+s|0),(aA=s>>>0>_>>>0?t+1|0:t)^D,16),t=gA+(s=h)|0,Y=x(fA^(gA=YA=Y+c|0),(E=hA)^(hA=Y>>>0>gA>>>0?t+1|0:t),63),D=h,YA=v,bA=tA,t=v+y|0,v=E=tA+SA|0,t=(t=E>>>0>>0?t+1|0:t)+(fA=r[n+164>>2])|0,V=x((E=tA=E+r[n+160>>2]|0)^g0,(tA=v>>>0>E>>>0?t+1|0:t)^V,32),t=W+(v=h)|0,t=(y=yA+V|0)>>>0>>0?t+1|0:t,yA=y,W=YA,YA=t,t=x(bA^y,W^t,24),SA=r[n+196>>2],bA=t,fA=V,y=t,V=t+E|0,t=(W=h)+tA|0,t=(t=y>>>0>V>>>0?t+1|0:t)+SA|0,fA=x(fA^(E=tA=(y=V)+r[n+192>>2]|0),(V=v)^(v=y>>>0>E>>>0?t+1|0:t),16),t=YA+(SA=h)|0,t=(tA=yA+fA|0)>>>0>>0?t+1|0:t,yA=tA,y=W,W=t,y=x(bA^tA,y^t,63),YA=h,tA=w,bA=z,t=w+i|0,t=(t=(V=z+CA|0)>>>0>>0?t+1|0:t)+(h0=r[n+204>>2])|0,H=x((V=z=(w=V)+r[n+200>>2]|0)^N,(z=w>>>0>z>>>0?t+1|0:t)^H,32),t=b+(w=h)|0,t=U>>>0>(i=U+H|0)>>>0?t+1|0:t,U=i,i=tA,tA=t,N=i=x(bA^U,i^t,24),h0=t=h,b=t,bA=i,t=z+d0|0,t=(t=(i=V+rA|0)>>>0>>0?t+1|0:t)+b|0,N=x((V=rA=N+i|0)^H,(N=w)^(w=i>>>0>V>>>0?t+1|0:t),16),t=tA+(b=h)|0,i=t=U>>>0>(rA=U+N|0)>>>0?t+1|0:t,rA=x(bA^(U=rA),t^h0,63),z=h,t=F+(tA=mA)|0,F=H=l+iA|0,t=(t=H>>>0>>0?t+1|0:t)+(h0=r[n+236>>2])|0,O=x((H=mA=H+r[n+232>>2]|0)^j,(mA=F>>>0>H>>>0?t+1|0:t)^O,32),t=AA+(F=h)|0,AA=tA,tA=t=(l=wA+O|0)>>>0>>0?t+1|0:t,AA=x(l^iA,AA^t,24),j=t=h,wA=t,t=mA+S0|0,t=(t=(H=H+VA|0)>>>0>>0?t+1|0:t)+wA|0,iA=x((wA=VA=H+AA|0)^O,(iA=F)^(F=H>>>0>wA>>>0?t+1|0:t),16),t=tA+(S0=h)|0,H=t=l>>>0>(VA=l+iA|0)>>>0?t+1|0:t,mA=x(AA^(l=VA),t^j,63),tA=h,t=aA+o|0,t=(t=(AA=_+RA|0)>>>0>>0?t+1|0:t)+(O=YA)|0,t=AA>>>0>(RA=AA+y|0)>>>0?t+1|0:t,AA=RA,RA=t,t=f+t|0,NA=t=(O=NA+AA|0)>>>0>>0?t+1|0:t,_=O,O=x(AA^iA,RA^S0,32),t=i+(AA=h)|0,aA=x((i=RA=U+O|0)^y,(RA=U>>>0>i>>>0?t+1|0:t)^YA,24),t=(y=h)+NA|0,t=(U=aA)>>>0>(YA=_+U|0)>>>0?t+1|0:t,U=YA,r[n>>2]=U,r[n+4>>2]=t,VA=t,t=x(U^O,t^AA,16),O=YA=h,r[n+120>>2]=t,r[n+124>>2]=O,NA=t,i=t+i|0,t=O+RA|0,r[n+80>>2]=i,t=i>>>0>>0?t+1|0:t,r[n+84>>2]=t,k=n,DA=x(aA^i,t^y,63),r[k+40>>2]=DA,r[n+44>>2]=h,RA=z,y=rA,t=v+z|0,t=(t=(NA=E+rA|0)>>>0>>0?t+1|0:t)+(i=r[n+132>>2])|0,NA=t=(rA=NA+r[n+128>>2]|0)>>>0>>0?t+1|0:t,v=x(rA^c,t^s,32),t=H+(i=h)|0,E=RA,RA=t=l>>>0>(z=l+v|0)>>>0?t+1|0:t,H=x(y^(l=z),E^t,24),t=NA+(O=h)|0,t=(z=H+rA|0)>>>0>>0?t+1|0:t,rA=(NA=r[n+144>>2])+z|0,t=r[n+148>>2]+t|0,t=rA>>>0>>0?t+1|0:t,r[n+8>>2]=rA,r[n+12>>2]=t,t=x(v^rA,t^i,16),z=YA=h,r[n+96>>2]=t,r[n+100>>2]=z,rA=t,NA=t+l|0,t=z+RA|0,RA=NA,r[n+88>>2]=RA,t=rA>>>0>RA>>>0?t+1|0:t,r[n+92>>2]=t,k=n,DA=x(H^RA,t^O,63),r[k+48>>2]=DA,r[n+52>>2]=h,E=$,t=w+tA|0,t=(t=(rA=V+mA|0)>>>0>>0?t+1|0:t)+(NA=r[n+220>>2])|0,t=(YA=rA+r[n+216>>2]|0)>>>0>>0?t+1|0:t,$=YA,NA=YA,rA=E+YA|0,YA=t,t=t+eA|0,t=rA>>>0>>0?t+1|0:t,NA=rA,rA=t,E=NA,y=mA,NA=x(fA^$,YA^SA,32),t=hA+(mA=h)|0,tA=x(y^(z=YA=gA+NA|0),(YA=gA>>>0>z>>>0?t+1|0:t)^tA,24),t=(v=h)+rA|0,rA=$=E+(w=tA)|0,r[n+16>>2]=rA,t=w>>>0>rA>>>0?t+1|0:t,r[n+20>>2]=t,t=x(rA^NA,t^mA,16),RA=h,r[n+104>>2]=t,r[n+108>>2]=RA,rA=t,$=t+z|0,t=YA+RA|0,YA=$,r[n+64>>2]=YA,t=rA>>>0>YA>>>0?t+1|0:t,r[n+68>>2]=t,k=n,DA=x(w^YA,t^v,63),r[k+56>>2]=DA,r[n+60>>2]=h,t=D+a|0,t=(t=(rA=Y+r0|0)>>>0>>0?t+1|0:t)+F|0,r0=t=wA>>>0>(rA=wA+rA|0)>>>0?t+1|0:t,mA=x(rA^N,t^b,32),t=W+(z=h)|0,RA=t=yA>>>0>($=yA+mA|0)>>>0?t+1|0:t,tA=x($^Y,D^t,24),t=r0+(w=h)|0,t=rA>>>0>(NA=tA+rA|0)>>>0?t+1|0:t,rA=(r0=r[n+152>>2])+NA|0,t=r[n+156>>2]+t|0,t=rA>>>0>>0?t+1|0:t,r[n+24>>2]=rA,r[n+28>>2]=t,t=x(mA^rA,t^z,16),r[n+112>>2]=t,r0=h,r[n+116>>2]=r0,rA=t+$|0,t=RA+r0|0,RA=rA,r[n+72>>2]=RA,t=RA>>>0<$>>>0?t+1|0:t,r[n+76>>2]=t,k=n,DA=x(tA^RA,t^w,63),r[k+32>>2]=DA,r[n+36>>2]=h,t=r[n+68>>2]^(u[e+4|0]|u[e+5|0]<<8|u[e+6|0]<<16|u[e+7|0]<<24)^VA,RA=r[n+64>>2]^(u[0|e]|u[e+1|0]<<8|u[e+2|0]<<16|u[e+3|0]<<24)^U,p[0|e]=RA,p[e+1|0]=RA>>>8,p[e+2|0]=RA>>>16,p[e+3|0]=RA>>>24,p[e+4|0]=t,p[e+5|0]=t>>>8,p[e+6|0]=t>>>16,p[e+7|0]=t>>>24,VA=1;t=(RA=VA<<3)+e|0,YA=RA=n+RA|0,rA=r[RA>>2]^(u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24),r0=r[(RA=RA- -64|0)>>2],RA=r[RA+4>>2]^r[YA+4>>2]^(u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24),YA=rA^r0,p[0|t]=YA,p[t+1|0]=YA>>>8,p[t+2|0]=YA>>>16,p[t+3|0]=YA>>>24,p[t+4|0]=RA,p[t+5|0]=RA>>>8,p[t+6|0]=RA>>>16,p[t+7|0]=RA>>>24,(0|(VA=VA+1|0))!=8;);BA=n+256|0}function Ar(e,t,n,o){var a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0,aA=0,iA=0,hA=0,yA=0,fA=0,_A=0,wA=0,mA=0,bA=0,RA=0,j=0,rA=0;for(function(YA,SA){for(var NA=0,VA=0,XA=0,g0=0,$=0;g0=XA=(VA=NA<<3)+YA|0,$=vn(SA+VA|0),r[g0>>2]=$,r[XA+4>>2]=h,(0|(NA=NA+1|0))!=16;);}(n,t),t=V0(o,e,64),w=r[n>>2],Y=r[n+4>>2],o=0;;){if(a=x(b=r[(E=t)+32>>2],v=r[E+36>>2],14),i=h,a=x(b,v,18)^a,l=h^i,f=w,w=x(b,v,41)^a,a=(h^l)+Y|0,a=w>>>0>(i=f+w|0)>>>0?a+1|0:a,w=i,H=r[E+48>>2],w=(l=r[(Y=34784+(rA=o<<3)|0)>>2])+w|0,a=r[Y+4>>2]+a|0,a=w>>>0>>0?a+1|0:a,w=(Y=H^((O=r[E+40>>2])^H)&b)+w|0,a=(((f=r[E+52>>2])^(F=r[E+44>>2]))&v^f)+a|0,a=w>>>0>>0?a+1|0:a,i=(y=w)+(w=r[E+56>>2])|0,a=r[E+60>>2]+a|0,a=w>>>0>i>>>0?a+1|0:a,Y=i+(l=r[E+24>>2])|0,w=a,a=a+r[E+28>>2]|0,a=Y>>>0>>0?a+1|0:a,l=Y,U=a,r[E+24>>2]=Y,r[E+28>>2]=a,a=x(V=r[E>>2],Y=r[E+4>>2],28),N=h,a=x(V,Y,34)^a,s=h^N,N=i+(x(V,Y,39)^a)|0,a=w+(h^s)|0,a=i>>>0>N>>>0?a+1|0:a,i=(y=V&((s=r[E+16>>2])|(_=r[E+8>>2]))|s&_)+N|0,a=(Y&((N=r[E+20>>2])|(w=r[E+12>>2]))|w&N)+a|0,i=a=y>>>0>(D=i)>>>0?a+1|0:a,r[E+56>>2]=D,r[E+60>>2]=a,a=x(l,U,14),y=h,wA=x(l,U,18)^a,y^=h,c=s,a=((v^F)&U^F)+f|0,a=(s=(b^O)&l^O)>>>0>(H=s+H|0)>>>0?a+1|0:a,f=x(l,U,41)^wA,a=(h^y)+a|0,a=f>>>0>(H=f+H|0)>>>0?a+1|0:a,H=(y=r[(s=wA=(f=(1|o)<<3)+n|0)>>2])+H|0,a=r[s+4>>2]+a|0,a=y>>>0>H>>>0?a+1|0:a,H=(s=r[(f=f+34784|0)>>2])+H|0,a=r[f+4>>2]+a|0,s=a=s>>>0>H>>>0?a+1|0:a,a=a+N|0,N=H=c+(f=y=H)|0,f=a=f>>>0>H>>>0?a+1|0:a,r[E+16>>2]=H,r[E+20>>2]=a,H=E,a=x(D,i,28),E=h,W=x(D,i,34)^a,tA=h^E,E=(a=y)+(y=(_|V)&D|_&V)|0,a=((w|Y)&i|w&Y)+s|0,a=E>>>0>>0?a+1|0:a,s=x(D,i,39)^W,a=(h^tA)+a|0,W=E=s+E|0,E=a=E>>>0>>0?a+1|0:a,r[H+48>>2]=W,r[H+52>>2]=a,y=H,a=x(N,f,14),H=h,s=x(N,f,18)^a,tA=h^H,c=_,a=((v^U)&f^v)+F|0,a=(_=(l^b)&N^b)>>>0>(H=_+O|0)>>>0?a+1|0:a,s=x(N,f,41)^s,a=(h^tA)+a|0,a=s>>>0>(H=s+H|0)>>>0?a+1|0:a,H=(O=r[(_=hA=(s=(2|o)<<3)+n|0)>>2])+H|0,a=r[_+4>>2]+a|0,a=H>>>0>>0?a+1|0:a,H=(_=r[(s=s+34784|0)>>2])+H|0,a=r[s+4>>2]+a|0,a=_>>>0>H>>>0?a+1|0:a,H=c+(s=_=H)|0,c=w,w=a,a=c+a|0,s=a=s>>>0>H>>>0?a+1|0:a,r[y+8>>2]=H,r[y+12>>2]=a,a=x(W,E,28),O=h,F=x(W,E,34)^a,O^=h,a=((Y|i)&E|Y&i)+w|0,a=(_=(tA=(D|V)&W|D&V)+_|0)>>>0>>0?a+1|0:a,w=_,_=x(W,E,39)^F,a=(h^O)+a|0,O=w=w+_|0,w=a=w>>>0<_>>>0?a+1|0:a,r[y+40>>2]=O,r[y+44>>2]=a,_=y,a=x(H,s,14),y=h,F=x(H,s,18)^a,tA=h^y,c=V,a=(U^(f^U)&s)+v|0,a=(y=(V=l^(N^l)&H)+b|0)>>>0>>0?a+1|0:a,v=y,y=x(H,s,41)^F,a=(h^tA)+a|0,a=y>>>0>(v=v+y|0)>>>0?a+1|0:a,v=(F=r[(b=V=(y=(3|o)<<3)+n|0)>>2])+v|0,a=r[b+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,v=(b=r[(y=y+34784|0)>>2])+v|0,a=r[y+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,b=v,v=c+(y=v)|0,c=Y,Y=a,a=c+a|0,y=a=y>>>0>v>>>0?a+1|0:a,r[_>>2]=v,r[_+4>>2]=a,a=x(O,w,28),F=h,tA=x(O,w,34)^a,F^=h,a=((E|i)&w|E&i)+Y|0,a=(b=(iA=(D|W)&O|D&W)+b|0)>>>0>>0?a+1|0:a,Y=b,b=x(O,w,39)^tA,a=(h^F)+a|0,a=(Y=Y+b|0)>>>0>>0?a+1|0:a,b=Y,Y=a,r[_+32>>2]=b,r[_+36>>2]=a,a=x(v,y,14),F=h,tA=x(v,y,18)^a,F^=h,c=D,a=U+(f^(f^s)&y)|0,a=(D=l+(N^(H^N)&v)|0)>>>0>>0?a+1|0:a,U=x(v,y,41)^tA,a=(h^F)+a|0,a=U>>>0>(l=U+D|0)>>>0?a+1|0:a,l=(F=r[(D=yA=(U=(4|o)<<3)+n|0)>>2])+l|0,a=r[D+4>>2]+a|0,a=l>>>0>>0?a+1|0:a,l=(D=r[(U=U+34784|0)>>2])+l|0,a=r[U+4>>2]+a|0,U=i,i=a=D>>>0>l>>>0?a+1|0:a,a=U+a|0,U=a=(D=l)>>>0>(l=c+D|0)>>>0?a+1|0:a,r[_+56>>2]=l,r[_+60>>2]=a,a=x(b,Y,28),F=h,tA=x(b,Y,34)^a,F^=h,a=((E|w)&Y|E&w)+i|0,a=(D=(iA=(O|W)&b|O&W)+D|0)>>>0>>0?a+1|0:a,i=D,D=x(b,Y,39)^tA,a=(h^F)+a|0,F=i=i+D|0,i=a=D>>>0>i>>>0?a+1|0:a,r[_+24>>2]=F,r[_+28>>2]=a,a=x(l,U,14),D=h,tA=x(l,U,18)^a,iA=h^D,c=W,a=f+(s^(s^y)&U)|0,a=(D=N+(H^(v^H)&l)|0)>>>0>>0?a+1|0:a,f=x(l,U,41)^tA,a=(h^iA)+a|0,a=f>>>0>(N=f+D|0)>>>0?a+1|0:a,N=(tA=r[(D=W=(f=(5|o)<<3)+n|0)>>2])+N|0,a=r[D+4>>2]+a|0,a=N>>>0>>0?a+1|0:a,N=(D=r[(f=f+34784|0)>>2])+N|0,a=r[f+4>>2]+a|0,a=D>>>0>N>>>0?a+1|0:a,N=c+(f=D=N)|0,c=E,E=a,a=c+a|0,f=a=f>>>0>N>>>0?a+1|0:a,r[_+48>>2]=N,r[_+52>>2]=a,a=x(F,i,28),tA=h,iA=x(F,i,34)^a,tA^=h,a=((w|Y)&i|w&Y)+E|0,a=(D=(z=(b|O)&F|b&O)+D|0)>>>0>>0?a+1|0:a,E=D,D=x(F,i,39)^iA,a=(h^tA)+a|0,iA=E=E+D|0,E=a=E>>>0>>0?a+1|0:a,r[_+16>>2]=iA,r[_+20>>2]=a,a=x(N,f,14),D=h,tA=x(N,f,18)^a,z=h^D,c=O,a=s+(y^(y^U)&f)|0,a=(D=H+(v^(v^l)&N)|0)>>>0>>0?a+1|0:a,s=x(N,f,41)^tA,a=(h^z)+a|0,a=s>>>0>(H=s+D|0)>>>0?a+1|0:a,H=(O=r[(D=bA=(s=(6|o)<<3)+n|0)>>2])+H|0,a=r[D+4>>2]+a|0,a=H>>>0>>0?a+1|0:a,H=(D=r[(s=s+34784|0)>>2])+H|0,a=r[s+4>>2]+a|0,a=D>>>0>H>>>0?a+1|0:a,H=c+(s=D=H)|0,c=w,w=a,a=c+a|0,s=a=s>>>0>H>>>0?a+1|0:a,r[_+40>>2]=H,r[_+44>>2]=a,a=x(iA,E,28),O=h,tA=x(iA,E,34)^a,O^=h,a=((Y|i)&E|Y&i)+w|0,a=(D=(z=(F|b)&iA|F&b)+D|0)>>>0>>0?a+1|0:a,w=D,D=x(iA,E,39)^tA,a=(h^O)+a|0,z=w=w+D|0,w=a=w>>>0>>0?a+1|0:a,r[_+8>>2]=z,r[_+12>>2]=a,a=x(H,s,14),D=h,O=x(H,s,18)^a,tA=h^D,c=b,a=y+(U^(f^U)&s)|0,a=(D=v+(l^(N^l)&H)|0)>>>0>>0?a+1|0:a,y=x(H,s,41)^O,a=(h^tA)+a|0,a=y>>>0>(v=y+D|0)>>>0?a+1|0:a,v=(b=r[(D=O=(y=(7|o)<<3)+n|0)>>2])+v|0,a=r[D+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,v=(D=r[(y=y+34784|0)>>2])+v|0,a=r[y+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,v=c+(y=D=v)|0,c=Y,Y=a,a=c+a|0,y=a=y>>>0>v>>>0?a+1|0:a,r[_+32>>2]=v,r[_+36>>2]=a,a=x(z,w,28),b=h,tA=x(z,w,34)^a,b^=h,a=((E|i)&w|E&i)+Y|0,a=(D=(c=(F|iA)&z|F&iA)+D|0)>>>0>>0?a+1|0:a,Y=D,D=x(z,w,39)^tA,a=(h^b)+a|0,c=Y=Y+D|0,Y=a=D>>>0>Y>>>0?a+1|0:a,r[_>>2]=c,r[_+4>>2]=a,D=_,a=x(v,y,14),_=h,b=x(v,y,18)^a,tA=h^_,a=U+(f^(f^s)&y)|0,a=(_=l+(N^(H^N)&v)|0)>>>0>>0?a+1|0:a,U=x(v,y,41)^b,a=(h^tA)+a|0,a=U>>>0>(l=U+_|0)>>>0?a+1|0:a,l=(b=r[(_=tA=(U=(8|o)<<3)+n|0)>>2])+l|0,a=r[_+4>>2]+a|0,a=l>>>0>>0?a+1|0:a,l=(_=r[(U=U+34784|0)>>2])+l|0,a=r[U+4>>2]+a|0,a=_>>>0>l>>>0?a+1|0:a,b=l,_=i,i=a,a=_+a|0,_=a=(U=l)>>>0>(l=U+F|0)>>>0?a+1|0:a,r[D+24>>2]=l,r[D+28>>2]=a,U=D,a=x(c,Y,28),D=h,F=x(c,Y,34)^a,AA=h^D,D=(a=b)+(b=(z|iA)&c|z&iA)|0,a=((E|w)&Y|E&w)+i|0,a=D>>>0>>0?a+1|0:a,i=D,D=x(c,Y,39)^F,a=(h^AA)+a|0,AA=i=i+D|0,i=a=D>>>0>i>>>0?a+1|0:a,r[U+56>>2]=AA,r[U+60>>2]=a,a=x(l,_,14),D=h,b=x(l,_,18)^a,F=h^D,a=f+(s^(s^y)&_)|0,a=(D=N+(H^(v^H)&l)|0)>>>0>>0?a+1|0:a,f=x(l,_,41)^b,a=(h^F)+a|0,a=f>>>0>(N=f+D|0)>>>0?a+1|0:a,N=(F=r[(D=b=(f=(9|o)<<3)+n|0)>>2])+N|0,a=r[D+4>>2]+a|0,a=N>>>0>>0?a+1|0:a,N=(D=r[(f=f+34784|0)>>2])+N|0,a=r[f+4>>2]+a|0,a=D>>>0>N>>>0?a+1|0:a,D=E,E=a,a=D+a|0,D=a=(f=N)>>>0>(N=f+iA|0)>>>0?a+1|0:a,r[U+16>>2]=N,r[U+20>>2]=a,a=x(AA,i,28),F=h,iA=x(AA,i,34)^a,F^=h,a=((w|Y)&i|w&Y)+E|0,a=(f=(gA=(c|z)&AA|c&z)+f|0)>>>0>>0?a+1|0:a,E=f,f=x(AA,i,39)^iA,a=(h^F)+a|0,gA=E=E+f|0,E=a=E>>>0>>0?a+1|0:a,r[U+48>>2]=gA,r[U+52>>2]=a,a=x(N,D,14),f=h,F=x(N,D,18)^a,iA=h^f,a=s+(y^(_^y)&D)|0,a=(f=H+(v^(v^l)&N)|0)>>>0>>0?a+1|0:a,s=f,f=x(N,D,41)^F,a=(h^iA)+a|0,a=f>>>0>(H=s+f|0)>>>0?a+1|0:a,H=(F=r[(s=iA=(f=(10|o)<<3)+n|0)>>2])+H|0,a=r[s+4>>2]+a|0,a=H>>>0>>0?a+1|0:a,H=(s=r[(f=f+34784|0)>>2])+H|0,a=r[f+4>>2]+a|0,a=s>>>0>H>>>0?a+1|0:a,F=H,s=w,w=a,a=s+a|0,s=a=(f=H)>>>0>(H=f+z|0)>>>0?a+1|0:a,r[U+8>>2]=H,r[U+12>>2]=a,f=U,a=x(gA,E,28),U=h,z=x(gA,E,34)^a,fA=h^U,U=(a=F)+(F=(c|AA)&gA|c&AA)|0,a=((Y|i)&E|Y&i)+w|0,a=U>>>0>>0?a+1|0:a,w=U,U=x(gA,E,39)^z,a=(h^fA)+a|0,U=a=(w=w+U|0)>>>0>>0?a+1|0:a,r[f+40>>2]=w,r[f+44>>2]=a,a=x(H,s,14),F=h,z=x(H,s,18)^a,fA=h^F,aA=c,a=y+(_^(_^D)&s)|0,a=(F=v+(l^(N^l)&H)|0)>>>0>>0?a+1|0:a,y=x(H,s,41)^z,a=(h^fA)+a|0,a=y>>>0>(v=y+F|0)>>>0?a+1|0:a,v=(c=r[(F=(y=(11|o)<<3)+n|0)>>2])+v|0,a=r[F+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,v=(z=r[(y=y+34784|0)>>2])+v|0,a=r[y+4>>2]+a|0,a=v>>>0>>0?a+1|0:a,c=v,z=Y,Y=a,a=z+a|0,y=a=(y=v)>>>0>(v=aA+y|0)>>>0?a+1|0:a,r[f>>2]=v,r[f+4>>2]=a,z=f,a=x(w,U,28),f=h,fA=x(w,U,34)^a,_A=h^f,f=(a=c)+(c=(AA|gA)&w|AA&gA)|0,a=((E|i)&U|E&i)+Y|0,a=f>>>0>>0?a+1|0:a,Y=f,f=x(w,U,39)^fA,a=(h^_A)+a|0,f=a=f>>>0>(Y=Y+f|0)>>>0?a+1|0:a,r[z+32>>2]=Y,r[z+36>>2]=a,c=z,a=x(v,y,14),z=h,fA=x(v,y,18)^a,_A=h^z,aA=AA,a=_+(D^(s^D)&y)|0,a=(z=l+(N^(H^N)&v)|0)>>>0>>0?a+1|0:a,_=x(v,y,41)^fA,a=(h^_A)+a|0,a=_>>>0>(l=_+z|0)>>>0?a+1|0:a,l=(fA=r[(AA=z=(_=(12|o)<<3)+n|0)>>2])+l|0,a=r[AA+4>>2]+a|0,a=l>>>0>>0?a+1|0:a,l=(AA=r[(_=_+34784|0)>>2])+l|0,a=r[_+4>>2]+a|0,a=l>>>0>>0?a+1|0:a,AA=l,l=aA+(_=l)|0,aA=i,i=a,a=aA+a|0,fA=l,l=a=_>>>0>l>>>0?a+1|0:a,r[c+56>>2]=fA,r[c+60>>2]=a,_=c,a=x(Y,f,28),c=h,_A=x(Y,f,34)^a,aA=h^c,c=(a=AA)+(AA=(w|gA)&Y|w&gA)|0,a=((E|U)&f|E&U)+i|0,a=c>>>0>>0?a+1|0:a,i=c,c=x(Y,f,39)^_A,a=(h^aA)+a|0,AA=i=i+c|0,i=a=i>>>0>>0?a+1|0:a,r[_+24>>2]=AA,r[_+28>>2]=a,c=_,a=x(fA,l,14),_=h,_A=x(fA,l,18)^a,aA=h^_,mA=gA,a=D+(s^(s^y)&l)|0,a=(_=N+(H^(v^H)&fA)|0)>>>0>>0?a+1|0:a,D=_,_=x(fA,l,41)^_A,a=(h^aA)+a|0,a=_>>>0>(N=D+_|0)>>>0?a+1|0:a,_=(_=N)+(_A=r[(N=(D=(13|o)<<3)+n|0)>>2])|0,a=r[N+4>>2]+a|0,a=_>>>0<_A>>>0?a+1|0:a,_=(gA=r[(D=D+34784|0)>>2])+_|0,a=r[D+4>>2]+a|0,a=_>>>0>>0?a+1|0:a,gA=_,D=_,aA=E,E=a,a=aA+a|0,_A=_=mA+_|0,_=a=_>>>0>>0?a+1|0:a,r[c+48>>2]=_A,r[c+52>>2]=a,D=c,a=x(AA,i,28),c=h,aA=x(AA,i,34)^a,mA=h^c,c=(a=gA)+(gA=(w|Y)&AA|w&Y)|0,a=((f|U)&i|f&U)+E|0,a=c>>>0>>0?a+1|0:a,E=c,c=x(AA,i,39)^aA,a=(h^mA)+a|0,gA=E=E+c|0,E=a=E>>>0>>0?a+1|0:a,r[D+16>>2]=gA,r[D+20>>2]=a,a=x(_A,_,14),c=h,aA=x(_A,_,18)^a,mA=h^c,a=s+(y^(y^l)&_)|0,a=(c=H+(v^(v^fA)&_A)|0)>>>0>>0?a+1|0:a,s=x(_A,_,41)^aA,a=(h^mA)+a|0,a=s>>>0>(H=s+c|0)>>>0?a+1|0:a,s=(s=H)+(mA=r[(H=(c=(14|o)<<3)+n|0)>>2])|0,a=r[H+4>>2]+a|0,a=s>>>0>>0?a+1|0:a,s=(aA=r[(c=c+34784|0)>>2])+s|0,a=r[c+4>>2]+a|0,mA=s,c=a=s>>>0>>0?a+1|0:a,a=U+a|0,aA=s=w+s|0,w=a=s>>>0>>0?a+1|0:a,r[D+40>>2]=s,r[D+44>>2]=a,s=D,a=x(gA,E,28),U=h,D=x(gA,E,34)^a,RA=h^U,U=(a=mA)+(mA=(Y|AA)&gA|Y&AA)|0,a=((f|i)&E|f&i)+c|0,a=U>>>0>>0?a+1|0:a,D=x(gA,E,39)^D,a=(h^RA)+a|0,a=D>>>0>(U=D+U|0)>>>0?a+1|0:a,D=U,U=a,r[s+8>>2]=D,r[s+12>>2]=a,a=x(aA,w,14),s=h,mA=x(aA,w,18)^a,RA=h^s,a=y+(l^(_^l)&w)|0,a=(c=v+(fA^(fA^_A)&aA)|0)>>>0>>0?a+1|0:a,l=x(aA,w,41)^mA,a=(h^RA)+a|0,a=(w=l+c|0)>>>0>>0?a+1|0:a,w=(_=r[(y=l=(v=(15|o)<<3)+n|0)>>2])+w|0,a=r[y+4>>2]+a|0,a=w>>>0<_>>>0?a+1|0:a,w=(y=r[(v=v+34784|0)>>2])+w|0,a=r[v+4>>2]+a|0,a=w>>>0>>0?a+1|0:a,v=Y+(y=w)|0,w=a,a=f+a|0,r[(s=t)+32>>2]=v,r[s+36>>2]=v>>>0>>0?a+1|0:a,a=x(D,U,28),Y=h,f=x(D,U,34)^a,s=h^Y,a=((E|i)&U|E&i)+w|0,i=(v=(E=y)+(y=(AA|gA)&D|AA&gA)|0)+(E=x(D,U,39)^f)|0,a=(h^s)+(y>>>0>v>>>0?a+1|0:a)|0,r[(Y=t)>>2]=i,r[Y+4>>2]=E>>>0>i>>>0?a+1|0:a,(0|o)==64){for(;i=n=(o=j<<3)+e|0,o=(E=r[(a=t+o|0)>>2])+r[i>>2]|0,a=r[i+4>>2]+r[a+4>>2]|0,r[i>>2]=o,r[i+4>>2]=o>>>0>>0?a+1|0:a,(0|(j=j+1|0))!=8;);break}U=((o=o+16|0)<<3)+n|0,AA=i=r[H+4>>2],a=i>>>6|0,i=((63&i)<<26|(gA=r[H>>2])>>>6)^x(gA,i,19),a^=h,i=(f=x(gA,AA,61)^i)+(E=c=r[b>>2])|0,a=(Y=r[b+4>>2])+(h^a)|0,a=E>>>0>i>>>0?a+1|0:a,i=(w=r[(E=n+rA|0)>>2])+i|0,a=r[E+4>>2]+a|0,i=w>>>0>(f=i)>>>0?a+1|0:a,w=E=r[wA+4>>2],a=E>>>7|0,E=((127&E)<<25|(v=r[wA>>2])>>>7)^x(v,E,1),a^=h,y=f,f=x(v,w,8)^E,a=(h^a)+i|0,s=E=y+f|0,E=a=E>>>0>>0?a+1|0:a,r[U>>2]=s,r[U+4>>2]=a,a=r[(U=wA)+76>>2]+w|0,f=v,w=(v=r[U+72>>2])>>>0>(f=i=f+v|0)>>>0?a+1|0:a,i=v=r[l+4>>2],a=v>>>6|0,v=((63&v)<<26|(D=r[l>>2])>>>6)^x(D,v,19),a^=h,y=f,f=x(D,i,61)^v,a=(h^a)+w|0,w=f>>>0>(y=v=y+f|0)>>>0?a+1|0:a,v=f=r[U+12>>2],a=f>>>7|0,f=((127&f)<<25|(_=r[U+8>>2])>>>7)^x(_,f,1),a^=h,wA=y,y=x(_,v,8)^f,a=(h^a)+w|0,a=(f=wA+y|0)>>>0>>0?a+1|0:a,y=f,w=a,r[U+128>>2]=f,r[U+132>>2]=a,U=hA,f=v,a=x(s,E,19),hA=h,v=a,a=E>>>6|0,E=(E=x(s,E,61)^v^((63&E)<<26|s>>>6))+(s=wA=r[F>>2])|0,a=(v=r[F+4>>2])+(h^a^hA)|0,a=E>>>0>>0?a+1|0:a,s=E,a=a+f|0,_=E=E+_|0,E=E>>>0>>0?a+1|0:a,s=f=r[V+4>>2],a=f>>>7|0,f=((127&f)<<25|(hA=r[V>>2])>>>7)^x(hA,f,1),a^=h,aA=_,_=x(hA,s,8)^f,a=(h^a)+E|0,a=(f=aA+_|0)>>>0<_>>>0?a+1|0:a,_=f,E=a,r[U+128>>2]=f,r[U+132>>2]=a,U=(a=hA)+(hA=r[(f=V)+72>>2])|0,a=r[f+76>>2]+s|0,s=a=U>>>0>>0?a+1|0:a,a=x(y,w,19),hA=h,V=U,U=a,a=w>>>6|0,U=x(y,w,61)^U^((63&w)<<26|y>>>6),a=(h^a^hA)+s|0,hA=w=V+U|0,w=w>>>0>>0?a+1|0:a,U=s=r[f+12>>2],a=s>>>7|0,s=((127&s)<<25|(y=r[f+8>>2])>>>7)^x(y,s,1),a^=h,V=x(y,U,8)^s,a=(h^a)+w|0,a=(s=V+hA|0)>>>0>>0?a+1|0:a,V=s,w=a,r[f+128>>2]=s,r[f+132>>2]=a,f=yA,s=U,a=x(_,E,19),yA=h,aA=y,y=a,a=E>>>6|0,E=(E=x(_,E,61)^y^((63&E)<<26|_>>>6))+(y=hA=r[N>>2])|0,a=(U=r[N+4>>2])+(h^a^yA)|0,a=E>>>0>>0?a+1|0:a,y=E,a=a+s|0,yA=E=aA+E|0,E=E>>>0>>0?a+1|0:a,y=s=r[W+4>>2],a=s>>>7|0,s=((127&s)<<25|(_=r[W>>2])>>>7)^x(_,s,1),a^=h,aA=yA,yA=x(_,y,8)^s,a=(h^a)+E|0,a=(s=aA+yA|0)>>>0>>0?a+1|0:a,yA=s,E=a,r[f+128>>2]=s,r[f+132>>2]=a,f=(a=_)+(_=r[(s=W)+72>>2])|0,a=r[s+76>>2]+y|0,y=a=f>>>0<_>>>0?a+1|0:a,a=x(V,w,19),_=h,W=f,aA=a,a=(f=w)>>>6|0,f=aA^((63&f)<<26|V>>>6)^x(V,f,61),a=(h^a^_)+y|0,w=f>>>0>(_=w=W+f|0)>>>0?a+1|0:a,a=(f=y=r[s+12>>2])>>>7|0,y=((127&f)<<25|(W=r[s+8>>2])>>>7)^x(W,f,1),a^=h,V=_,_=x(W,f,8)^y,a=(h^a)+w|0,V=y=V+_|0,w=a=_>>>0>y>>>0?a+1|0:a,r[s+128>>2]=y,r[s+132>>2]=a,s=bA,y=f,a=x(yA,E,19),bA=h,f=a,a=E>>>6|0,f=x(yA,E,61)^f^((63&E)<<26|yA>>>6),a=(h^a^bA)+i|0,a=(E=f+D|0)>>>0>>0?a+1|0:a,f=E,a=a+y|0,W=E=E+W|0,E=E>>>0>>0?a+1|0:a,a=(f=_=r[O+4>>2])>>>7|0,_=((127&f)<<25|(y=r[O>>2])>>>7)^x(y,f,1),a^=h,yA=W,W=x(y,f,8)^_,a=(h^a)+E|0,E=a=(_=yA+W|0)>>>0>>0?a+1|0:a,r[s+128>>2]=_,r[s+132>>2]=a,a=r[(s=O)+76>>2]+f|0,y=(f=y=(W=r[s+72>>2])+y|0)>>>0>>0?a+1|0:a,a=x(V,w,19),W=h,yA=f,O=a,a=(f=w)>>>6|0,f=O^((63&f)<<26|V>>>6)^x(V,f,61),a=(h^a^W)+y|0,V=w=yA+f|0,w=f>>>0>w>>>0?a+1|0:a,a=(f=y=r[s+12>>2])>>>7|0,y=((127&f)<<25|(W=r[s+8>>2])>>>7)^x(W,f,1),a^=h,yA=V,V=x(W,f,8)^y,a=(h^a)+w|0,a=(y=yA+V|0)>>>0>>0?a+1|0:a,V=y,w=a,r[s+128>>2]=y,r[s+132>>2]=a,y=f,a=x(_,E,19),O=h,f=a,a=E>>>6|0,E=(E=x(_,E,61)^f^((63&E)<<26|_>>>6))+(f=r[(s=tA)+72>>2])|0,a=r[s+76>>2]+(h^a^O)|0,a=E>>>0>>0?a+1|0:a,f=E,a=a+y|0,f=a=(E=E+W|0)>>>0>>0?a+1|0:a,a=x(c,Y,1),y=h,W=E,_=a,a=(E=Y)>>>7|0,_=_^((127&E)<<25|c>>>7)^x(c,E,8),a=(h^a^y)+f|0,y=E=W+_|0,E=a=E>>>0<_>>>0?a+1|0:a,r[s+128>>2]=y,r[s+132>>2]=a,a=r[(f=b)+76>>2]+Y|0,Y=s=(_=r[f+72>>2])+c|0,s=s>>>0<_>>>0?a+1|0:a,a=x(V,w,19),_=h,c=Y,Y=a,a=w>>>6|0,Y=x(V,w,61)^Y^((63&w)<<26|V>>>6),a=(h^a^_)+s|0,w=(_=w=c+Y|0)>>>0>>0?a+1|0:a,Y=s=r[f+12>>2],a=s>>>7|0,s=((127&s)<<25|(V=r[f+8>>2])>>>7)^x(V,s,1),a^=h,c=_,_=x(V,Y,8)^s,a=(h^a)+w|0,a=(s=c+_|0)>>>0<_>>>0?a+1|0:a,_=s,w=a,r[f+128>>2]=s,r[f+132>>2]=a,s=Y,a=x(y,E,19),W=h,f=a,a=E>>>6|0,E=(E=x(y,E,61)^f^((63&E)<<26|y>>>6))+(Y=r[(f=iA)+72>>2])|0,a=r[f+76>>2]+(h^a^W)|0,a=E>>>0>>0?a+1|0:a,Y=E,a=a+s|0,Y=a=(E=E+V|0)>>>0>>0?a+1|0:a,a=x(wA,v,1),s=h,c=E,y=a,a=(E=v)>>>7|0,y=y^((127&E)<<25|wA>>>7)^x(wA,E,8),a=(h^a^s)+Y|0,s=E=c+y|0,E=a=E>>>0>>0?a+1|0:a,r[f+128>>2]=s,r[f+132>>2]=a,Y=(y=r[(f=F)+72>>2])+wA|0,a=r[f+76>>2]+v|0,v=a=y>>>0>Y>>>0?a+1|0:a,a=x(_,w,19),y=h,c=Y,Y=a,a=w>>>6|0,Y=x(_,w,61)^Y^((63&w)<<26|_>>>6),a=(h^a^y)+v|0,w=(y=w=c+Y|0)>>>0>>0?a+1|0:a,Y=v=r[f+12>>2],a=v>>>7|0,v=((127&v)<<25|(_=r[f+8>>2])>>>7)^x(_,v,1),a^=h,c=y,y=x(_,Y,8)^v,a=(h^a)+w|0,a=y>>>0>(v=c+y|0)>>>0?a+1|0:a,y=v,w=a,r[f+128>>2]=y,r[f+132>>2]=a,f=Y,a=x(s,E,19),wA=h,Y=a,a=E>>>6|0,E=(E=x(s,E,61)^Y^((63&E)<<26|s>>>6))+(Y=r[(v=z)+72>>2])|0,a=r[v+76>>2]+(h^a^wA)|0,a=E>>>0>>0?a+1|0:a,Y=E,a=a+f|0,Y=a=(E=E+_|0)>>>0>>0?a+1|0:a,a=x(hA,U,1),f=h,_=E,s=a,a=(E=U)>>>7|0,s=s^((127&E)<<25|hA>>>7)^x(hA,E,8),a=(h^a^f)+Y|0,f=E=_+s|0,E=a=E>>>0>>0?a+1|0:a,r[v+128>>2]=f,r[v+132>>2]=a,v=(s=r[(Y=N)+72>>2])+hA|0,a=r[Y+76>>2]+U|0,U=a=s>>>0>v>>>0?a+1|0:a,a=x(y,w,19),s=h,_=v,v=a,a=w>>>6|0,v=x(y,w,61)^v^((63&w)<<26|y>>>6),a=(h^a^s)+U|0,w=(s=w=_+v|0)>>>0>>0?a+1|0:a,U=v=r[Y+12>>2],a=v>>>7|0,v=((127&v)<<25|(N=r[Y+8>>2])>>>7)^x(N,v,1),a^=h,v=x(N,U,8)^v,a=(h^a)+w|0,a=v>>>0>(N=v+s|0)>>>0?a+1|0:a,v=N,w=a,r[Y+128>>2]=v,r[Y+132>>2]=a,N=(U=r[(Y=H)+72>>2])+gA|0,a=r[Y+76>>2]+AA|0,H=a=U>>>0>N>>>0?a+1|0:a,a=x(f,E,19),U=h,y=N,s=a,a=E>>>6|0,N=x(f,E,61)^s^((63&E)<<26|f>>>6),a=(h^a^U)+H|0,N=a=(E=y+N|0)>>>0>>0?a+1|0:a,a=x(D,i,1),H=h,f=E,y=a,a=(E=i)>>>7|0,E=f+(U=y^((127&E)<<25|D>>>7)^x(D,E,8))|0,a=(h^a^H)+N|0,r[Y+128>>2]=E,r[Y+132>>2]=E>>>0>>0?a+1|0:a,a=r[(E=l)+76>>2]+i|0,i=Y=(N=r[E+72>>2])+D|0,Y=Y>>>0>>0?a+1|0:a,a=x(v,w,19),N=h,f=a,a=w>>>6|0,w=x(v,w,61)^f^((63&w)<<26|v>>>6),a=(h^a^N)+Y|0,i=w>>>0>(H=i=w+i|0)>>>0?a+1|0:a,l=((127&(Y=N=r[E+12>>2]))<<25|(w=r[E+8>>2])>>>7)^x(w,Y,1),a=h^Y>>>7,l=(N=x(w,Y,8)^l)+H|0,a=(h^a)+i|0,r[E+128>>2]=l,r[E+132>>2]=N>>>0>l>>>0?a+1|0:a}}function YB(e){var t,n,o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l=0,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0,aA=0,iA=0,hA=0,yA=0,fA=0,_A=0,wA=0,mA=0,bA=0,RA=0,j=0,rA=0,YA=0,SA=0,NA=0,VA=0,XA=0,g0=0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0,E0=0,B0=0,n0=0,X=0;U=U0(e),H=u[e+2|0]|u[e+3|0]<<8|u[e+4|0]<<16|u[e+5|0]<<24,i=U0(e+5|0),c=h,r0=u[e+7|0]|u[e+8|0]<<8|u[e+9|0]<<16|u[e+10|0]<<24,o0=u[e+10|0]|u[e+11|0]<<8|u[e+12|0]<<16|u[e+13|0]<<24,N=U0(e+13|0),E0=h,fA=u[e+15|0]|u[e+16|0]<<8|u[e+17|0]<<16|u[e+18|0]<<24,$=U0(e+18|0),_A=h,gA=U0(e+21|0),O=u[e+23|0]|u[e+24|0]<<8|u[e+25|0]<<16|u[e+26|0]<<24,W=U0(e+26|0),F=h,t0=u[e+28|0]|u[e+29|0]<<8|u[e+30|0]<<16|u[e+31|0]<<24,YA=u[e+31|0]|u[e+32|0]<<8|u[e+33|0]<<16|u[e+34|0]<<24,XA=U0(e+34|0),VA=h,wA=u[e+36|0]|u[e+37|0]<<8|u[e+38|0]<<16|u[e+39|0]<<24,cA=U0(e+39|0),bA=h,tA=U0(e+42|0),V=u[e+44|0]|u[e+45|0]<<8|u[e+46|0]<<16|u[e+47|0]<<24,b=U0(e+47|0),l=2097151&((3&F)<<30|W>>>2),W=K(t=2097151&((3&(z=h))<<30|b>>>2),0,136657,0)+l|0,F=h,F=l>>>0>W>>>0?F+1|0:F,b=K(n=(u[e+49|0]|u[e+50|0]<<8|u[e+51|0]<<16|u[e+52|0]<<24)>>>7&2097151,0,-997805,-1),l=h+F|0,l=b>>>0>(W=b+W|0)>>>0?l+1|0:l,F=K(o=(u[e+52|0]|u[e+53|0]<<8|u[e+54|0]<<16|u[e+55|0]<<24)>>>4&2097151,0,654183,0),b=h+l|0,b=F>>>0>(W=F+W|0)>>>0?b+1|0:b,l=W,F=U0(e+55|0),W=l+(F=K(a=2097151&((1&(W=h))<<31|F>>>1),0,470296,0))|0,l=h+b|0,l=F>>>0>W>>>0?l+1|0:l,b=K(f=(u[e+57|0]|u[e+58|0]<<8|u[e+59|0]<<16|u[e+60|0]<<24)>>>6&2097151,0,666643,0),F=h+l|0,iA=F=b>>>0>(W=b+W|0)>>>0?F+1|0:F,b=F,AA=V>>>5&2097151,F=2097151&tA,V=K(E=(u[e+60|0]|u[e+61|0]<<8|u[e+62|0]<<16|u[e+63|0]<<24)>>>3|0,0,-683901,-1)+F|0,l=h,tA=V,hA=l=F>>>0>V>>>0?l+1|0:l,yA=(l=V)- -1048576|0,j=V=hA-((l>>>0<4293918720)-1|0)|0,l=V>>21,y=AA=(V=(2097151&V)<<11|yA>>>21)+AA|0,NA=F=V>>>0>AA>>>0?l+1|0:l,l=K(AA,F,-683901,-1),F=h+b|0,g0=z=l+W|0,aA=l>>>0>z>>>0?F+1|0:F,b=O>>>5&2097151,z=K(t,0,-997805,-1)+b|0,l=h,l=b>>>0>z>>>0?l+1|0:l,F=K(n,0,654183,0),b=h+l|0,b=F>>>0>(z=F+z|0)>>>0?b+1|0:b,l=K(o,0,470296,0),F=h+b|0,F=l>>>0>(z=l+z|0)>>>0?F+1|0:F,b=K(a,0,666643,0),l=h+F|0,b=b>>>0>(O=z=b+z|0)>>>0?l+1|0:l,l=2097151&gA,z=K(t,0,654183,0)+l|0,F=h,F=l>>>0>z>>>0?F+1|0:F,V=(l=z)+(z=K(n,0,470296,0))|0,l=h+F|0,l=V>>>0>>0?l+1|0:l,z=K(o,0,666643,0),F=h+l|0,AA=V=z+V|0,V=F=V>>>0>>0?F+1|0:F,zA=(l=AA)- -1048576|0,mA=z=F-((l>>>0<4293918720)-1|0)|0,b=(l=z>>>21|0)+b|0,gA=b=(F=(2097151&z)<<11|zA>>>21)>>>0>(O=z=F+O|0)>>>0?b+1|0:b,rA=(l=O)- -1048576|0,v=W- -1048576|0,iA=iA-((W>>>0<4293918720)-1|0)|0,F=(l=(b=RA=b-((l>>>0<4293918720)-1|0)|0)>>21)+aA|0,iA=(F=(W=(2097151&b)<<11|rA>>>21)>>>0>(RA=W+g0|0)>>>0?F+1|0:F)-(((l=-2097152&v)>>>0>(W=RA)>>>0)+(z=iA)|0)|0,B0=(l=W-l|0)-(F=-2097152&(Y=l- -1048576|0))|0,n0=iA-((l>>>0>>0)+(W=iA-((l>>>0<4293918720)-1|0)|0)|0)|0,F=K(y,NA,136657,0)+O|0,l=gA+h|0,l=F>>>0>>0?l+1|0:l,ZA=(O=F)-(F=-2097152&rA)|0,g0=l-((F>>>0>O>>>0)+b|0)|0,iA=tA-(l=-2097152&yA)|0,aA=hA-((l>>>0>tA>>>0)+j|0)|0,l=2097151&((7&bA)<<29|cA>>>3),b=K(E,0,136657,0)+l|0,F=h,F=l>>>0>b>>>0?F+1|0:F,O=(l=b)+(b=K(f,0,-683901,-1))|0,l=h+F|0,tA=O,O=b>>>0>O>>>0?l+1|0:l,l=K(a,0,-683901,-1),F=h,b=l,F=(l=wA>>>6&2097151)>>>0>(b=b+l|0)>>>0?F+1|0:F,gA=(l=K(E,0,-997805,-1))+b|0,b=h+F|0,b=l>>>0>gA>>>0?b+1|0:b,F=K(f,0,136657,0),l=h+b|0,rA=F=(yA=l=F>>>0>(gA=F+gA|0)>>>0?l+1|0:l)-(((l=gA)>>>0<4293918720)-1|0)|0,l=(2097151&F)<<11|(cA=l- -1048576|0)>>>21,F=(F>>21)+O|0,hA=F=l>>>0>(tA=l+tA|0)>>>0?F+1|0:F,RA=(l=tA)- -1048576|0,j=F=F-((l>>>0<4293918720)-1|0)|0,l=(b=F>>21)+aA|0,_=O=(F=(2097151&F)<<11|RA>>>21)+iA|0,SA=l=F>>>0>O>>>0?l+1|0:l,F=K(O,l,-683901,-1),l=h+g0|0,X=b=F+ZA|0,wA=F>>>0>b>>>0?l+1|0:l,aA=AA,l=2097151&((7&_A)<<29|$>>>3),b=K(t,0,470296,0)+l|0,F=h,F=l>>>0>b>>>0?F+1|0:F,l=K(n,0,666643,0),F=h+F|0,iA=b=l+b|0,b=l>>>0>b>>>0?F+1|0:F,O=fA>>>6&2097151,AA=K(t,0,666643,0)+O|0,l=h,_A=O=(fA=l=O>>>0>AA>>>0?l+1|0:l)-(((l=AA)>>>0<4293918720)-1|0)|0,F=(F=O>>>21|0)+b|0,bA=F=(l=(2097151&O)<<11|(ZA=l- -1048576|0)>>>21)>>>0>(O=l+iA|0)>>>0?F+1|0:F,$=F-(((l=O)>>>0<4293918720)-1|0)|0,g0=l- -1048576|0,s=tA-(l=-2097152&RA)|0,w=b=hA-((l>>>0>tA>>>0)+j|0)|0,l=((iA=$)>>>21|0)+V|0,l=(tA=(2097151&iA)<<11|g0>>>21)>>>0>(aA=tA+aA|0)>>>0?l+1|0:l,aA=(V=K(y,NA,-997805,-1))+((tA=aA)-(F=-2097152&zA)|0)|0,F=h+(l-((8191&mA)+(F>>>0>tA>>>0)|0)|0)|0,F=V>>>0>aA>>>0?F+1|0:F,l=K(_,SA,136657,0),F=h+F|0,F=l>>>0>(V=l+aA|0)>>>0?F+1|0:F,b=K(s,b,-683901,-1),l=h+F|0,hA=l=b>>>0>(V=b+V|0)>>>0?l+1|0:l,RA=(l=V)- -1048576|0,j=b=hA-((l>>>0<4293918720)-1|0)|0,F=(l=b>>21)+wA|0,aA=F=(b=(2097151&b)<<11|RA>>>21)>>>0>(tA=b+X|0)>>>0?F+1|0:F,mA=(l=b=tA)- -1048576|0,l=(l=(tA=wA=F-((l>>>0<4293918720)-1|0)|0)>>21)+n0|0,B0=wA=(F=(2097151&tA)<<11|mA>>>21)+B0|0,wA=F>>>0>wA>>>0?l+1|0:l,n0=b-(l=-2097152&mA)|0,X=aA-((l>>>0>b>>>0)+tA|0)|0,$=V-(l=-2097152&RA)|0,zA=hA-((l>>>0>V>>>0)+j|0)|0,l=K(y,NA,654183,0),b=h+(bA-((8191&iA)+((F=-2097152&g0)>>>0>O>>>0)|0)|0)|0,b=l>>>0>(V=l+(O-F|0)|0)>>>0?b+1|0:b,F=K(_,SA,-997805,-1),l=h+b|0,l=F>>>0>(V=F+V|0)>>>0?l+1|0:l,b=K(s,w,136657,0),F=h+l|0,RA=V=b+V|0,tA=b>>>0>V>>>0?F+1|0:F,mA=gA-(l=-2097152&cA)|0,bA=yA-((l>>>0>gA>>>0)+rA|0)|0,F=2097151&((1&VA)<<31|XA>>>1),V=K(o,0,-683901,-1)+F|0,l=h,l=F>>>0>V>>>0?l+1|0:l,F=K(a,0,136657,0),l=h+l|0,l=F>>>0>(b=F+V|0)>>>0?l+1|0:l,V=(F=b)+(b=K(E,0,654183,0))|0,F=h+l|0,F=b>>>0>V>>>0?F+1|0:F,l=K(f,0,-997805,-1),F=h+F|0,gA=b=l+V|0,V=l>>>0>b>>>0?F+1|0:F,l=K(n,0,-683901,-1),b=h,F=l,b=(l=YA>>>4&2097151)>>>0>(F=F+l|0)>>>0?b+1|0:b,O=(l=F)+(F=K(o,0,136657,0))|0,l=h+b|0,l=F>>>0>O>>>0?l+1|0:l,b=K(a,0,-997805,-1),F=h+l|0,F=b>>>0>(O=b+O|0)>>>0?F+1|0:F,b=K(E,0,470296,0),l=h+F|0,l=b>>>0>(O=b+O|0)>>>0?l+1|0:l,b=K(f,0,654183,0),F=h+l|0,hA=F=b>>>0>(O=b+O|0)>>>0?F+1|0:F,rA=(l=O)- -1048576|0,j=b=F-((l>>>0<4293918720)-1|0)|0,l=(l=b>>21)+V|0,V=b=(F=(2097151&b)<<11|rA>>>21)+gA|0,aA=l=F>>>0>b>>>0?l+1|0:l,iA=(l=b)- -1048576|0,gA=b=aA-((l>>>0<4293918720)-1|0)|0,F=(l=b>>21)+bA|0,D=yA=(b=(2097151&b)<<11|iA>>>21)+mA|0,YA=F=b>>>0>yA>>>0?F+1|0:F,l=K(yA,F,-683901,-1),b=h+tA|0,bA=F=l+RA|0,tA=l>>>0>F>>>0?b+1|0:b,XA=V-(l=-2097152&iA)|0,VA=gA=aA-((l>>>0>V>>>0)+gA|0)|0,b=(l=K(y,NA,470296,0))+(AA-(F=-2097152&ZA)|0)|0,F=h+(fA-((2047&_A)+(F>>>0>AA>>>0)|0)|0)|0,F=l>>>0>b>>>0?F+1|0:F,l=K(_,SA,654183,0),F=h+F|0,F=l>>>0>(b=l+b|0)>>>0?F+1|0:F,V=(l=K(s,w,-997805,-1))+b|0,b=h+F|0,b=l>>>0>V>>>0?b+1|0:b,F=K(yA,YA,136657,0),l=h+b|0,l=F>>>0>(V=F+V|0)>>>0?l+1|0:l,b=K(XA,gA,-683901,-1),F=h+l|0,aA=F=b>>>0>(V=b+V|0)>>>0?F+1|0:F,_A=(l=V)- -1048576|0,gA=b=F-((l>>>0<4293918720)-1|0)|0,l=(l=b>>21)+tA|0,tA=l=(F=(2097151&b)<<11|_A>>>21)>>>0>(b=F+bA|0)>>>0?l+1|0:l,iA=(l=b)- -1048576|0,F=(l=(AA=bA=tA-((l>>>0<4293918720)-1|0)|0)>>21)+zA|0,$=fA=(bA=(2097151&AA)<<11|iA>>>21)+$|0,bA=fA>>>0>>0?F+1|0:F,zA=b-(l=-2097152&iA)|0,cA=tA-((l>>>0>b>>>0)+AA|0)|0,RA=V-(l=-2097152&_A)|0,yA=aA-((l>>>0>V>>>0)+gA|0)|0,F=2097151&((1&E0)<<31|N>>>1),V=K(y,NA,666643,0)+F|0,l=h,l=F>>>0>V>>>0?l+1|0:l,b=K(_,SA,470296,0),F=h+l|0,F=b>>>0>(V=b+V|0)>>>0?F+1|0:F,b=K(s,w,654183,0),l=h+F|0,l=b>>>0>(V=b+V|0)>>>0?l+1|0:l,F=K(D,YA,-997805,-1),b=h+l|0,b=F>>>0>(V=F+V|0)>>>0?b+1|0:b,l=K(XA,VA,136657,0),F=h+b|0,gA=V=l+V|0,AA=l>>>0>V>>>0?F+1|0:F,tA=O-(l=-2097152&rA)|0,O=hA-((l>>>0>O>>>0)+j|0)|0,l=K(t,0,-683901,-1),F=h,b=l,F=(l=t0>>>7&2097151)>>>0>(b=b+l|0)>>>0?F+1|0:F,V=(l=K(n,0,136657,0))+b|0,b=h+F|0,b=l>>>0>V>>>0?b+1|0:b,F=K(o,0,-997805,-1),l=h+b|0,l=F>>>0>(V=F+V|0)>>>0?l+1|0:l,b=K(a,0,654183,0),F=h+l|0,F=b>>>0>(V=b+V|0)>>>0?F+1|0:F,b=K(E,0,666643,0),l=h+F|0,l=b>>>0>(V=b+V|0)>>>0?l+1|0:l,b=K(f,0,470296,0),F=h+l|0,l=F=b>>>0>(V=b+V|0)>>>0?F+1|0:F,F=z>>21,V=(z=(2097151&z)<<11|v>>>21)+(b=V)|0,b=l+F|0,j=b=V>>>0>>0?b+1|0:b,hA=(l=V)- -1048576|0,aA=b=b-((l>>>0<4293918720)-1|0)|0,l=(F=b>>21)+O|0,NA=z=(b=(2097151&b)<<11|hA>>>21)+tA|0,mA=l=b>>>0>z>>>0?l+1|0:l,l=K(z,l,-683901,-1),F=h+AA|0,AA=b=l+gA|0,z=l>>>0>b>>>0?F+1|0:F,l=K(_,SA,666643,0),b=h,F=l,b=(l=o0>>>4&2097151)>>>0>(F=F+l|0)>>>0?b+1|0:b,O=(l=F)+(F=K(s,w,470296,0))|0,l=h+b|0,l=F>>>0>O>>>0?l+1|0:l,b=K(D,YA,654183,0),F=h+l|0,F=b>>>0>(O=b+O|0)>>>0?F+1|0:F,l=K(XA,VA,-997805,-1),F=h+F|0,F=l>>>0>(b=l+O|0)>>>0?F+1|0:F,O=(l=b)+(b=K(NA,mA,136657,0))|0,l=h+F|0,gA=l=b>>>0>O>>>0?l+1|0:l,fA=(l=O)- -1048576|0,tA=b=gA-((l>>>0<4293918720)-1|0)|0,l=(F=b>>21)+z|0,b=l=(b=(2097151&b)<<11|fA>>>21)>>>0>(z=AA=b+AA|0)>>>0?l+1|0:l,_A=(l=z)- -1048576|0,l=(F=(AA=iA=b-((l>>>0<4293918720)-1|0)|0)>>21)+yA|0,ZA=rA=(iA=(2097151&AA)<<11|_A>>>21)+RA|0,iA=iA>>>0>rA>>>0?l+1|0:l,l=V-(F=-2097152&hA)|0,V=j-((F>>>0>V>>>0)+aA|0)|0,aA=l,l=(l=W>>21)+V|0,hA=l=(F=(2097151&W)<<11|Y>>>21)>>>0>(V=W=aA+F|0)>>>0?l+1|0:l,rA=(l=V)- -1048576|0,j=W=hA-((l>>>0<4293918720)-1|0)|0,yA=l=W>>21,l=K(SA=(2097151&W)<<11|rA>>>21,l,-683901,-1),F=h+b|0,F=l>>>0>(W=l+z|0)>>>0?F+1|0:F,g0=(b=W)-(l=-2097152&_A)|0,RA=F-((l>>>0>b>>>0)+AA|0)|0,F=K(SA,yA,136657,0)+O|0,l=gA+h|0,l=F>>>0>>0?l+1|0:l,t0=(b=F)-(F=-2097152&fA)|0,fA=l-((F>>>0>b>>>0)+tA|0)|0,l=K(s,w,666643,0),F=h,b=l,F=(l=r0>>>7&2097151)>>>0>(b=b+l|0)>>>0?F+1|0:F,W=(l=K(D,YA,470296,0))+b|0,b=h+F|0,b=l>>>0>W>>>0?b+1|0:b,F=K(XA,VA,654183,0),l=h+b|0,l=F>>>0>(W=F+W|0)>>>0?l+1|0:l,F=K(NA,mA,-997805,-1),l=h+l|0,tA=b=F+W|0,b=F>>>0>b>>>0?l+1|0:l,l=2097151&((3&c)<<30|i>>>2),W=K(D,YA,666643,0)+l|0,F=h,F=l>>>0>W>>>0?F+1|0:F,l=K(XA,VA,470296,0),F=h+F|0,F=l>>>0>(W=l+W|0)>>>0?F+1|0:F,z=(l=W)+(W=K(NA,mA,654183,0))|0,l=h+F|0,AA=l=W>>>0>z>>>0?l+1|0:l,_A=(l=W=z)- -1048576|0,l=(F=(O=z=AA-((l>>>0<4293918720)-1|0)|0)>>21)+b|0,gA=tA=(z=(2097151&O)<<11|_A>>>21)+tA|0,b=l=z>>>0>tA>>>0?l+1|0:l,tA=(l=tA)- -1048576|0,l=(F=(z=aA=b-((l>>>0<4293918720)-1|0)|0)>>21)+fA|0,r0=YA=(aA=(2097151&z)<<11|tA>>>21)+t0|0,aA=aA>>>0>YA>>>0?l+1|0:l,l=K(SA,yA,-997805,-1),b=h+b|0,b=l>>>0>(F=l+gA|0)>>>0?b+1|0:b,o0=F-(l=-2097152&tA)|0,E0=b-((l>>>0>F>>>0)+z|0)|0,l=K(SA,yA,654183,0)+W|0,F=AA+h|0,F=l>>>0>>0?F+1|0:F,t0=(b=l)-(l=-2097152&_A)|0,YA=F-((l>>>0>b>>>0)+O|0)|0,l=K(XA,VA,666643,0),b=h,F=l,b=(l=H>>>5&2097151)>>>0>(F=F+l|0)>>>0?b+1|0:b,W=(l=F)+(F=K(NA,mA,470296,0))|0,l=h+b|0,O=W,b=F>>>0>W>>>0?l+1|0:l,F=2097151&U,W=K(NA,mA,666643,0)+F|0,l=h,z=W,tA=W=(gA=l=F>>>0>W>>>0?l+1|0:l)-(((l=W)>>>0<4293918720)-1|0)|0,b=(F=W>>21)+b|0,AA=b=(l=(2097151&W)<<11|(fA=l- -1048576|0)>>>21)>>>0>(W=l+O|0)>>>0?b+1|0:b,_A=(l=W)- -1048576|0,O=b=b-((l>>>0<4293918720)-1|0)|0,l=(F=b>>21)+YA|0,b=l=(b=(2097151&b)<<11|_A>>>21)>>>0>(mA=b+t0|0)>>>0?l+1|0:l,l=K(SA,yA,470296,0)+W|0,F=AA+h|0,O=(F=l>>>0>>0?F+1|0:F)-(((W=-2097152&_A)>>>0>(AA=l)>>>0)+O|0)|0,AA=l=l-W|0,W=(F=K(SA,yA,666643,0))+(z-(l=-2097152&fA)|0)|0,l=h+(gA-((l>>>0>z>>>0)+tA|0)|0)|0,z=W,F=(F=(l=F>>>0>W>>>0?l+1|0:l)>>21)+O|0,VA=W=AA+(l=(2097151&l)<<11|W>>>21)|0,b=(l=(F=l>>>0>W>>>0?F+1|0:F)>>21)+b|0,O=W=(F=(2097151&F)<<11|W>>>21)+mA|0,F=(b=F>>>0>(l=W)>>>0?b+1|0:b)>>21,b=(2097151&b)<<11|l>>>21,l=F+E0|0,tA=W=b+o0|0,b=(l=b>>>0>(F=W)>>>0?l+1|0:l)>>21,l=(2097151&l)<<11|F>>>21,F=b+aA|0,aA=W=l+r0|0,l=(l=(F=l>>>0>(b=W)>>>0?F+1|0:F)>>21)+RA|0,mA=b=(F=(2097151&F)<<11|b>>>21)+g0|0,F=(F=(l=F>>>0>b>>>0?l+1|0:l)>>21)+iA|0,yA=b=(l=(2097151&l)<<11|b>>>21)+ZA|0,l=(F=l>>>0>b>>>0?F+1|0:F)>>21,F=(2097151&F)<<11|b>>>21,b=l+cA|0,fA=W=F+zA|0,F=(b=F>>>0>(l=W)>>>0?b+1|0:b)>>21,b=(2097151&b)<<11|l>>>21,l=F+bA|0,_A=W=b+$|0,b=(l=b>>>0>(F=W)>>>0?l+1|0:l)>>21,l=(2097151&l)<<11|F>>>21,F=b+X|0,bA=W=l+n0|0,l=(l=(F=l>>>0>(b=W)>>>0?F+1|0:F)>>21)+wA|0,iA=b=(F=(2097151&F)<<11|b>>>21)+B0|0,F=(l=F>>>0>b>>>0?l+1|0:l)>>21,W=(2097151&l)<<11|b>>>21,l=V-(b=-2097152&rA)|0,b=(hA-((b>>>0>V>>>0)+j|0)|0)+F|0,j=W=W+l|0,wA=(2097151&(b=l>>>0>(F=W)>>>0?b+1|0:b))<<11|F>>>21,gA=l=b>>21,F=2097151&z,b=K(wA,l,666643,0)+F|0,l=h,AA=b,W=l=F>>>0>b>>>0?l+1|0:l,p[0|e]=b,p[e+1|0]=(255&l)<<24|b>>>8,l=2097151&VA,b=K(wA,gA,470296,0)+l|0,F=h,F=l>>>0>b>>>0?F+1|0:F,z=b,V=(2097151&(b=W))<<11|AA>>>21,b=(l=b>>21)+F|0,b=V>>>0>(hA=z+V|0)>>>0?b+1|0:b,V=hA,p[e+4|0]=(2047&b)<<21|V>>>11,l=F=b,b=V,p[e+3|0]=(7&l)<<29|b>>>3,b=2097151&O,O=K(wA,gA,654183,0)+b|0,l=h,l=b>>>0>O>>>0?l+1|0:l,b=O,O=(2097151&F)<<11|V>>>21,F=(F>>21)+l|0,F=O>>>0>(hA=b+O|0)>>>0?F+1|0:F,O=hA,l=F,p[e+6|0]=(63&l)<<26|O>>>6,z=0,b=31&((65535&W)<<16|AA>>>16),F=AA=2097151&V,p[e+2|0]=b|F<<5,b=2097151&tA,V=K(wA,gA,-997805,-1)+b|0,F=h,b=F=b>>>0>V>>>0?F+1|0:F,b=(F=l>>21)+b|0,tA=V=(l=(2097151&l)<<11|O>>>21)+V|0,b=l>>>0>V>>>0?b+1|0:b,p[e+9|0]=(511&b)<<23|V>>>9,l=F=b,b=V,p[e+8|0]=(1&l)<<31|b>>>1,V=0,b=O&=2097151,p[e+5|0]=(524287&z)<<13|AA>>>19|b<<2,b=2097151&aA,z=K(wA,gA,136657,0)+b|0,l=h,l=(l=b>>>0>z>>>0?l+1|0:l)+(b=F>>21)|0,AA=z=(F=(2097151&F)<<11|tA>>>21)+z|0,l=F>>>0>z>>>0?l+1|0:l,F=z,p[e+12|0]=(4095&l)<<20|F>>>12,b=l,p[e+11|0]=(15&l)<<28|F>>>4,z=0,F=aA=2097151&tA,p[e+7|0]=(16383&V)<<18|O>>>14|F<<7,l=2097151&mA,V=K(wA,gA,-683901,-1)+l|0,F=h,F=l>>>0>V>>>0?F+1|0:F,F=(l=b>>21)+F|0,O=V=(b=(2097151&b)<<11|AA>>>21)+V|0,l=F=b>>>0>V>>>0?F+1|0:F,p[e+14|0]=(127&l)<<25|V>>>7,V=0,b=tA=2097151&AA,p[e+10|0]=(131071&z)<<15|aA>>>17|b<<4,F=l>>21,b=(l=(2097151&l)<<11|O>>>21)>>>0>(AA=l+(2097151&yA)|0)>>>0?F+1|0:F,p[e+17|0]=(1023&b)<<22|AA>>>10,l=b,b=AA,p[e+16|0]=(3&l)<<30|b>>>2,b=gA=2097151&O,p[e+13|0]=(1048575&V)<<12|tA>>>20|b<<1,b=(2097151&l)<<11|AA>>>21,l>>=21,l=b>>>0>(O=b+(2097151&fA)|0)>>>0?l+1|0:l,F=O,p[e+20|0]=(8191&l)<<19|F>>>13,p[e+19|0]=(31&l)<<27|F>>>5,F=tA=2097151&AA,p[e+15|0]=(32767&z)<<17|gA>>>15|F<<6,W=(2097151&l)<<11|O>>>21,l=F=l>>21,W=l=W>>>0>(gA=W+(2097151&_A)|0)>>>0?l+1|0:l,p[e+21|0]=gA,l=O,p[e+18|0]=(262143&V)<<14|tA>>>18|l<<3,l=W,p[e+22|0]=(255&l)<<24|gA>>>8,b=l,l>>=21,b=(O=(z=(2097151&b)<<11|gA>>>21)+(2097151&bA)|0)>>>0>>0?l+1|0:l,p[(F=e)+25|0]=(2047&b)<<21|O>>>11,l=b,b=O,p[F+24|0]=(7&l)<<29|b>>>3,b=F,z=(2097151&l)<<11|O>>>21,l>>=21,F=l=z>>>0>(V=AA=z+(2097151&iA)|0)>>>0?l+1|0:l,p[b+27|0]=(63&l)<<26|V>>>6,z=0,l=AA=2097151&O,p[b+23|0]=31&((65535&W)<<16|gA>>>16)|l<<5,F=(l=F)>>21,F=(l=(2097151&l)<<11|V>>>21)>>>0>(W=l+(2097151&j)|0)>>>0?F+1|0:F,b=W,p[e+31|0]=(131071&F)<<15|b>>>17,l=F,p[e+30|0]=(511&l)<<23|b>>>9,p[e+29|0]=(1&l)<<31|b>>>1,F=0,V&=2097151,p[e+26|0]=(524287&z)<<13|AA>>>19|V<<2,p[e+28|0]=(16383&F)<<18|V>>>14|b<<7}function Nt(e){var t,n=0,o=0,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0;BA=t=BA-16|0;A:{t:{g:{r:{e:{a:{B:{C:{Q:{n:{i:{o:{if((e|=0)>>>0<=244){if(3&(n=(E=r[8961])>>>(o=(_=e>>>0<11?16:e+11&-8)>>>3|0)|0)){e=(f=r[35892+(n=(a=o+(1&(-1^n))|0)<<3)>>2])+8|0,(0|(o=r[f+8>>2]))!=(0|(n=n+35884|0))?(r[o+12>>2]=n,r[n+8>>2]=o):(Y=35844,U=pt(-2,a)&E,r[Y>>2]=U),n=a<<3,r[f+4>>2]=3|n,r[4+(n=n+f|0)>>2]=1|r[n+4>>2];break A}if((D=r[8963])>>>0>=_>>>0)break o;if(n){o=e=(n=(0-(e=(0-(e=2<>>12&16,o|=e=(n=n>>>e|0)>>>5&8,o|=e=(n=n>>>e|0)>>>2&4,s=r[35892+(e=(o=((o|=e=(n=n>>>e|0)>>>1&2)|(e=(n=n>>>e|0)>>>1&1))+(n>>>e|0)|0)<<3)>>2],(0|(n=r[s+8>>2]))!=(0|(e=e+35884|0))?(r[n+12>>2]=e,r[e+8>>2]=n):(E=pt(-2,o)&E,r[8961]=E),e=s+8|0,r[s+4>>2]=3|_,f=(n=o<<3)-_|0,r[4+(a=s+_|0)>>2]=1|f,r[n+s>>2]=f,D&&(o=35884+((n=D>>>3|0)<<3)|0,s=r[8966],(n=1<>2]:(r[8961]=n|E,n=o),r[o+8>>2]=s,r[n+12>>2]=s,r[s+12>>2]=o,r[s+8>>2]=n),r[8966]=a,r[8963]=f;break A}if(!(y=r[8962]))break o;for(o=e=(n=(y&0-y)-1|0)>>>12&16,o|=e=(n=n>>>e|0)>>>5&8,o|=e=(n=n>>>e|0)>>>2&4,n=r[36148+(((o|=e=(n=n>>>e|0)>>>1&2)|(e=(n=n>>>e|0)>>>1&1))+(n>>>e|0)<<2)>>2],f=(-8&r[n+4>>2])-_|0,o=n;(e=r[o+16>>2])||(e=r[o+20>>2]);)f=(a=(o=(-8&r[e+4>>2])-_|0)>>>0>>0)?o:f,n=a?e:n,o=e;if((w=n+_|0)>>>0<=n>>>0)break i;if(v=r[n+24>>2],(0|(a=r[n+12>>2]))!=(0|n)){e=r[n+8>>2],r[e+12>>2]=a,r[a+8>>2]=e;break t}if(!(e=r[(o=n+20|0)>>2])){if(!(e=r[n+16>>2]))break n;o=n+16|0}for(;s=o,a=e,(e=r[(o=e+20|0)>>2])||(o=a+16|0,e=r[a+16>>2]););r[s>>2]=0;break t}if(_=-1,!(e>>>0>4294967231)&&(_=-8&(e=e+11|0),w=r[8962])){E=31,f=0-_|0,_>>>0<=16777215&&(e=e>>>8|0,e<<=s=e+1048320>>>16&8,E=28+((e=((e<<=o=e+520192>>>16&4)<<(n=e+245760>>>16&2)>>>15|0)-(n|o|s)|0)<<1|_>>>e+21&1)|0);E:{s:{if(o=r[36148+(E<<2)>>2])for(e=0,n=_<<((0|E)==31?0:25-(E>>>1|0)|0);;){if(!((s=(-8&r[o+4>>2])-_|0)>>>0>=f>>>0||(a=o,f=s))){f=0,e=o;break s}if(s=r[o+20>>2],o=r[16+((n>>>29&4)+o|0)>>2],e=s?(0|s)==(0|o)?e:s:e,n<<=1,!o)break}else e=0;if(!(e|a)){if(!(e=(0-(e=2<>>12&16,o|=e=(n=n>>>e|0)>>>5&8,o|=e=(n=n>>>e|0)>>>2&4,e=r[36148+(((o|=e=(n=n>>>e|0)>>>1&2)|(e=(n=n>>>e|0)>>>1&1))+(n>>>e|0)<<2)>>2]}if(!e)break E}for(;f=(o=(n=(-8&r[e+4>>2])-_|0)>>>0>>0)?n:f,a=o?e:a,e=(n=r[e+16>>2])||r[e+20>>2];);}if(!(!a|r[8963]-_>>>0<=f>>>0)){if((y=a+_|0)>>>0<=a>>>0)break i;if(E=r[a+24>>2],(0|a)!=(0|(n=r[a+12>>2]))){e=r[a+8>>2],r[e+12>>2]=n,r[n+8>>2]=e;break g}if(!(e=r[(o=a+20|0)>>2])){if(!(e=r[a+16>>2]))break Q;o=a+16|0}for(;s=o,n=e,(e=r[(o=e+20|0)>>2])||(o=n+16|0,e=r[n+16>>2]););r[s>>2]=0;break g}}}if((o=r[8963])>>>0>=_>>>0){a=r[8966],(n=o-_|0)>>>0>=16?(r[8963]=n,e=a+_|0,r[8966]=e,r[e+4>>2]=1|n,r[o+a>>2]=n,r[a+4>>2]=3|_):(r[8966]=0,r[8963]=0,r[a+4>>2]=3|o,r[4+(e=o+a|0)>>2]=1|r[e+4>>2]),e=a+8|0;break A}if((y=r[8964])>>>0>_>>>0){n=y-_|0,r[8964]=n,e=(o=r[8967])+_|0,r[8967]=e,r[e+4>>2]=1|n,r[o+4>>2]=3|_,e=o+8|0;break A}if(e=0,n=w=_+47|0,r[9079]?o=r[9081]:(r[9082]=-1,r[9083]=-1,r[9080]=4096,r[9081]=4096,r[9079]=t+12&-16^1431655768,r[9084]=0,r[9072]=0,o=4096),(o=(s=n+o|0)&(f=0-o|0))>>>0<=_>>>0||(a=r[9071])&&a>>>0<(E=(n=r[9069])+o|0)>>>0|n>>>0>=E>>>0)break A;if(4&u[36288])break a;o:{E:{if(a=r[8967])for(e=36292;;){if(a>>>0<(n=r[e>>2])+r[e+4>>2]>>>0&&n>>>0<=a>>>0)break E;if(!(e=r[e+8>>2]))break}if((0|(n=Fg(0)))==-1||(E=o,(e=(a=r[9080])-1|0)&n&&(E=(o-n|0)+(e+n&0-a)|0),E>>>0<=_>>>0|E>>>0>2147483646)||(a=r[9071])&&a>>>0<(f=(e=r[9069])+E|0)>>>0|e>>>0>=f>>>0)break B;if((0|n)!=(0|(e=Fg(E))))break o;break e}if((E=f&s-y)>>>0>2147483646)break B;if((0|(n=Fg(E)))==(r[e>>2]+r[e+4>>2]|0))break C;e=n}if(!((0|e)==-1|_+48>>>0<=E>>>0)){if((n=(n=r[9081])+(w-E|0)&0-n)>>>0>2147483646){n=e;break e}if((0|Fg(n))!=-1){E=n+E|0,n=e;break e}Fg(0-E|0);break B}if(n=e,(0|e)!=-1)break e;break B}s0()}a=0;break t}n=0;break g}if((0|n)!=-1)break e}r[9072]=4|r[9072]}if(o>>>0>2147483646||(n=Fg(o))>>>0>=(e=Fg(0))>>>0|(0|n)==-1|(0|e)==-1||(E=e-n|0)>>>0<=_+40>>>0)break r}e=r[9069]+E|0,r[9069]=e,e>>>0>OA[9070]&&(r[9070]=e);e:{a:{B:{if(s=r[8967]){for(e=36292;;){if(((a=r[e>>2])+(o=r[e+4>>2])|0)==(0|n))break B;if(!(e=r[e+8>>2]))break}break a}for((e=r[8965])>>>0<=n>>>0&&e||(r[8965]=n),e=0,r[9074]=E,r[9073]=n,r[8969]=-1,r[8970]=r[9079],r[9076]=0;o=35884+(a=e<<3)|0,r[a+35892>>2]=o,r[a+35896>>2]=o,(0|(e=e+1|0))!=32;);o=(a=E-40|0)-(e=n+8&7?-8-n&7:0)|0,r[8964]=o,e=e+n|0,r[8967]=e,r[e+4>>2]=1|o,r[4+(n+a|0)>>2]=40,r[8968]=r[9083];break e}if(!(8&u[e+12|0]|n>>>0<=s>>>0|a>>>0>s>>>0)){r[e+4>>2]=o+E,o=(e=s+8&7?-8-s&7:0)+s|0,r[8967]=o,e=(n=r[8964]+E|0)-e|0,r[8964]=e,r[o+4>>2]=1|e,r[4+(n+s|0)>>2]=40,r[8968]=r[9083];break e}}(a=r[8965])>>>0>n>>>0&&(r[8965]=n,a=0),o=n+E|0,e=36292;a:{B:{C:{Q:{n:{i:{for(;;){if((0|o)!=r[e>>2]){if(e=r[e+8>>2])continue;break i}break}if(!(8&u[e+12|0]))break n}for(e=36292;;){if((o=r[e>>2])>>>0<=s>>>0&&(f=o+r[e+4>>2]|0)>>>0>s>>>0)break Q;e=r[e+8>>2]}}if(r[e>>2]=n,r[e+4>>2]=r[e+4>>2]+E,r[4+(w=(n+8&7?-8-n&7:0)+n|0)>>2]=3|_,o=((E=o+(o+8&7?-8-o&7:0)|0)-w|0)-_|0,y=_+w|0,(0|E)==(0|s)){r[8967]=y,e=r[8964]+o|0,r[8964]=e,r[y+4>>2]=1|e;break B}if(r[8966]==(0|E)){r[8966]=y,e=r[8963]+o|0,r[8963]=e,r[y+4>>2]=1|e,r[e+y>>2]=e;break B}if((3&(e=r[E+4>>2]))==1){s=-8&e;n:if(e>>>0<=255){if(a=r[E+8>>2],e=e>>>3|0,(0|(n=r[E+12>>2]))==(0|a)){Y=35844,U=r[8961]&pt(-2,e),r[Y>>2]=U;break n}r[a+12>>2]=n,r[n+8>>2]=a}else{if(_=r[E+24>>2],(0|E)==(0|(n=r[E+12>>2])))if((f=r[(e=E+20|0)>>2])||(f=r[(e=E+16|0)>>2])){for(;a=e,(f=r[(e=(n=f)+20|0)>>2])||(e=n+16|0,f=r[n+16>>2]););r[a>>2]=0}else n=0;else e=r[E+8>>2],r[e+12>>2]=n,r[n+8>>2]=e;if(_){a=r[E+28>>2];i:{if(r[(e=36148+(a<<2)|0)>>2]==(0|E)){if(r[e>>2]=n,n)break i;Y=35848,U=r[8962]&pt(-2,a),r[Y>>2]=U;break n}if(r[_+(r[_+16>>2]==(0|E)?16:20)>>2]=n,!n)break n}r[n+24>>2]=_,(e=r[E+16>>2])&&(r[n+16>>2]=e,r[e+24>>2]=n),(e=r[E+20>>2])&&(r[n+20>>2]=e,r[e+24>>2]=n)}}E=E+s|0,o=o+s|0}if(r[E+4>>2]=-2&r[E+4>>2],r[y+4>>2]=1|o,r[o+y>>2]=o,o>>>0<=255){n=35884+((e=o>>>3|0)<<3)|0,(o=r[8961])&(e=1<>2]:(r[8961]=e|o,e=n),r[n+8>>2]=y,r[e+12>>2]=y,r[y+12>>2]=n,r[y+8>>2]=e;break B}if(e=31,o>>>0<=16777215&&(e=o>>>8|0,e<<=f=e+1048320>>>16&8,e=28+((e=((e<<=a=e+520192>>>16&4)<<(n=e+245760>>>16&2)>>>15|0)-(n|a|f)|0)<<1|o>>>e+21&1)|0),r[y+28>>2]=e,r[y+16>>2]=0,r[y+20>>2]=0,f=36148+(e<<2)|0,(a=r[8962])&(n=1<>>1|0)|0),n=r[f>>2];;){if(a=n,(-8&r[n+4>>2])==(0|o))break C;if(n=e>>>29|0,e<<=1,!(n=r[16+(f=a+(4&n)|0)>>2]))break}r[f+16>>2]=y,r[y+24>>2]=a}else r[8962]=n|a,r[f>>2]=y,r[y+24>>2]=f;r[y+12>>2]=y,r[y+8>>2]=y;break B}for(o=(a=E-40|0)-(e=n+8&7?-8-n&7:0)|0,r[8964]=o,e=e+n|0,r[8967]=e,r[e+4>>2]=1|o,r[4+(n+a|0)>>2]=40,r[8968]=r[9083],r[(o=(e=(f+(f-39&7?39-f&7:0)|0)-47|0)>>>0>>0?s:e)+4>>2]=27,e=r[9076],r[o+16>>2]=r[9075],r[o+20>>2]=e,e=r[9074],r[o+8>>2]=r[9073],r[o+12>>2]=e,r[9075]=o+8,r[9074]=E,r[9073]=n,r[9076]=0,e=o+24|0;r[e+4>>2]=7,n=e+8|0,e=e+4|0,n>>>0>>0;);if((0|o)==(0|s))break e;if(r[o+4>>2]=-2&r[o+4>>2],f=o-s|0,r[s+4>>2]=1|f,r[o>>2]=f,f>>>0<=255){n=35884+((e=f>>>3|0)<<3)|0,(o=r[8961])&(e=1<>2]:(r[8961]=e|o,e=n),r[n+8>>2]=s,r[e+12>>2]=s,r[s+12>>2]=n,r[s+8>>2]=e;break e}if(e=31,r[s+16>>2]=0,r[s+20>>2]=0,f>>>0<=16777215&&(e=f>>>8|0,e<<=a=e+1048320>>>16&8,e=28+((e=((e<<=o=e+520192>>>16&4)<<(n=e+245760>>>16&2)>>>15|0)-(n|o|a)|0)<<1|f>>>e+21&1)|0),r[s+28>>2]=e,a=36148+(e<<2)|0,(o=r[8962])&(n=1<>>1|0)|0),n=r[a>>2];;){if(o=n,(0|f)==(-8&r[n+4>>2]))break a;if(n=e>>>29|0,e<<=1,!(n=r[16+(a=o+(4&n)|0)>>2]))break}r[a+16>>2]=s,r[s+24>>2]=o}else r[8962]=n|o,r[a>>2]=s,r[s+24>>2]=a;r[s+12>>2]=s,r[s+8>>2]=s;break e}e=r[a+8>>2],r[e+12>>2]=y,r[a+8>>2]=y,r[y+24>>2]=0,r[y+12>>2]=a,r[y+8>>2]=e}e=w+8|0;break A}e=r[o+8>>2],r[e+12>>2]=s,r[o+8>>2]=s,r[s+24>>2]=0,r[s+12>>2]=o,r[s+8>>2]=e}if(!((e=r[8964])>>>0<=_>>>0)){n=e-_|0,r[8964]=n,e=(o=r[8967])+_|0,r[8967]=e,r[e+4>>2]=1|n,r[o+4>>2]=3|_,e=o+8|0;break A}}r[8960]=48,e=0;break A}g:if(E){o=r[a+28>>2];r:{if(r[(e=36148+(o<<2)|0)>>2]==(0|a)){if(r[e>>2]=n,n)break r;w=pt(-2,o)&w,r[8962]=w;break g}if(r[E+(r[E+16>>2]==(0|a)?16:20)>>2]=n,!n)break g}r[n+24>>2]=E,(e=r[a+16>>2])&&(r[n+16>>2]=e,r[e+24>>2]=n),(e=r[a+20>>2])&&(r[n+20>>2]=e,r[e+24>>2]=n)}g:if(f>>>0<=15)e=f+_|0,r[a+4>>2]=3|e,r[4+(e=e+a|0)>>2]=1|r[e+4>>2];else if(r[a+4>>2]=3|_,r[y+4>>2]=1|f,r[f+y>>2]=f,f>>>0<=255)n=35884+((e=f>>>3|0)<<3)|0,(o=r[8961])&(e=1<>2]:(r[8961]=e|o,e=n),r[n+8>>2]=y,r[e+12>>2]=y,r[y+12>>2]=n,r[y+8>>2]=e;else{e=31,f>>>0<=16777215&&(e=f>>>8|0,e<<=s=e+1048320>>>16&8,e=28+((e=((e<<=o=e+520192>>>16&4)<<(n=e+245760>>>16&2)>>>15|0)-(n|o|s)|0)<<1|f>>>e+21&1)|0),r[y+28>>2]=e,r[y+16>>2]=0,r[y+20>>2]=0,o=36148+(e<<2)|0;r:{if((n=1<>>1|0)|0),_=r[o>>2];;){if((-8&r[(n=_)+4>>2])==(0|f))break r;if(o=e>>>29|0,e<<=1,!(_=r[16+(o=n+(4&o)|0)>>2]))break}r[o+16>>2]=y,r[y+24>>2]=n}else r[8962]=n|w,r[o>>2]=y,r[y+24>>2]=o;r[y+12>>2]=y,r[y+8>>2]=y;break g}e=r[n+8>>2],r[e+12>>2]=y,r[n+8>>2]=y,r[y+24>>2]=0,r[y+12>>2]=n,r[y+8>>2]=e}e=a+8|0;break A}t:if(v){o=r[n+28>>2];g:{if(r[(e=36148+(o<<2)|0)>>2]==(0|n)){if(r[e>>2]=a,a)break g;Y=35848,U=pt(-2,o)&y,r[Y>>2]=U;break t}if(r[(r[v+16>>2]==(0|n)?16:20)+v>>2]=a,!a)break t}r[a+24>>2]=v,(e=r[n+16>>2])&&(r[a+16>>2]=e,r[e+24>>2]=a),(e=r[n+20>>2])&&(r[a+20>>2]=e,r[e+24>>2]=a)}f>>>0<=15?(e=f+_|0,r[n+4>>2]=3|e,r[4+(e=e+n|0)>>2]=1|r[e+4>>2]):(r[n+4>>2]=3|_,r[w+4>>2]=1|f,r[f+w>>2]=f,D&&(o=35884+((e=D>>>3|0)<<3)|0,a=r[8966],(e=1<>2]:(r[8961]=e|E,e=o),r[o+8>>2]=a,r[e+12>>2]=a,r[a+12>>2]=o,r[a+8>>2]=e),r[8966]=w,r[8963]=f),e=n+8|0}return BA=t+16|0,0|e}function _0(e,t,n){var o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F,b,V,W,O,z,tA,AA,gA,aA,iA,hA,yA,fA,_A,wA,mA,bA,RA,j,rA,YA,SA,NA,VA,XA,g0,$,cA,zA,ZA,t0,r0,o0,E0,B0,n0,X=0,eA=0,CA=0,h0=0,I0=0,w0=0,d0=0,S0=0,Y0=0,T0=0,k=0,DA=0,HA=0,jA=0,A0=0,a0=0,C0=0,f0=0,G0=0,H0=0,R0=0,M0=0,x0=0,P0=0,X0=0;d0=e,o=X=x0=r[n+4>>2],D=X>>31,RA=X=(A0=r[t+20>>2])<<1,X=K(o,D,X,z=X>>31),CA=h,eA=X,a=X=r[n>>2],f=X>>31,v=X=r[t+24>>2],I0=K(a,f,X,E=X>>31),X=h+CA|0,X=(eA=eA+I0|0)>>>0>>0?X+1|0:X,CA=eA,j=eA=w0=r[n+8>>2],l=eA>>31,Y=eA=r[t+16>>2],eA=CA+(I0=K(w0,l,eA,s=eA>>31))|0,CA=h+X|0,CA=eA>>>0>>0?CA+1|0:CA,rA=X=C0=r[n+12>>2],F=X>>31,YA=X=(DA=r[t+12>>2])<<1,X=(I0=K(C0,F,X,tA=X>>31))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=X,cA=X=a0=r[n+16>>2],W=X>>31,U=X=r[t+8>>2],I0=K(a0,W,X,y=X>>31),X=h+eA|0,X=(CA=CA+I0|0)>>>0>>0?X+1|0:X,h0=CA,zA=eA=T0=r[n+20>>2],AA=eA>>31,SA=eA=(Y0=r[t+4>>2])<<1,CA=K(T0,AA,eA,gA=eA>>31),X=h+X|0,X=(eA=h0+CA|0)>>>0>>0?X+1|0:X,CA=eA,ZA=eA=k=r[n+24>>2],NA=eA>>31,H=eA=r[t>>2],I0=K(k,NA,eA,_=eA>>31),eA=h+X|0,eA=(CA=CA+I0|0)>>>0>>0?eA+1|0:eA,f0=r[n+28>>2],b=X=xA(f0,19),V=X>>31,VA=X=(HA=r[t+36>>2])<<1,X=(I0=K(b,V,X,aA=X>>31))+CA|0,CA=h+eA|0,CA=X>>>0>>0?CA+1|0:CA,eA=X,jA=r[n+32>>2],G0=X=xA(jA,19),H0=X>>31,i=X=r[t+32>>2],I0=K(G0,H0,X,w=X>>31),X=h+CA|0,X=(eA=eA+I0|0)>>>0>>0?X+1|0:X,CA=eA,t0=r[n+36>>2],c=n=xA(t0,19),N=n>>31,XA=n=(t=r[t+28>>2])<<1,eA=K(c,N,n,iA=n>>31),X=h+X|0,S0=n=CA+eA|0,n=n>>>0>>0?X+1|0:X,X=K(Y,s,o,D),eA=h,A0=K(a,f,I0=A0,hA=I0>>31),CA=h+eA|0,CA=(X=A0+X|0)>>>0>>0?CA+1|0:CA,A0=DA,DA=K(w0,l,DA,yA=DA>>31),eA=h+CA|0,eA=(X=DA+X|0)>>>0>>0?eA+1|0:eA,CA=(DA=K(U,y,C0,F))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,eA=CA,DA=Y0,CA=K(a0,W,Y0,fA=Y0>>31),X=h+X|0,X=(eA=eA+CA|0)>>>0>>0?X+1|0:X,CA=K(H,_,T0,AA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=eA,_A=eA=xA(k,19),eA=CA+(HA=K(eA,O=eA>>31,Y0=HA,wA=Y0>>31))|0,CA=h+X|0,CA=eA>>>0>>0?CA+1|0:CA,X=(HA=K(i,w,b,V))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,HA=t,t=(CA=K(G0,H0,t,mA=t>>31))+X|0,X=h+eA|0,X=t>>>0>>0?X+1|0:X,eA=K(c,N,v,E),X=h+X|0,M0=t=eA+t|0,t=t>>>0>>0?X+1|0:X,X=K(o,D,YA,tA),CA=h,eA=(k=K(a,f,Y,s))+X|0,X=h+CA|0,X=eA>>>0>>0?X+1|0:X,k=K(U,y,w0,l),CA=h+X|0,CA=(eA=k+eA|0)>>>0>>0?CA+1|0:CA,X=(k=K(C0,F,SA,gA))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=(k=K(H,_,a0,W))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,h0=CA,g0=eA=xA(T0,19),CA=K(eA,bA=eA>>31,VA,aA),X=h+X|0,X=(eA=h0+CA|0)>>>0>>0?X+1|0:X,CA=K(i,w,_A,O),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,T0=K(b,V,XA,iA),CA=h+X|0,CA=(eA=T0+eA|0)>>>0>>0?CA+1|0:CA,X=(T0=K(G0,H0,v,E))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=(T0=K(c,N,RA,z))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,T0=CA,o0=X,k=eA=CA+33554432|0,E0=X=eA>>>0<33554432?X+1|0:X,CA=M0,M0=(67108863&X)<<6|eA>>>26,X=(X>>26)+t|0,X=(CA=CA+M0|0)>>>0>>0?X+1|0:X,B0=t=(M0=CA)+16777216|0,X=n+(eA=(CA=t>>>0<16777216?X+1|0:X)>>25)|0,X=(t=(CA=(33554431&CA)<<7|t>>>25)+S0|0)>>>0>>0?X+1|0:X,P0=t=(n=t)+33554432|0,t=X=t>>>0<33554432?X+1|0:X,X=-67108864&P0,r[d0+24>>2]=n-X,S0=d0,n=K(o,D,SA,gA),X=h,eA=K(a,f,U,y),CA=h+X|0,CA=(n=eA+n|0)>>>0>>0?CA+1|0:CA,eA=K(H,_,w0,l),X=h+CA|0,X=(n=eA+n|0)>>>0>>0?X+1|0:X,CA=n,d0=n=xA(C0,19),eA=K(n,C0=n>>31,VA,aA),X=h+X|0,X=(n=CA+eA|0)>>>0>>0?X+1|0:X,eA=n,r0=n=xA(a0,19),n=eA+(CA=K(i,w,n,$=n>>31))|0,eA=h+X|0,eA=n>>>0>>0?eA+1|0:eA,CA=K(XA,iA,g0,bA),X=h+eA|0,X=(n=CA+n|0)>>>0>>0?X+1|0:X,eA=K(v,E,_A,O),CA=h+X|0,CA=(n=eA+n|0)>>>0>>0?CA+1|0:CA,eA=K(b,V,RA,z),X=h+CA|0,X=(n=eA+n|0)>>>0>>0?X+1|0:X,eA=K(G0,H0,Y,s),X=h+X|0,X=(n=eA+n|0)>>>0>>0?X+1|0:X,CA=K(c,N,YA,tA),eA=h+X|0,h0=n=CA+n|0,n=n>>>0>>0?eA+1|0:eA,X=K(H,_,o,D),CA=h,eA=(a0=K(a,f,DA,fA))+X|0,X=h+CA|0,X=eA>>>0>>0?X+1|0:X,CA=eA,a0=eA=xA(w0,19),eA=CA+(w0=K(eA,R0=eA>>31,Y0,wA))|0,CA=h+X|0,CA=eA>>>0>>0?CA+1|0:CA,w0=K(i,w,d0,C0),X=h+CA|0,X=(eA=w0+eA|0)>>>0>>0?X+1|0:X,CA=K(r0,$,HA,mA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=(w0=K(v,E,g0,bA))+eA|0,eA=h+X|0,eA=CA>>>0>>0?eA+1|0:eA,w0=K(_A,O,I0,hA),X=h+eA|0,X=(CA=w0+CA|0)>>>0>>0?X+1|0:X,eA=(w0=K(Y,s,b,V))+CA|0,CA=h+X|0,CA=eA>>>0>>0?CA+1|0:CA,w0=K(G0,H0,A0,yA),X=h+CA|0,X=(eA=w0+eA|0)>>>0>>0?X+1|0:X,CA=K(c,N,U,y),X=h+X|0,X0=eA=CA+eA|0,w0=eA>>>0>>0?X+1|0:X,X=K(X=xA(o,19),X>>31,VA,aA),eA=h,CA=K(a,f,H,_),eA=h+eA|0,eA=(X=CA+X|0)>>>0>>0?eA+1|0:eA,CA=(x0=K(i,w,a0,R0))+X|0,X=h+eA|0,eA=(d0=K(d0,C0,XA,iA))+CA|0,CA=h+(CA>>>0>>0?X+1|0:X)|0,CA=eA>>>0>>0?CA+1|0:CA,d0=K(v,E,r0,$),X=h+CA|0,X=(eA=d0+eA|0)>>>0>>0?X+1|0:X,CA=K(RA,z,g0,bA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=(d0=K(Y,s,_A,O))+eA|0,eA=h+X|0,eA=CA>>>0>>0?eA+1|0:eA,d0=K(b,V,YA,tA),X=h+eA|0,X=(CA=d0+CA|0)>>>0>>0?X+1|0:X,eA=(d0=K(G0,H0,U,y))+CA|0,CA=h+X|0,CA=eA>>>0>>0?CA+1|0:CA,d0=K(c,N,SA,gA),X=h+CA|0,X=(eA=d0+eA|0)>>>0>>0?X+1|0:X,d0=eA,x0=X,C0=eA=eA+33554432|0,a0=X=eA>>>0<33554432?X+1|0:X,R0=(67108863&X)<<6|eA>>>26,eA=(CA=X>>26)+w0|0,w0=X=R0+X0|0,CA=h0,X=X>>>0>>0?eA+1|0:eA,n0=eA=w0+16777216|0,h0=(33554431&(X=eA>>>0<16777216?X+1|0:X))<<7|eA>>>25,X=(X>>25)+n|0,X=(eA=CA+h0|0)>>>0>>0?X+1|0:X,R0=n=eA+33554432|0,n=X=n>>>0<33554432?X+1|0:X,X=-67108864&R0,r[S0+8>>2]=eA-X,h0=S0,X=K(v,E,o,D),CA=h,eA=(S0=K(a,f,HA,mA))+X|0,X=h+CA|0,X=eA>>>0>>0?X+1|0:X,CA=K(j,l,I0,hA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=K(Y,s,rA,F),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,S0=K(cA,W,A0,yA),CA=h+X|0,CA=(eA=S0+eA|0)>>>0>>0?CA+1|0:CA,X=(S0=K(U,y,zA,AA))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=(S0=K(DA,fA,ZA,NA))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,eA=CA,CA=K(H,_,S0=f0,X0=S0>>31),X=h+X|0,X=(eA=eA+CA|0)>>>0>>0?X+1|0:X,CA=K(G0,H0,Y0,wA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,f0=K(c,N,i,w),CA=h+X|0,CA=(eA=f0+eA|0)>>>0>>0?CA+1|0:CA,X=t>>26,t=(f0=(67108863&t)<<6|P0>>>26)+eA|0,eA=X+CA|0,X=eA=t>>>0>>0?eA+1|0:eA,P0=t=(CA=t)+16777216|0,t=X=t>>>0<16777216?X+1|0:X,X=-33554432&P0,r[h0+28>>2]=CA-X,f0=h0,X=K(U,y,o,D),eA=h,h0=K(a,f,A0,yA),CA=h+eA|0,CA=(X=h0+X|0)>>>0>>0?CA+1|0:CA,h0=K(j,l,DA,fA),eA=h+CA|0,eA=(X=h0+X|0)>>>0>>0?eA+1|0:eA,CA=(h0=K(H,_,rA,F))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,eA=CA,CA=K(r0,$,Y0,wA),X=h+X|0,X=(eA=eA+CA|0)>>>0>>0?X+1|0:X,CA=K(i,w,g0,bA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,h0=K(_A,O,HA,mA),CA=h+X|0,CA=(eA=h0+eA|0)>>>0>>0?CA+1|0:CA,X=(h0=K(v,E,b,V))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=(h0=K(G0,H0,I0,hA))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,eA=CA,CA=K(c,N,Y,s),X=h+X|0,h0=eA=eA+CA|0,X=(X=eA>>>0>>0?X+1|0:X)+(eA=n>>26)|0,X=(n=h0+(CA=(67108863&n)<<6|R0>>>26)|0)>>>0>>0?X+1|0:X,G0=n=(eA=n)+16777216|0,n=CA=n>>>0<16777216?X+1|0:X,X=-33554432&G0,r[f0+12>>2]=eA-X,X=K(o,D,XA,iA),CA=h,eA=(h0=K(a,f,i,w))+X|0,X=h+CA|0,X=eA>>>0>>0?X+1|0:X,CA=K(v,E,j,l),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,h0=K(rA,F,RA,z),CA=h+X|0,CA=(eA=h0+eA|0)>>>0>>0?CA+1|0:CA,X=(h0=K(Y,s,cA,W))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,CA=(h0=K(YA,tA,zA,AA))+X|0,X=h+eA|0,X=CA>>>0>>0?X+1|0:X,eA=CA,CA=K(U,y,ZA,NA),X=h+X|0,X=(eA=eA+CA|0)>>>0>>0?X+1|0:X,CA=K(S0,X0,SA,gA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,jA=K(H,_,h0=jA,H0=h0>>31),CA=h+X|0,CA=(eA=jA+eA|0)>>>0>>0?CA+1|0:CA,X=(jA=K(c,N,VA,aA))+eA|0,eA=h+CA|0,eA=X>>>0>>0?eA+1|0:eA,jA=X,X=(X=t>>25)+eA|0,X=(t=jA+(CA=(33554431&t)<<7|P0>>>25)|0)>>>0>>0?X+1|0:X,jA=t=(eA=t)+33554432|0,t=X=t>>>0<33554432?X+1|0:X,X=-67108864&jA,r[f0+32>>2]=eA-X,CA=eA=T0-(X=-67108864&k)|0,X=(X=o0-((X>>>0>T0>>>0)+E0|0)|0)+(eA=n>>25)|0,X=(n=CA+(T0=(33554431&n)<<7|G0>>>25)|0)>>>0>>0?X+1|0:X,(eA=n+33554432|0)>>>0<33554432&&(X=X+1|0),X=(M0-(-33554432&B0)|0)+((67108863&X)<<6|eA>>>26)|0,r[e+20>>2]=X,X=-67108864&eA,r[e+16>>2]=n-X,X=K(i,w,o,D),CA=h,eA=(Y0=K(a,f,Y0,wA))+X|0,X=h+CA|0,X=eA>>>0>>0?X+1|0:X,CA=(Y0=K(j,l,HA,mA))+eA|0,eA=h+X|0,eA=CA>>>0>>0?eA+1|0:eA,X=(Y0=K(v,E,rA,F))+CA|0,CA=h+eA|0,eA=(I0=K(cA,W,I0,hA))+X|0,X=h+(X>>>0>>0?CA+1|0:CA)|0,X=eA>>>0>>0?X+1|0:X,CA=K(Y,s,zA,AA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=K(A0,yA,ZA,NA),X=h+X|0,X=(eA=CA+eA|0)>>>0>>0?X+1|0:X,CA=(I0=K(U,y,S0,X0))+eA|0,eA=h+X|0,eA=CA>>>0>>0?eA+1|0:eA,X=(I0=K(h0,H0,DA,fA))+CA|0,CA=h+eA|0,CA=X>>>0>>0?CA+1|0:CA,eA=(I0=K(H,_,t0,t0>>31))+X|0,X=h+CA|0,n=eA,X=(X=eA>>>0>>0?X+1|0:X)+(eA=t>>26)|0,X=(t=n+(CA=(67108863&t)<<6|jA>>>26)|0)>>>0>>0?X+1|0:X,X=(t=(n=t)+16777216|0)>>>0<16777216?X+1|0:X,t=-33554432&(eA=t),r[e+36>>2]=n-t,CA=w0-(-33554432&n0)|0,I0=d0-(t=-67108864&C0)|0,A0=x0-((t>>>0>d0>>>0)+a0|0)|0,X=K((33554431&(t=X))<<7|eA>>>25,X>>=25,19,0),eA=h+A0|0,X=eA=(t=X+I0|0)>>>0>>0?eA+1|0:eA,n=((67108863&(X=(n=t+33554432|0)>>>0<33554432?X+1|0:X))<<6|(eA=n)>>>26)+CA|0,r[e+4>>2]=n,n=e,e=-67108864&eA,r[n>>2]=t-e}function k0(e,t){var n,o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F,b,V,W,O,z,tA,AA,gA,aA,iA,hA,yA,fA,_A,wA,mA,bA,RA,j=0,rA=0,YA=0,SA=0,NA=0,VA=0,XA=0,g0=0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0,E0=0,B0=0;VA=e,D=rA=(j=r[t+12>>2])<<1,g0=j,j=K(rA,E=rA>>31,j,z=j>>31),SA=h,rA=j,n=j=r[t+16>>2],s=j>>31,N=j=(cA=r[t+8>>2])<<1,NA=K(n,s,j,U=j>>31),j=h+SA|0,j=(rA=rA+NA|0)>>>0>>0?j+1|0:j,SA=rA,H=rA=(NA=r[t+20>>2])<<1,i=rA>>31,y=rA=(zA=r[t+4>>2])<<1,YA=K(H,i,rA,o=rA>>31),rA=h+j|0,rA=(SA=SA+YA|0)>>>0>>0?rA+1|0:rA,b=j=XA=r[t+24>>2],v=j>>31,_=j=(E0=r[t>>2])<<1,YA=K(XA,v,j,a=j>>31),j=h+rA|0,j=(SA=YA+SA|0)>>>0>>0?j+1|0:j,$=SA,rA=r[t+32>>2],c=SA=xA(rA,19),tA=rA,SA=K(SA,Y=SA>>31,rA,V=rA>>31),j=h+j|0,j=(rA=$+SA|0)>>>0>>0?j+1|0:j,$=rA,t0=r[t+36>>2],w=rA=xA(t0,38),f=rA>>31,hA=t=(SA=r[t+28>>2])<<1,YA=K(rA,f,t,AA=t>>31),t=h+j|0,r0=rA=$+YA|0,ZA=rA>>>0>>0?t+1|0:t,t=K(y,o,n,s),j=h,rA=K(N,U,g0,z),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,yA=NA,YA=K(NA,W=NA>>31,_,a),rA=h+j|0,rA=(t=YA+t|0)>>>0>>0?rA+1|0:rA,YA=K(c,Y,hA,AA),j=h+rA|0,j=(t=YA+t|0)>>>0>>0?j+1|0:j,rA=K(w,f,XA,v),j=h+j|0,$=t=rA+t|0,B0=t>>>0>>0?j+1|0:j,t=K(y,o,D,E),rA=h,j=(cA=K(YA=cA,l=YA>>31,YA,l))+t|0,t=h+rA|0,t=j>>>0>>0?t+1|0:t,rA=(cA=K(_,a,n,s))+j|0,j=h+t|0,j=rA>>>0>>0?j+1|0:j,O=t=xA(SA,38),cA=SA,t=(SA=K(t,F=t>>31,SA,gA=SA>>31))+rA|0,rA=h+j|0,rA=t>>>0>>0?rA+1|0:rA,t=(j=t)+(SA=K(c,Y,t=XA<<1,t>>31))|0,j=h+rA|0,j=t>>>0>>0?j+1|0:j,rA=K(w,f,H,i),j=h+j|0,aA=t=rA+t|0,wA=j=t>>>0>>0?j+1|0:j,t=j,fA=j=aA+33554432|0,mA=t=j>>>0<33554432?t+1|0:t,j=(j=t>>26)+B0|0,B0=t=(rA=(67108863&t)<<6|fA>>>26)+$|0,rA=t>>>0>>0?j+1|0:j,bA=t=t+16777216|0,j=(j=(rA=t>>>0<16777216?rA+1|0:rA)>>25)+ZA|0,j=(t=(rA=(33554431&rA)<<7|t>>>25)+r0|0)>>>0>>0?j+1|0:j,rA=t,t=j,$=j=rA+33554432|0,SA=t=j>>>0<33554432?t+1|0:t,t=-67108864&j,r[VA+24>>2]=rA-t,t=K(_,a,YA,l),j=h,zA=K(y,o,VA=zA,o0=VA>>31),rA=h+j|0,rA=(t=zA+t|0)>>>0>>0?rA+1|0:rA,j=t,zA=t=xA(XA,19),t=j+(XA=K(t,r0=t>>31,XA,v))|0,j=h+rA|0,j=t>>>0>>0?j+1|0:j,rA=(XA=K(H,i,O,F))+t|0,t=h+j|0,t=rA>>>0>>0?t+1|0:t,_A=j=n<<1,XA=K(c,Y,j,iA=j>>31),j=h+t|0,j=(rA=XA+rA|0)>>>0>>0?j+1|0:j,t=rA,rA=K(w,f,D,E),j=h+j|0,ZA=t=t+rA|0,XA=t>>>0>>0?j+1|0:j,t=K(H,i,zA,r0),j=h,VA=K(_,a,VA,o0),rA=h+j|0,rA=(t=VA+t|0)>>>0>>0?rA+1|0:rA,VA=K(n,s,O,F),j=h+rA|0,j=(t=VA+t|0)>>>0>>0?j+1|0:j,rA=(VA=K(c,Y,D,E))+t|0,t=h+j|0,t=rA>>>0>>0?t+1|0:t,VA=K(w,f,YA,l),j=h+t|0,o0=rA=VA+rA|0,VA=rA>>>0>>0?j+1|0:j,t=K(t=xA(NA,38),t>>31,NA,W),j=h,NA=t,rA=K(t=E0,rA=t>>31,t,rA),j=h+j|0,j=(t=NA+rA|0)>>>0>>0?j+1|0:j,NA=K(zA,r0,_A,iA),rA=h+j|0,rA=(t=NA+t|0)>>>0>>0?rA+1|0:rA,NA=K(D,E,O,F),j=h+rA|0,j=(t=NA+t|0)>>>0>>0?j+1|0:j,rA=(NA=K(c,Y,N,U))+t|0,t=h+j|0,t=rA>>>0>>0?t+1|0:t,NA=K(y,o,w,f),j=h+t|0,zA=rA=NA+rA|0,r0=j=rA>>>0>>0?j+1|0:j,E0=t=rA+33554432|0,RA=j=t>>>0<33554432?j+1|0:j,rA=(t=j>>26)+VA|0,VA=j=(NA=(67108863&j)<<6|E0>>>26)+o0|0,j=j>>>0>>0?rA+1|0:rA,o0=t=VA+16777216|0,NA=(33554431&(j=t>>>0<16777216?j+1|0:j))<<7|t>>>25,j=(j>>25)+XA|0,j=(rA=NA+ZA|0)>>>0>>0?j+1|0:j,XA=rA=(t=rA)+33554432|0,NA=j=rA>>>0<33554432?j+1|0:j,j=-67108864&rA,r[e+8>>2]=t-j,t=K(N,U,yA,W),j=h,rA=K(n,s,D,E),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,rA=K(y,o,b,v),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,rA=K(_,a,cA,gA),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,rA=(ZA=K(w,f,tA,V))+t|0,t=h+j|0,j=SA>>26,SA=($=(67108863&SA)<<6|$>>>26)+rA|0,rA=(t=rA>>>0>>0?t+1|0:t)+j|0,j=rA=SA>>>0<$>>>0?rA+1|0:rA,$=rA=(t=SA)+16777216|0,SA=j=rA>>>0<16777216?j+1|0:j,j=-33554432&rA,r[e+28>>2]=t-j,t=K(_,a,g0,z),rA=h,j=(YA=K(y,o,YA,l))+t|0,t=h+rA|0,t=j>>>0>>0?t+1|0:t,YA=K(b,v,O,F),rA=h+t|0,rA=(j=YA+j|0)>>>0>>0?rA+1|0:rA,t=(YA=K(c,Y,H,i))+j|0,j=h+rA|0,j=t>>>0>>0?j+1|0:j,rA=K(w,f,n,s),j=h+j|0,j=(j=(t=rA+t|0)>>>0>>0?j+1|0:j)+(rA=NA>>26)|0,rA=t=(NA=(67108863&NA)<<6|XA>>>26)+t|0,t=j=t>>>0>>0?j+1|0:j,XA=j=rA+16777216|0,NA=t=j>>>0<16777216?t+1|0:t,t=-33554432&j,r[e+12>>2]=rA-t,YA=e,t=K(b,v,N,U),j=h,rA=K(n,s,n,s),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,rA=K(D,E,H,i),j=h+j|0,j=(t=rA+t|0)>>>0>>0?j+1|0:j,rA=(g0=K(y,o,hA,AA))+t|0,t=h+j|0,t=rA>>>0>>0?t+1|0:t,j=(g0=K(_,a,tA,V))+rA|0,rA=h+t|0,rA=j>>>0>>0?rA+1|0:rA,t=(t0=K(w,f,g0=t0,ZA=g0>>31))+j|0,j=h+rA|0,j=t>>>0>>0?j+1|0:j,e=t,j=(t=SA>>25)+j|0,j=(rA=e+(SA=(33554431&SA)<<7|$>>>25)|0)>>>0>>0?j+1|0:j,t0=rA=(t=rA)+33554432|0,SA=j=rA>>>0<33554432?j+1|0:j,j=-67108864&rA,r[YA+32>>2]=t-j,j=NA>>25,rA=(NA=(33554431&NA)<<7|XA>>>25)+(aA-(t=-67108864&fA)|0)|0,t=j+(wA-((t>>>0>aA>>>0)+mA|0)|0)|0,j=t=rA>>>0>>0?t+1|0:t,NA=t=rA+33554432|0,t=((67108863&(j=t>>>0<33554432?j+1|0:j))<<6|t>>>26)+(B0=B0-(-33554432&bA)|0)|0,r[YA+20>>2]=t,t=-67108864&NA,r[YA+16>>2]=rA-t,NA=YA,t=K(D,E,b,v),rA=h,j=(YA=K(yA,W,_A,iA))+t|0,t=h+rA|0,t=j>>>0>>0?t+1|0:t,rA=(YA=K(N,U,cA,gA))+j|0,j=h+t|0,j=rA>>>0>>0?j+1|0:j,t=(YA=K(y,o,tA,V))+rA|0,rA=h+j|0,rA=t>>>0>>0?rA+1|0:rA,YA=K(_,a,g0,ZA),j=h+rA|0,rA=t=YA+t|0,j=(t=t>>>0>>0?j+1|0:j)+(j=SA>>26)|0,j=(rA=(SA=(67108863&SA)<<6|t0>>>26)+rA|0)>>>0>>0?j+1|0:j,SA=rA,t=j,t=(j=rA+16777216|0)>>>0<16777216?t+1|0:t,rA=-33554432&j,r[NA+36>>2]=SA-rA,YA=K((33554431&t)<<7|j>>>25,t>>25,19,0),j=h+(r0-(((rA=-67108864&E0)>>>0>zA>>>0)+RA|0)|0)|0,rA=t=YA+(zA-rA|0)|0,t=t>>>0>>0?j+1|0:j,t=(VA-(-33554432&o0)|0)+((67108863&(t=(j=rA+33554432|0)>>>0<33554432?t+1|0:t))<<6|j>>>26)|0,r[NA+4>>2]=t,e=-67108864&j,r[NA>>2]=rA-e}function HB(e,t,n){var o,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0,aA=0,iA=0,hA=0,yA=0,fA=0,_A=0,wA=0,mA=0,bA=0,RA=0,j=0,rA=0,YA=0,SA=0,NA=0,VA=0,XA=0,g0=0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0,E0=0,B0=0,n0=0;for(BA=o=BA-2048|0,mg(o+1024|0,t),Kg(o+1024|0,e),mg(o,o+1024|0),Kg(o,n),t=0;s=r[(a=Y=(o+1024|0)+(64|(e=b<<7))|0)>>2],D=r[(E=v=(o+1024|0)+(96|e)|0)>>2],E=r[E+4>>2],y=s,c=r[a+4>>2],w=D,a=e+(o+1024|0)|0,_=r[(s=(o+1024|0)+(32|e)|0)>>2],D=r[s+4>>2],w=x(w^(F=qA(r[a>>2],r[a+4>>2],_,D)),(f=E)^(E=h),32),D=x(y=(i=qA(y,c,w,f=h))^_,D^(_=h),24),wA=x((gA=qA(F,y=E,D,E=h))^w,(H=h)^f,16),E=x(D^(mA=qA(i,_,wA,hA=h)),(yA=h)^E,63),D=h,w=r[(_=(o+1024|0)+(104|e)|0)>>2],i=r[_+4>>2],z=r[(f=F=(o+1024|0)+(72|e)|0)>>2],U=r[f+4>>2],V=x((V=w)^(W=qA(l=r[(f=w=(o+1024|0)+(8|e)|0)>>2],c=r[f+4>>2],iA=r[(f=(o+1024|0)+(40|e)|0)>>2],y=r[f+4>>2])),(c=i)^(i=h),32),y=x(U=(l=qA(z,U,V,c=h))^iA,y^(iA=h),24),NA=x((fA=qA(W,U=i,y,i=h))^V,(bA=h)^c,16),i=x(y^(cA=qA(l,iA,NA,g0=h)),(zA=h)^i,63),y=h,V=r[(W=iA=(o+1024|0)+(112|e)|0)>>2],l=r[W+4>>2],aA=r[(W=(o+1024|0)+(80|e)|0)>>2],N=r[W+4>>2],z=V,V=(o+1024|0)+(16|e)|0,tA=r[(AA=c=(o+1024|0)+(48|e)|0)>>2],AA=r[AA+4>>2],z=x(z^(_A=qA(r[V>>2],r[V+4>>2],tA,AA)),(U=l)^(l=h),32),AA=x(N=(U=qA(aA,N,z,O=h))^tA,AA^(tA=h),24),r0=x((ZA=qA(_A,N=l,AA,l=h))^z,(t0=h)^O,16),l=x(AA^(VA=qA(U,tA,r0,o0=h)),(YA=h)^l,63),AA=h,z=r[(tA=(o+1024|0)+(120|e)|0)>>2],O=r[tA+4>>2],E0=r[(U=_A=(o+1024|0)+(88|e)|0)>>2],SA=r[U+4>>2],j=x((aA=z)^(XA=qA($=r[(U=z=(o+1024|0)+(24|e)|0)>>2],N=r[U+4>>2],RA=r[(e=(o+1024|0)+(56|e)|0)>>2],U=r[e+4>>2])),(N=O)^(O=h),32),U=x(N=(SA=qA(E0,SA,j,rA=h))^RA,U^(RA=h),24),aA=RA,j=x((RA=qA(XA,N=O,U,O=h))^j,(XA=h)^rA,16),O=x(U^(SA=qA(SA,aA,j,rA=h)),($=h)^O,63),U=h,aA=VA,N=YA,VA=x(j^(gA=qA(gA,H,i,y)),rA^(H=h),32),i=x((j=qA(aA,N,VA,YA=h))^i,(rA=h)^y,24),y=qA(y=gA,H,i,gA=h),H=h,r[a>>2]=y,r[a+4>>2]=H,a=x(y^VA,YA^H,16),y=h,r[tA>>2]=a,r[tA+4>>2]=y,a=qA(j,rA,a,y),y=h,r[W>>2]=a,r[W+4>>2]=y,B0=f,n0=x(a^i,y^gA,63),r[B0>>2]=n0,r[f+4>>2]=h,H=l,y=x(wA^(f=qA(fA,bA,l,AA)),hA^(i=h),32),a=x(H^(l=qA(SA,$,y,W=h)),(a=AA)^(AA=h),24),f=qA(f,H=i,a,i=h),tA=h,r[w>>2]=f,r[w+4>>2]=tA,w=x(f^y,W^tA,16),f=h,r[v>>2]=w,r[v+4>>2]=f,v=qA(l,AA,w,f),r[_A>>2]=v,w=h,r[_A+4>>2]=w,B0=c,n0=x(a^v,w^i,63),r[B0>>2]=n0,r[c+4>>2]=h,a=qA(ZA,t0,O,U),y=qA(mA,yA,f=x(NA^a,g0^(w=h),32),i=h),a=qA(a,c=w,v=x(y^O,(W=h)^U,24),w=h),l=c=h,r[V>>2]=a,r[V+4>>2]=l,a=x(a^f,i^l,16),f=h,r[_>>2]=a,r[_+4>>2]=f,a=qA(y,W,a,f),r[Y>>2]=a,f=Y,Y=h,r[f+4>>2]=Y,B0=e,n0=x(a^v,Y^w,63),r[B0>>2]=n0,r[e+4>>2]=h,f=E,a=x(r0^(Y=qA(RA,XA,E,D)),o0^(v=h),32),e=x(f^(_=qA(cA,zA,a,E=h)),(e=D)^(D=h),24),Y=qA(Y,f=v,e,v=h),f=w=h,r[z>>2]=Y,r[z+4>>2]=f,Y=x(a^Y,E^f,16),a=h,r[iA>>2]=Y,r[iA+4>>2]=a,Y=qA(_,D,Y,a),r[F>>2]=Y,a=h,r[F+4>>2]=a,B0=s,n0=x(e^Y,a^v,63),r[B0>>2]=n0,r[s+4>>2]=h,(0|(b=b+1|0))!=8;);for(;b=r[768+(e=(v=t<<4)+(o+1024|0)|0)>>2],Y=r[e+772>>2],y=r[(a=e+512|0)>>2],w=r[a+4>>2],f=b,b=r[e+256>>2],a=r[e+260>>2],E=x(f^(s=qA(r[e>>2],r[e+4>>2],b,a)),(E=Y)^(Y=h),32),a=x(f=(_=qA(y,w,E,D=h))^b,a^(b=h),24),c=b,i=x((w=qA(s,Y,a,b=h))^E,(f=h)^D,16),b=x(a^(iA=qA(_,c,i,y=h)),(W=h)^b,63),Y=h,a=r[e+780>>2],l=r[e+520>>2],H=r[e+524>>2],_=x((V=r[e+776>>2])^(D=qA(c=r[(s=v=(o+1024|0)+(8|v)|0)>>2],D=r[s+4>>2],s=r[e+264>>2],E=r[e+268>>2])),(c=a)^(a=h),32),E=x(c=(V=qA(l,H,_,F=h))^s,E^(s=h),24),H=V,l=x((V=qA(D,c=a,E,a=h))^_,(c=h)^F,16),a=x(E^(tA=qA(H,s,l,AA=h)),(_A=h)^a,63),s=h,E=r[e+900>>2],N=r[e+640>>2],gA=r[e+644>>2],U=r[e+896>>2],D=r[e+384>>2],_=r[e+388>>2],z=x(U^(F=qA(r[e+128>>2],r[e+132>>2],D,_)),(H=E)^(E=h),32),_=x(H=(U=qA(N,gA,z,O=h))^D,_^(D=h),24),N=U,U=x((U=z)^(z=qA(F,H=E,_,E=h)),(H=O)^(O=h),16),E=x(_^(H=qA(N,D,U,gA=h)),(wA=h)^E,63),D=h,_=r[e+908>>2],YA=r[e+648>>2],g0=r[e+652>>2],aA=r[e+904>>2],F=r[e+392>>2],hA=r[e+396>>2],yA=x(aA^(mA=qA(r[e+136>>2],r[e+140>>2],F,hA)),(N=_)^(_=h),32),aA=hA=x(N=(bA=qA(YA,g0,yA,fA=h))^F,hA^(F=h),24),yA=x((hA=qA(mA,N=_,hA,_=h))^yA,(mA=h)^fA,16),_=x(aA^(bA=qA(bA,F,yA,fA=h)),(NA=h)^_,63),F=h,aA=H,N=wA,H=x(yA^(w=qA(w,f,a,s)),fA^(f=h),32),a=x((yA=qA(aA,N,H,wA=h))^a,(fA=h)^s,24),s=qA(s=w,f,a,w=h),f=h,r[e>>2]=s,r[e+4>>2]=f,s=x(s^H,wA^f,16),f=h,r[e+904>>2]=s,r[e+908>>2]=f,s=qA(yA,fA,s,f),f=h,r[e+640>>2]=s,r[e+644>>2]=f,B0=e,n0=x(a^s,w^f,63),r[B0+264>>2]=n0,r[e+268>>2]=h,H=E,s=qA(V,c,E,D),i=qA(bA,NA,w=x(i^s,y^(E=h),32),f=h),s=qA(s,y=E,a=x(H^i,(a=D)^(D=h),24),E=h),y=h,r[v>>2]=s,r[v+4>>2]=y,v=x(s^w,f^y,16),s=h,r[e+768>>2]=v,r[e+772>>2]=s,v=qA(i,D,v,s),r[e+648>>2]=v,s=h,r[e+652>>2]=s,B0=e,n0=x(a^v,s^E,63),r[B0+384>>2]=n0,r[e+388>>2]=h,w=_,E=x(l^(a=qA(z,O,_,F)),AA^(s=h),32),v=x(w^(_=qA(iA,W,E,D=h)),(f=F)^(F=h),24),a=qA(a,f=s,v,s=h),f=w=h,r[e+128>>2]=a,r[e+132>>2]=f,a=x(a^E,f^D,16),E=h,r[e+776>>2]=a,r[e+780>>2]=E,a=qA(_,F,a,E),r[e+512>>2]=a,E=h,r[e+516>>2]=E,B0=e,n0=x(a^v,s^E,63),r[B0+392>>2]=n0,r[e+396>>2]=h,v=qA(hA,mA,b,Y),D=qA(tA,_A,s=x(U^v,gA^(a=h),32),E=h),Y=qA(f=v,a,b=x(D^b,(_=h)^Y,24),v=h),a=h,r[e+136>>2]=Y,r[e+140>>2]=a,Y=x(s^Y,E^a,16),a=h,r[e+896>>2]=Y,r[e+900>>2]=a,Y=qA(D,_,Y,a),r[e+520>>2]=Y,a=h,r[e+524>>2]=a,B0=e,n0=x(Y^b,a^v,63),r[B0+256>>2]=n0,r[e+260>>2]=h,(0|(t=t+1|0))!=8;);mg(n,o),Kg(n,o+1024|0),BA=o+2048|0}function _n(e,t,n){var o,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0,aA=0,iA=0,hA=0,yA=0,fA=0,_A=0,wA=0,mA=0,bA=0,RA=0,j=0,rA=0,YA=0,SA=0,NA=0,VA=0,XA=0,g0=0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0,E0=0,B0=0,n0=0;for(BA=o=BA-2048|0,mg(o+1024|0,t),Kg(o+1024|0,e),mg(o,o+1024|0),t=0;s=r[(a=Y=(o+1024|0)+(64|(e=b<<7))|0)>>2],D=r[(E=v=(o+1024|0)+(96|e)|0)>>2],E=r[E+4>>2],y=s,c=r[a+4>>2],w=D,a=e+(o+1024|0)|0,_=r[(s=(o+1024|0)+(32|e)|0)>>2],D=r[s+4>>2],w=x(w^(F=qA(r[a>>2],r[a+4>>2],_,D)),(f=E)^(E=h),32),D=x(y=(i=qA(y,c,w,f=h))^_,D^(_=h),24),wA=x((gA=qA(F,y=E,D,E=h))^w,(H=h)^f,16),E=x(D^(mA=qA(i,_,wA,hA=h)),(yA=h)^E,63),D=h,w=r[(_=(o+1024|0)+(104|e)|0)>>2],i=r[_+4>>2],z=r[(f=F=(o+1024|0)+(72|e)|0)>>2],U=r[f+4>>2],V=x((V=w)^(W=qA(l=r[(f=w=(o+1024|0)+(8|e)|0)>>2],c=r[f+4>>2],iA=r[(f=(o+1024|0)+(40|e)|0)>>2],y=r[f+4>>2])),(c=i)^(i=h),32),y=x(U=(l=qA(z,U,V,c=h))^iA,y^(iA=h),24),NA=x((fA=qA(W,U=i,y,i=h))^V,(bA=h)^c,16),i=x(y^(cA=qA(l,iA,NA,g0=h)),(zA=h)^i,63),y=h,V=r[(W=iA=(o+1024|0)+(112|e)|0)>>2],l=r[W+4>>2],aA=r[(W=(o+1024|0)+(80|e)|0)>>2],N=r[W+4>>2],z=V,V=(o+1024|0)+(16|e)|0,tA=r[(AA=c=(o+1024|0)+(48|e)|0)>>2],AA=r[AA+4>>2],z=x(z^(_A=qA(r[V>>2],r[V+4>>2],tA,AA)),(U=l)^(l=h),32),AA=x(N=(U=qA(aA,N,z,O=h))^tA,AA^(tA=h),24),r0=x((ZA=qA(_A,N=l,AA,l=h))^z,(t0=h)^O,16),l=x(AA^(VA=qA(U,tA,r0,o0=h)),(YA=h)^l,63),AA=h,z=r[(tA=(o+1024|0)+(120|e)|0)>>2],O=r[tA+4>>2],E0=r[(U=_A=(o+1024|0)+(88|e)|0)>>2],SA=r[U+4>>2],j=x((aA=z)^(XA=qA($=r[(U=z=(o+1024|0)+(24|e)|0)>>2],N=r[U+4>>2],RA=r[(e=(o+1024|0)+(56|e)|0)>>2],U=r[e+4>>2])),(N=O)^(O=h),32),U=x(N=(SA=qA(E0,SA,j,rA=h))^RA,U^(RA=h),24),aA=RA,j=x((RA=qA(XA,N=O,U,O=h))^j,(XA=h)^rA,16),O=x(U^(SA=qA(SA,aA,j,rA=h)),($=h)^O,63),U=h,aA=VA,N=YA,VA=x(j^(gA=qA(gA,H,i,y)),rA^(H=h),32),i=x((j=qA(aA,N,VA,YA=h))^i,(rA=h)^y,24),y=qA(y=gA,H,i,gA=h),H=h,r[a>>2]=y,r[a+4>>2]=H,a=x(y^VA,YA^H,16),y=h,r[tA>>2]=a,r[tA+4>>2]=y,a=qA(j,rA,a,y),y=h,r[W>>2]=a,r[W+4>>2]=y,B0=f,n0=x(a^i,y^gA,63),r[B0>>2]=n0,r[f+4>>2]=h,H=l,y=x(wA^(f=qA(fA,bA,l,AA)),hA^(i=h),32),a=x(H^(l=qA(SA,$,y,W=h)),(a=AA)^(AA=h),24),f=qA(f,H=i,a,i=h),tA=h,r[w>>2]=f,r[w+4>>2]=tA,w=x(f^y,W^tA,16),f=h,r[v>>2]=w,r[v+4>>2]=f,v=qA(l,AA,w,f),r[_A>>2]=v,w=h,r[_A+4>>2]=w,B0=c,n0=x(a^v,w^i,63),r[B0>>2]=n0,r[c+4>>2]=h,a=qA(ZA,t0,O,U),y=qA(mA,yA,f=x(NA^a,g0^(w=h),32),i=h),a=qA(a,c=w,v=x(y^O,(W=h)^U,24),w=h),l=c=h,r[V>>2]=a,r[V+4>>2]=l,a=x(a^f,i^l,16),f=h,r[_>>2]=a,r[_+4>>2]=f,a=qA(y,W,a,f),r[Y>>2]=a,f=Y,Y=h,r[f+4>>2]=Y,B0=e,n0=x(a^v,Y^w,63),r[B0>>2]=n0,r[e+4>>2]=h,f=E,a=x(r0^(Y=qA(RA,XA,E,D)),o0^(v=h),32),e=x(f^(_=qA(cA,zA,a,E=h)),(e=D)^(D=h),24),Y=qA(Y,f=v,e,v=h),f=w=h,r[z>>2]=Y,r[z+4>>2]=f,Y=x(a^Y,E^f,16),a=h,r[iA>>2]=Y,r[iA+4>>2]=a,Y=qA(_,D,Y,a),r[F>>2]=Y,a=h,r[F+4>>2]=a,B0=s,n0=x(e^Y,a^v,63),r[B0>>2]=n0,r[s+4>>2]=h,(0|(b=b+1|0))!=8;);for(;b=r[768+(e=(v=t<<4)+(o+1024|0)|0)>>2],Y=r[e+772>>2],y=r[(a=e+512|0)>>2],w=r[a+4>>2],f=b,b=r[e+256>>2],a=r[e+260>>2],E=x(f^(s=qA(r[e>>2],r[e+4>>2],b,a)),(E=Y)^(Y=h),32),a=x(f=(_=qA(y,w,E,D=h))^b,a^(b=h),24),c=b,i=x((w=qA(s,Y,a,b=h))^E,(f=h)^D,16),b=x(a^(iA=qA(_,c,i,y=h)),(W=h)^b,63),Y=h,a=r[e+780>>2],l=r[e+520>>2],H=r[e+524>>2],_=x((V=r[e+776>>2])^(D=qA(c=r[(s=v=(o+1024|0)+(8|v)|0)>>2],D=r[s+4>>2],s=r[e+264>>2],E=r[e+268>>2])),(c=a)^(a=h),32),E=x(c=(V=qA(l,H,_,F=h))^s,E^(s=h),24),H=V,l=x((V=qA(D,c=a,E,a=h))^_,(c=h)^F,16),a=x(E^(tA=qA(H,s,l,AA=h)),(_A=h)^a,63),s=h,E=r[e+900>>2],N=r[e+640>>2],gA=r[e+644>>2],U=r[e+896>>2],D=r[e+384>>2],_=r[e+388>>2],z=x(U^(F=qA(r[e+128>>2],r[e+132>>2],D,_)),(H=E)^(E=h),32),_=x(H=(U=qA(N,gA,z,O=h))^D,_^(D=h),24),N=U,U=x((U=z)^(z=qA(F,H=E,_,E=h)),(H=O)^(O=h),16),E=x(_^(H=qA(N,D,U,gA=h)),(wA=h)^E,63),D=h,_=r[e+908>>2],YA=r[e+648>>2],g0=r[e+652>>2],aA=r[e+904>>2],F=r[e+392>>2],hA=r[e+396>>2],yA=x(aA^(mA=qA(r[e+136>>2],r[e+140>>2],F,hA)),(N=_)^(_=h),32),aA=hA=x(N=(bA=qA(YA,g0,yA,fA=h))^F,hA^(F=h),24),yA=x((hA=qA(mA,N=_,hA,_=h))^yA,(mA=h)^fA,16),_=x(aA^(bA=qA(bA,F,yA,fA=h)),(NA=h)^_,63),F=h,aA=H,N=wA,H=x(yA^(w=qA(w,f,a,s)),fA^(f=h),32),a=x((yA=qA(aA,N,H,wA=h))^a,(fA=h)^s,24),s=qA(s=w,f,a,w=h),f=h,r[e>>2]=s,r[e+4>>2]=f,s=x(s^H,wA^f,16),f=h,r[e+904>>2]=s,r[e+908>>2]=f,s=qA(yA,fA,s,f),f=h,r[e+640>>2]=s,r[e+644>>2]=f,B0=e,n0=x(a^s,w^f,63),r[B0+264>>2]=n0,r[e+268>>2]=h,H=E,s=qA(V,c,E,D),i=qA(bA,NA,w=x(i^s,y^(E=h),32),f=h),s=qA(s,y=E,a=x(H^i,(a=D)^(D=h),24),E=h),y=h,r[v>>2]=s,r[v+4>>2]=y,v=x(s^w,f^y,16),s=h,r[e+768>>2]=v,r[e+772>>2]=s,v=qA(i,D,v,s),r[e+648>>2]=v,s=h,r[e+652>>2]=s,B0=e,n0=x(a^v,s^E,63),r[B0+384>>2]=n0,r[e+388>>2]=h,w=_,E=x(l^(a=qA(z,O,_,F)),AA^(s=h),32),v=x(w^(_=qA(iA,W,E,D=h)),(f=F)^(F=h),24),a=qA(a,f=s,v,s=h),f=w=h,r[e+128>>2]=a,r[e+132>>2]=f,a=x(a^E,f^D,16),E=h,r[e+776>>2]=a,r[e+780>>2]=E,a=qA(_,F,a,E),r[e+512>>2]=a,E=h,r[e+516>>2]=E,B0=e,n0=x(a^v,s^E,63),r[B0+392>>2]=n0,r[e+396>>2]=h,v=qA(hA,mA,b,Y),D=qA(tA,_A,s=x(U^v,gA^(a=h),32),E=h),Y=qA(f=v,a,b=x(D^b,(_=h)^Y,24),v=h),a=h,r[e+136>>2]=Y,r[e+140>>2]=a,Y=x(s^Y,E^a,16),a=h,r[e+896>>2]=Y,r[e+900>>2]=a,Y=qA(D,_,Y,a),r[e+520>>2]=Y,a=h,r[e+524>>2]=a,B0=e,n0=x(Y^b,a^v,63),r[B0+256>>2]=n0,r[e+260>>2]=h,(0|(t=t+1|0))!=8;);mg(n,o),Kg(n,o+1024|0),BA=o+2048|0}function ot(e){var t=0,n=0,o=0,a=0,f=0,E=0,s=0,y=0,_=0;A:if(e|=0){f=(o=e-8|0)+(e=-8&(t=r[e-4>>2]))|0;t:if(!(1&t)){if(!(3&t)||(o=o-(t=r[o>>2])|0)>>>0>2]))==3)return r[8963]=e,r[f+4>>2]=-2&t,r[o+4>>2]=1|e,void(r[e+o>>2]=e)}else{if(t>>>0<=255){if(a=r[o+8>>2],t=t>>>3|0,(0|(n=r[o+12>>2]))==(0|a)){y=35844,_=r[8961]&pt(-2,t),r[y>>2]=_;break t}r[a+12>>2]=n,r[n+8>>2]=a;break t}if(s=r[o+24>>2],(0|o)==(0|(t=r[o+12>>2])))if((n=r[(a=o+20|0)>>2])||(n=r[(a=o+16|0)>>2])){for(;E=a,(n=r[(a=(t=n)+20|0)>>2])||(a=t+16|0,n=r[t+16>>2]););r[E>>2]=0}else t=0;else n=r[o+8>>2],r[n+12>>2]=t,r[t+8>>2]=n;if(!s)break t;a=r[o+28>>2];g:{if(r[(n=36148+(a<<2)|0)>>2]==(0|o)){if(r[n>>2]=t,t)break g;y=35848,_=r[8962]&pt(-2,a),r[y>>2]=_;break t}if(r[s+(r[s+16>>2]==(0|o)?16:20)>>2]=t,!t)break t}if(r[t+24>>2]=s,(n=r[o+16>>2])&&(r[t+16>>2]=n,r[n+24>>2]=t),!(n=r[o+20>>2]))break t;r[t+20>>2]=n,r[n+24>>2]=t}}if(!(o>>>0>=f>>>0)&&1&(t=r[f+4>>2])){t:{if(!(2&t)){if(r[8967]==(0|f)){if(r[8967]=o,e=r[8964]+e|0,r[8964]=e,r[o+4>>2]=1|e,r[8966]!=(0|o))break A;return r[8963]=0,void(r[8966]=0)}if(r[8966]==(0|f))return r[8966]=o,e=r[8963]+e|0,r[8963]=e,r[o+4>>2]=1|e,void(r[e+o>>2]=e);e=(-8&t)+e|0;g:if(t>>>0<=255){if(t=t>>>3|0,(0|(n=r[f+8>>2]))==(0|(a=r[f+12>>2]))){y=35844,_=r[8961]&pt(-2,t),r[y>>2]=_;break g}r[n+12>>2]=a,r[a+8>>2]=n}else{if(s=r[f+24>>2],(0|f)==(0|(t=r[f+12>>2])))if((n=r[(a=f+20|0)>>2])||(n=r[(a=f+16|0)>>2])){for(;E=a,(n=r[(a=(t=n)+20|0)>>2])||(a=t+16|0,n=r[t+16>>2]););r[E>>2]=0}else t=0;else n=r[f+8>>2],r[n+12>>2]=t,r[t+8>>2]=n;if(s){a=r[f+28>>2];r:{if(r[(n=36148+(a<<2)|0)>>2]==(0|f)){if(r[n>>2]=t,t)break r;y=35848,_=r[8962]&pt(-2,a),r[y>>2]=_;break g}if(r[s+(r[s+16>>2]==(0|f)?16:20)>>2]=t,!t)break g}r[t+24>>2]=s,(n=r[f+16>>2])&&(r[t+16>>2]=n,r[n+24>>2]=t),(n=r[f+20>>2])&&(r[t+20>>2]=n,r[n+24>>2]=t)}}if(r[o+4>>2]=1|e,r[e+o>>2]=e,r[8966]!=(0|o))break t;return void(r[8963]=e)}r[f+4>>2]=-2&t,r[o+4>>2]=1|e,r[e+o>>2]=e}if(e>>>0<=255)return t=35884+((e=e>>>3|0)<<3)|0,(n=r[8961])&(e=1<>2]:(r[8961]=e|n,e=t),r[t+8>>2]=o,r[e+12>>2]=o,r[o+12>>2]=t,void(r[o+8>>2]=e);a=31,r[o+16>>2]=0,r[o+20>>2]=0,e>>>0<=16777215&&(t=e>>>8|0,t<<=E=t+1048320>>>16&8,a=28+((t=((t<<=a=t+520192>>>16&4)<<(n=t+245760>>>16&2)>>>15|0)-(n|a|E)|0)<<1|e>>>t+21&1)|0),r[o+28>>2]=a,E=36148+(a<<2)|0;t:{g:{if((n=r[8962])&(t=1<>>1|0)|0),t=r[E>>2];;){if(n=t,(-8&r[t+4>>2])==(0|e))break g;if(t=a>>>29|0,a<<=1,!(t=r[16+(E=n+(4&t)|0)>>2]))break}r[E+16>>2]=o,r[o+24>>2]=n}else r[8962]=t|n,r[E>>2]=o,r[o+24>>2]=E;r[o+12>>2]=o,r[o+8>>2]=o;break t}e=r[n+8>>2],r[e+12>>2]=o,r[n+8>>2]=o,r[o+24>>2]=0,r[o+12>>2]=n,r[o+8>>2]=e}e=r[8969]-1|0,r[8969]=e||-1}}}function ca(e,t){var n,o=0,a=0,f=0,E=0,s=0,y=0,_=0;n=e+t|0;A:{t:if(!(1&(o=r[e+4>>2]))){if(!(3&o))break A;if(t=(o=r[e>>2])+t|0,(0|(e=e-o|0))==r[8966]){if((3&(o=r[n+4>>2]))==3)return r[8963]=t,r[n+4>>2]=-2&o,r[e+4>>2]=1|t,void(r[n>>2]=t)}else{if(o>>>0<=255){if(f=r[e+8>>2],o=o>>>3|0,(0|(a=r[e+12>>2]))==(0|f)){y=35844,_=r[8961]&pt(-2,o),r[y>>2]=_;break t}r[f+12>>2]=a,r[a+8>>2]=f;break t}if(s=r[e+24>>2],(0|(o=r[e+12>>2]))==(0|e))if((a=r[(f=e+20|0)>>2])||(a=r[(f=e+16|0)>>2])){for(;E=f,(a=r[(f=(o=a)+20|0)>>2])||(f=o+16|0,a=r[o+16>>2]););r[E>>2]=0}else o=0;else a=r[e+8>>2],r[a+12>>2]=o,r[o+8>>2]=a;if(!s)break t;f=r[e+28>>2];g:{if(r[(a=36148+(f<<2)|0)>>2]==(0|e)){if(r[a>>2]=o,o)break g;y=35848,_=r[8962]&pt(-2,f),r[y>>2]=_;break t}if(r[s+(r[s+16>>2]==(0|e)?16:20)>>2]=o,!o)break t}if(r[o+24>>2]=s,(a=r[e+16>>2])&&(r[o+16>>2]=a,r[a+24>>2]=o),!(a=r[e+20>>2]))break t;r[o+20>>2]=a,r[a+24>>2]=o}}t:{if(!(2&(o=r[n+4>>2]))){if(r[8967]==(0|n)){if(r[8967]=e,t=r[8964]+t|0,r[8964]=t,r[e+4>>2]=1|t,r[8966]!=(0|e))break A;return r[8963]=0,void(r[8966]=0)}if(r[8966]==(0|n))return r[8966]=e,t=r[8963]+t|0,r[8963]=t,r[e+4>>2]=1|t,void(r[e+t>>2]=t);t=(-8&o)+t|0;g:if(o>>>0<=255){if(f=r[n+8>>2],o=o>>>3|0,(0|(a=r[n+12>>2]))==(0|f)){y=35844,_=r[8961]&pt(-2,o),r[y>>2]=_;break g}r[f+12>>2]=a,r[a+8>>2]=f}else{if(s=r[n+24>>2],(0|n)==(0|(o=r[n+12>>2])))if((f=r[(a=n+20|0)>>2])||(f=r[(a=n+16|0)>>2])){for(;E=a,(f=r[(a=(o=f)+20|0)>>2])||(a=o+16|0,f=r[o+16>>2]););r[E>>2]=0}else o=0;else a=r[n+8>>2],r[a+12>>2]=o,r[o+8>>2]=a;if(s){f=r[n+28>>2];r:{if(r[(a=36148+(f<<2)|0)>>2]==(0|n)){if(r[a>>2]=o,o)break r;y=35848,_=r[8962]&pt(-2,f),r[y>>2]=_;break g}if(r[s+(r[s+16>>2]==(0|n)?16:20)>>2]=o,!o)break g}r[o+24>>2]=s,(a=r[n+16>>2])&&(r[o+16>>2]=a,r[a+24>>2]=o),(a=r[n+20>>2])&&(r[o+20>>2]=a,r[a+24>>2]=o)}}if(r[e+4>>2]=1|t,r[e+t>>2]=t,r[8966]!=(0|e))break t;return void(r[8963]=t)}r[n+4>>2]=-2&o,r[e+4>>2]=1|t,r[e+t>>2]=t}if(t>>>0<=255)return o=35884+((t=t>>>3|0)<<3)|0,(a=r[8961])&(t=1<>2]:(r[8961]=t|a,t=o),r[o+8>>2]=e,r[t+12>>2]=e,r[e+12>>2]=o,void(r[e+8>>2]=t);f=31,r[e+16>>2]=0,r[e+20>>2]=0,t>>>0<=16777215&&(o=t>>>8|0,o<<=E=o+1048320>>>16&8,f=28+((o=((o<<=f=o+520192>>>16&4)<<(a=o+245760>>>16&2)>>>15|0)-(a|f|E)|0)<<1|t>>>o+21&1)|0),r[e+28>>2]=f,E=36148+(f<<2)|0;t:{if((a=r[8962])&(o=1<>>1|0)|0),o=r[E>>2];;){if(a=o,(-8&r[o+4>>2])==(0|t))break t;if(o=f>>>29|0,f<<=1,!(o=r[16+(E=a+(4&o)|0)>>2]))break}r[E+16>>2]=e,r[e+24>>2]=a}else r[8962]=o|a,r[E>>2]=e,r[e+24>>2]=E;return r[e+12>>2]=e,void(r[e+8>>2]=e)}t=r[a+8>>2],r[t+12>>2]=e,r[a+8>>2]=e,r[e+24>>2]=0,r[e+12>>2]=a,r[e+8>>2]=t}}function tr(e,t,n,o,a){var f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0,aA=0,iA=0,hA=0,yA=0,fA=0,_A=0,wA=0,mA=0,bA=0,RA=0,j=0,rA=0,YA=0,SA=0,NA=0,VA=0,XA=0,g0=0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0;for(BA=f=BA+-64|0,E=r[e+60>>2],s=r[e+56>>2],j=r[e+52>>2],bA=r[e+48>>2],y=r[e+44>>2],_=r[e+40>>2],w=r[e+36>>2],D=r[e+32>>2],v=r[e+28>>2],Y=r[e+24>>2],U=r[e+20>>2],H=r[e+16>>2],i=r[e+12>>2],c=r[e+8>>2],N=r[e+4>>2],l=r[e>>2];;){if(!a&o>>>0>63|a)V=n;else{if(W=0,V=F=L0(f,0,64),o|a)for(;p[F+W|0]=u[t+W|0],!a&(W=W+1|0)>>>0>>0|a;);t=V,SA=n}for(rA=20,AA=l,gA=N,aA=c,iA=i,W=H,F=U,n=Y,hA=v,O=D,z=w,yA=_,fA=E,_A=s,b=j,wA=bA,RA=y;tA=W,AA=TA((W=W+AA|0)^wA,16),wA=TA(tA^(O=AA+O|0),12),tA=O,O=TA((O=AA)^(AA=W+wA|0),8),W=TA(wA^(mA=tA+O|0),7),tA=F,gA=TA((F=F+gA|0)^b,16),b=TA(tA^(z=gA+z|0),12),tA=z,z=TA((z=gA)^(gA=F+b|0),8),F=TA(b^(YA=tA+z|0),7),b=n,aA=TA((n=n+aA|0)^_A,16),tA=_A=TA(b^(yA=aA+yA|0),12),_A=TA((b=aA)^(aA=n+_A|0),8),n=TA(tA^(yA=_A+yA|0),7),b=hA,iA=TA((hA=hA+iA|0)^fA,16),RA=b=TA(b^(fA=iA+RA|0),12),tA=fA,fA=TA((fA=iA)^(iA=hA+b|0),8),hA=TA(RA^(b=tA+fA|0),7),tA=yA,yA=TA((AA=F+AA|0)^fA,16),F=TA((wA=tA+yA|0)^F,12),fA=TA(yA^(AA=F+AA|0),8),F=TA(F^(yA=wA+fA|0),7),O=TA((gA=n+gA|0)^O,16),n=TA((b=O+b|0)^n,12),wA=TA(O^(gA=n+gA|0),8),n=TA(n^(RA=b+wA|0),7),O=TA((aA=hA+aA|0)^z,16),hA=TA((z=O+mA|0)^hA,12),b=TA(O^(aA=hA+aA|0),8),hA=TA(hA^(O=z+b|0),7),z=TA((iA=W+iA|0)^_A,16),W=TA((mA=z+YA|0)^W,12),_A=TA(z^(iA=W+iA|0),8),W=TA(W^(z=mA+_A|0),7),rA=rA-2|0;);if(rA=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24,mA=u[t+8|0]|u[t+9|0]<<8|u[t+10|0]<<16|u[t+11|0]<<24,YA=u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24,NA=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,VA=u[t+20|0]|u[t+21|0]<<8|u[t+22|0]<<16|u[t+23|0]<<24,XA=u[t+24|0]|u[t+25|0]<<8|u[t+26|0]<<16|u[t+27|0]<<24,g0=u[t+28|0]|u[t+29|0]<<8|u[t+30|0]<<16|u[t+31|0]<<24,$=u[t+32|0]|u[t+33|0]<<8|u[t+34|0]<<16|u[t+35|0]<<24,cA=u[t+36|0]|u[t+37|0]<<8|u[t+38|0]<<16|u[t+39|0]<<24,zA=u[t+40|0]|u[t+41|0]<<8|u[t+42|0]<<16|u[t+43|0]<<24,ZA=u[t+44|0]|u[t+45|0]<<8|u[t+46|0]<<16|u[t+47|0]<<24,t0=u[t+48|0]|u[t+49|0]<<8|u[t+50|0]<<16|u[t+51|0]<<24,r0=u[t+52|0]|u[t+53|0]<<8|u[t+54|0]<<16|u[t+55|0]<<24,o0=u[t+56|0]|u[t+57|0]<<8|u[t+58|0]<<16|u[t+59|0]<<24,tA=u[t+60|0]|u[t+61|0]<<8|u[t+62|0]<<16|u[t+63|0]<<24,y0(V,AA+l^(u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24)),y0(V+4|0,gA+N^rA),y0(V+8|0,aA+c^mA),y0(V+12|0,iA+i^YA),y0(V+16|0,W+H^NA),y0(V+20|0,F+U^VA),y0(V+24|0,n+Y^XA),y0(V+28|0,hA+v^g0),y0(V+32|0,O+D^$),y0(V+36|0,z+w^cA),y0(V+40|0,zA^yA+_),y0(V+44|0,ZA^RA+y),y0(V+48|0,t0^wA+bA),y0(V+52|0,r0^b+j),y0(V+56|0,o0^_A+s),y0(V+60|0,tA^fA+E),j=((bA=(n=bA)+1|0)>>>0>>0)+j|0,!a&o>>>0<=64){if(!(!o|!a&o>>>0>63|(0|a)!=0))for(F=0;p[F+SA|0]=u[V+F|0],(0|o)!=(0|(F=F+1|0)););r[e+52>>2]=j,r[e+48>>2]=bA,BA=f- -64|0;break}t=t- -64|0,n=V- -64|0,a=a-1|0,a=(o=o+-64|0)>>>0<4294967232?a+1|0:a}}function NB(e,t,n,o){var a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0,z=0,tA=0,AA=0,gA=0;if(v=r[e+36>>2],s=r[e+32>>2],E=r[e+28>>2],f=r[e+24>>2],y=r[e+20>>2],!o&n>>>0>=16|o)for(O=!u[e+80|0]<<24,U=r[e+4>>2],z=xA(U,5),c=r[e+8>>2],W=xA(c,5),b=r[e+12>>2],V=xA(b,5),a=r[e+16>>2],N=xA(a,5),tA=a,H=r[e>>2];a=K(_=((u[t+3|0]|u[t+4|0]<<8|u[t+5|0]<<16|u[t+6|0]<<24)>>>2&67108863)+f|0,0,b,0),w=h,f=(Y=K(y=(67108863&(u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24))+y|0,0,tA,0))+a|0,a=h+w|0,a=f>>>0>>0?a+1|0:a,D=f,f=K(w=((u[t+6|0]|u[t+7|0]<<8|u[t+8|0]<<16|u[t+9|0]<<24)>>>4&67108863)+E|0,0,c,0),a=h+a|0,a=f>>>0>(E=D+f|0)>>>0?a+1|0:a,f=E,E=K(Y=((u[t+9|0]|u[t+10|0]<<8|u[t+11|0]<<16|u[t+12|0]<<24)>>>6|0)+s|0,0,U,0),a=h+a|0,a=E>>>0>(s=f+E|0)>>>0?a+1|0:a,f=s,s=K(i=v+O+((u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24)>>>8)|0,0,H,0),a=h+a|0,AA=v=f+s|0,v=s>>>0>v>>>0?a+1|0:a,a=K(_,0,c,0),E=h,s=(f=K(y,0,b,0))+a|0,a=h+E|0,a=f>>>0>s>>>0?a+1|0:a,E=K(w,0,U,0),a=h+a|0,a=E>>>0>(s=E+s|0)>>>0?a+1|0:a,E=K(Y,0,H,0),a=h+a|0,a=E>>>0>(s=E+s|0)>>>0?a+1|0:a,E=K(i,0,N,0),a=h+a|0,gA=s=E+s|0,s=E>>>0>s>>>0?a+1|0:a,a=K(_,0,U,0),f=h,E=(l=K(y,0,c,0))+a|0,a=h+f|0,a=E>>>0>>0?a+1|0:a,f=K(w,0,H,0),a=h+a|0,a=f>>>0>(E=f+E|0)>>>0?a+1|0:a,f=K(Y,0,N,0),a=h+a|0,a=f>>>0>(E=f+E|0)>>>0?a+1|0:a,f=K(i,0,V,0),a=h+a|0,l=E=f+E|0,E=f>>>0>E>>>0?a+1|0:a,a=K(_,0,H,0),D=h,f=(F=K(y,0,U,0))+a|0,a=h+D|0,a=f>>>0>>0?a+1|0:a,D=K(w,0,N,0),a=h+a|0,a=(f=D+f|0)>>>0>>0?a+1|0:a,D=K(Y,0,V,0),a=h+a|0,a=(f=D+f|0)>>>0>>0?a+1|0:a,D=K(i,0,W,0),a=h+a|0,a=(f=D+f|0)>>>0>>0?a+1|0:a,D=f,f=a,a=K(_,0,N,0),F=h,_=(y=K(y,0,H,0))+a|0,a=h+F|0,a=_>>>0>>0?a+1|0:a,y=K(w,0,V,0),a=h+a|0,a=(_=y+_|0)>>>0>>0?a+1|0:a,y=K(Y,0,W,0),a=h+a|0,a=(_=y+_|0)>>>0>>0?a+1|0:a,y=K(i,0,z,0),a=h+a|0,a=(_=y+_|0)>>>0>>0?a+1|0:a,y=_,w=(67108863&a)<<6|_>>>26,a=f,w=(67108863&(a=(_=w+D|0)>>>0>>0?a+1|0:a))<<6|(f=_)>>>26,a=E,a=(f=w+l|0)>>>0>>0?a+1|0:a,w=f,f=(67108863&a)<<6|f>>>26,a=s,Y=E=f+gA|0,E=(67108863&(a=f>>>0>E>>>0?a+1|0:a))<<6|E>>>26,a=v,v=s=E+AA|0,f=(67108863&_)+((a=xA((67108863&(a=E>>>0>s>>>0?a+1|0:a))<<6|s>>>26,5)+(67108863&y)|0)>>>26|0)|0,E=67108863&w,s=67108863&Y,v&=67108863,y=67108863&a,t=t+16|0,!(o=o-(n>>>0<16)|0)&(n=n-16|0)>>>0>15|o;);r[e+20>>2]=y,r[e+36>>2]=v,r[e+32>>2]=s,r[e+28>>2]=E,r[e+24>>2]=f}function ha(e,t,n){var o,a,f,E,s=0,y=0,_=0,w=0,D=0;return BA=f=BA-160|0,he(t,n,32,0),p[0|t]=248&u[0|t],p[t+31|0]=63&u[t+31|0]|64,PB(f,t),OB(e,f),y=u[(a=n)+8|0]|u[a+9|0]<<8|u[a+10|0]<<16|u[a+11|0]<<24,s=u[a+12|0]|u[a+13|0]<<8|u[a+14|0]<<16|u[a+15|0]<<24,_=u[a+16|0]|u[a+17|0]<<8|u[a+18|0]<<16|u[a+19|0]<<24,w=u[a+20|0]|u[a+21|0]<<8|u[a+22|0]<<16|u[a+23|0]<<24,D=u[0|a]|u[a+1|0]<<8|u[a+2|0]<<16|u[a+3|0]<<24,n=u[a+4|0]|u[a+5|0]<<8|u[a+6|0]<<16|u[a+7|0]<<24,o=t,E=u[a+28|0]|u[a+29|0]<<8|u[a+30|0]<<16|u[a+31|0]<<24,t=u[a+24|0]|u[a+25|0]<<8|u[a+26|0]<<16|u[a+27|0]<<24,p[o+24|0]=t,p[o+25|0]=t>>>8,p[o+26|0]=t>>>16,p[o+27|0]=t>>>24,p[o+28|0]=E,p[o+29|0]=E>>>8,p[o+30|0]=E>>>16,p[o+31|0]=E>>>24,p[o+16|0]=_,p[o+17|0]=_>>>8,p[o+18|0]=_>>>16,p[o+19|0]=_>>>24,p[o+20|0]=w,p[o+21|0]=w>>>8,p[o+22|0]=w>>>16,p[o+23|0]=w>>>24,p[o+8|0]=y,p[o+9|0]=y>>>8,p[o+10|0]=y>>>16,p[o+11|0]=y>>>24,p[o+12|0]=s,p[o+13|0]=s>>>8,p[o+14|0]=s>>>16,p[o+15|0]=s>>>24,p[0|o]=D,p[o+1|0]=D>>>8,p[o+2|0]=D>>>16,p[o+3|0]=D>>>24,p[o+4|0]=n,p[o+5|0]=n>>>8,p[o+6|0]=n>>>16,p[o+7|0]=n>>>24,_=u[(s=e)+8|0]|u[s+9|0]<<8|u[s+10|0]<<16|u[s+11|0]<<24,w=u[s+12|0]|u[s+13|0]<<8|u[s+14|0]<<16|u[s+15|0]<<24,D=u[s+16|0]|u[s+17|0]<<8|u[s+18|0]<<16|u[s+19|0]<<24,n=u[s+20|0]|u[s+21|0]<<8|u[s+22|0]<<16|u[s+23|0]<<24,t=u[0|s]|u[s+1|0]<<8|u[s+2|0]<<16|u[s+3|0]<<24,e=u[s+4|0]|u[s+5|0]<<8|u[s+6|0]<<16|u[s+7|0]<<24,y=u[s+28|0]|u[s+29|0]<<8|u[s+30|0]<<16|u[s+31|0]<<24,s=u[s+24|0]|u[s+25|0]<<8|u[s+26|0]<<16|u[s+27|0]<<24,p[o+56|0]=s,p[o+57|0]=s>>>8,p[o+58|0]=s>>>16,p[o+59|0]=s>>>24,p[o+60|0]=y,p[o+61|0]=y>>>8,p[o+62|0]=y>>>16,p[o+63|0]=y>>>24,p[o+48|0]=D,p[o+49|0]=D>>>8,p[o+50|0]=D>>>16,p[o+51|0]=D>>>24,p[o+52|0]=n,p[o+53|0]=n>>>8,p[o+54|0]=n>>>16,p[o+55|0]=n>>>24,p[o+40|0]=_,p[o+41|0]=_>>>8,p[o+42|0]=_>>>16,p[o+43|0]=_>>>24,p[o+44|0]=w,p[o+45|0]=w>>>8,p[o+46|0]=w>>>16,p[o+47|0]=w>>>24,p[o+32|0]=t,p[o+33|0]=t>>>8,p[o+34|0]=t>>>16,p[o+35|0]=t>>>24,p[o+36|0]=e,p[o+37|0]=e>>>8,p[o+38|0]=e>>>16,p[o+39|0]=e>>>24,BA=f+160|0,0}function UB(e,t,n){var o,a=0,f=0,E=0;BA=o=BA+-64|0;A:{if(!(!n|n>>>0>=65)){if(a=-1,!(u[e+80|0]|u[e+81|0]<<8|u[e+82|0]<<16|u[e+83|0]<<24|u[e+84|0]|u[e+85|0]<<8|u[e+86|0]<<16|u[e+87|0]<<24)){if(f=e,(a=u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)>>>0>=129){if(KB(e,128),SB(e,E=e+96|0),a=(u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)-128|0,p[e+352|0]=a,p[e+353|0]=a>>>8,p[e+354|0]=a>>>16,p[e+355|0]=a>>>24,a>>>0>=129)break A;V0(E,e+224|0,a),a=u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24}KB(f,a),u[e+356|0]&&(p[e+88|0]=255,p[e+89|0]=255,p[e+90|0]=255,p[e+91|0]=255,p[e+92|0]=255,p[e+93|0]=255,p[e+94|0]=255,p[e+95|0]=255),p[e+80|0]=255,p[e+81|0]=255,p[e+82|0]=255,p[e+83|0]=255,p[e+84|0]=255,p[e+85|0]=255,p[e+86|0]=255,p[e+87|0]=255,L0((a=e+96|0)+(f=u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)|0,0,256-f|0),SB(e,a),q0(o,u[0|e]|u[e+1|0]<<8|u[e+2|0]<<16|u[e+3|0]<<24,u[e+4|0]|u[e+5|0]<<8|u[e+6|0]<<16|u[e+7|0]<<24),q0(8|o,u[e+8|0]|u[e+9|0]<<8|u[e+10|0]<<16|u[e+11|0]<<24,u[e+12|0]|u[e+13|0]<<8|u[e+14|0]<<16|u[e+15|0]<<24),q0(o+16|0,u[e+16|0]|u[e+17|0]<<8|u[e+18|0]<<16|u[e+19|0]<<24,u[e+20|0]|u[e+21|0]<<8|u[e+22|0]<<16|u[e+23|0]<<24),q0(o+24|0,u[e+24|0]|u[e+25|0]<<8|u[e+26|0]<<16|u[e+27|0]<<24,u[e+28|0]|u[e+29|0]<<8|u[e+30|0]<<16|u[e+31|0]<<24),q0(o+32|0,u[e+32|0]|u[e+33|0]<<8|u[e+34|0]<<16|u[e+35|0]<<24,u[e+36|0]|u[e+37|0]<<8|u[e+38|0]<<16|u[e+39|0]<<24),q0(o+40|0,u[e+40|0]|u[e+41|0]<<8|u[e+42|0]<<16|u[e+43|0]<<24,u[e+44|0]|u[e+45|0]<<8|u[e+46|0]<<16|u[e+47|0]<<24),q0(o+48|0,u[e+48|0]|u[e+49|0]<<8|u[e+50|0]<<16|u[e+51|0]<<24,u[e+52|0]|u[e+53|0]<<8|u[e+54|0]<<16|u[e+55|0]<<24),q0(o+56|0,u[e+56|0]|u[e+57|0]<<8|u[e+58|0]<<16|u[e+59|0]<<24,u[e+60|0]|u[e+61|0]<<8|u[e+62|0]<<16|u[e+63|0]<<24),V0(t,o,n),Q0(e,64),Q0(a,256),a=0}return BA=o- -64|0,a}z0(),s0()}D0(1854,1886,306,1931),s0()}function ya(e,t){var n,o,a,f,E,s,y,_,w,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0;n=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,l=U0(t+4|0),D=h,c=U0(t+7|0),Y=h,N=U0(t+10|0),v=h,o=U0(t+13|0),H=h,U=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,a=U0(t+20|0),F=h,f=U0(t+23|0),E=h,s=U0(t+26|0),y=h,_=U0(t+29|0),t=v<<3|N>>>29,b=v=N<<3,N=v=v+16777216|0,v=t=v>>>0<16777216?t+1|0:t,Y=t=Y<<5|c>>>27,w=i=c<<5,D=t=D<<6|(c=l)>>>26,l=t=16777216+(c<<=6)|0,i=t,t=(t=(D=t>>>0<16777216?D+1|0:D)>>25)+Y|0,t=(D=w+(i=(33554431&D)<<7|i>>>25)|0)>>>0>>0?t+1|0:t,(Y=D+33554432|0)>>>0<33554432&&(t=t+1|0),t=(b-(-33554432&N)|0)+((67108863&t)<<6|Y>>>26)|0,r[e+12>>2]=t,t=-67108864&Y,r[e+8>>2]=D-t,t=0,i=U=(Y=U)+16777216|0,U=t=U>>>0<16777216?1:t,b=Y-(-33554432&i)|0,t=H<<2|(Y=o)>>>30,H=Y<<2,Y=t,t=(t=v>>25)+Y|0,D=t=(v=(D=H)+(H=(33554431&v)<<7|N>>>25)|0)>>>0>>0?t+1|0:t,Y=t=v+33554432|0,t=((67108863&(D=t>>>0<33554432?D+1|0:D))<<6|t>>>26)+b|0,r[e+20>>2]=t,t=-67108864&Y,r[e+16>>2]=v-t,H=(D=a)<<7,t=(t=F<<7|D>>>25)+(D=U>>25)|0,t=(U=H+(Y=(33554431&U)<<7|i>>>25)|0)>>>0>>0?t+1|0:t,U=D=U,Y=D=D+33554432|0,D=t=D>>>0<33554432?t+1|0:t,t=-67108864&Y,r[(v=e)+24>>2]=U-t,U=v,t=E<<5|(v=f)>>>27,F=v<<=5,H=v=v+16777216|0,v=t=v>>>0<16777216?t+1|0:t,t=(F-(-33554432&H)|0)+((67108863&D)<<6|Y>>>26)|0,r[U+28>>2]=t,Y=(D=s)<<4,D=t=y<<4|D>>>28,t=(t=v>>25)+D|0,t=(v=(i=Y)+(Y=(33554431&v)<<7|H>>>25)|0)>>>0>>0?t+1|0:t,v=D=v,Y=D=D+33554432|0,D=t=D>>>0<33554432?t+1|0:t,t=-67108864&Y,r[U+32>>2]=v-t,t=0,v=U=(U=_)<<2&33554428,t=(U=U+16777216|0)>>>0<16777216?t+1|0:t,D=(v-(33554432&U)|0)+((67108863&D)<<6|Y>>>26)|0,r[e+36>>2]=D,U=K((33554431&t)<<7|U>>>25,t>>>25|0,19,0),t=h,t=(D=U+n|0)>>>0>>0?t+1|0:t,(v=D+33554432|0)>>>0<33554432&&(t=t+1|0),t=(c-(-33554432&l)|0)+((67108863&t)<<6|v>>>26)|0,r[e+4>>2]=t,t=e,e=-67108864&v,r[t>>2]=D-e}function pn(e,t){var n,o,a,f,E,s,y,_,w,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0;b=v=r[(D=t)+4>>2],l=v>>31,V=v=r[D+8>>2],o=v>>31,c=v=r[D+12>>2],F=v>>31,W=v=r[D+16>>2],a=v>>31,N=v=r[D+20>>2],i=v>>31,O=v=r[D+24>>2],f=v>>31,E=v=r[D>>2],s=v>>31,U=v=K(D=r[D+36>>2],D>>31,121666,0),D=h,n=v=v+16777216|0,v=D=v>>>0<16777216?D+1|0:D,y=U-(-33554432&n)|0,Y=K(D=r[t+32>>2],D>>31,121666,0),_=h,U=K(t=r[t+28>>2],t>>31,121666,0),D=h,H=Y,w=t=U+16777216|0,Y=t,t=(t=(D=t>>>0<16777216?D+1|0:D)>>25)+_|0,t=(D=H+(Y=(33554431&D)<<7|Y>>>25)|0)>>>0>>0?t+1|0:t,Y=D,D=t,H=t=Y+33554432|0,t=((67108863&(D=t>>>0<33554432?D+1|0:D))<<6|t>>>26)+y|0,r[e+36>>2]=t,t=-67108864&H,r[e+32>>2]=Y-t,H=U-(-33554432&w)|0,D=K(O,f,121666,0),O=h,U=K(N,i,121666,0),t=h,Y=D,N=D=U+16777216|0,i=D,D=(D=(t=D>>>0<16777216?t+1|0:t)>>25)+O|0,D=(t=Y+(i=(33554431&t)<<7|i>>>25)|0)>>>0>>0?D+1|0:D,(Y=t+33554432|0)>>>0<33554432&&(D=D+1|0),D=H+((67108863&D)<<6|Y>>>26)|0,r[e+28>>2]=D,D=-67108864&Y,r[e+24>>2]=t-D,N=U-(-33554432&N)|0,t=K(W,a,121666,0),W=h,U=K(c,F,121666,0),D=h,H=t,c=t=U+16777216|0,F=(33554431&(D=t>>>0<16777216?D+1|0:D))<<7|t>>>25,D=(D>>25)+W|0,t=D=(Y=H+F|0)>>>0>>0?D+1|0:D,t=((67108863&(t=(D=Y+33554432|0)>>>0<33554432?t+1|0:t))<<6|D>>>26)+N|0,r[e+20>>2]=t,t=-67108864&D,r[e+16>>2]=Y-t,c=U-(-33554432&c)|0,D=K(V,o,121666,0),V=h,U=K(b,l,121666,0),t=h,H=D,b=D=U+16777216|0,l=(33554431&(t=D>>>0<16777216?t+1|0:t))<<7|D>>>25,t=(t>>25)+V|0,D=t=(Y=H+l|0)>>>0>>0?t+1|0:t,H=t=Y+33554432|0,t=((67108863&(D=t>>>0<33554432?D+1|0:D))<<6|t>>>26)+c|0,r[e+12>>2]=t,t=-67108864&H,r[e+8>>2]=Y-t,t=K((33554431&v)<<7|n>>>25,v>>25,19,0),D=h,H=U-(-33554432&b)|0,v=K(E,s,121666,0),D=h+D|0,D=(t=v+t|0)>>>0>>0?D+1|0:D,(v=t+33554432|0)>>>0<33554432&&(D=D+1|0),D=H+((67108863&D)<<6|v>>>26)|0,r[e+4>>2]=D,D=e,e=-67108864&v,r[D>>2]=t-e}function ln(e,t,n,o){var a,f=0,E=0;BA=a=BA-16|0,f=-31;A:{t:{g:{r:switch(o-1|0){case 1:if(t>>>0<13)break t;o=u[35660]|u[35661]<<8|u[35662]<<16|u[35663]<<24,f=u[35656]|u[35657]<<8|u[35658]<<16|u[35659]<<24,p[0|e]=f,p[e+1|0]=f>>>8,p[e+2|0]=f>>>16,p[e+3|0]=f>>>24,p[e+4|0]=o,p[e+5|0]=o>>>8,p[e+6|0]=o>>>16,p[e+7|0]=o>>>24,o=u[35665]|u[35666]<<8|u[35667]<<16|u[35668]<<24,f=u[35661]|u[35662]<<8|u[35663]<<16|u[35664]<<24,p[e+5|0]=f,p[e+6|0]=f>>>8,p[e+7|0]=f>>>16,p[e+8|0]=f>>>24,p[e+9|0]=o,p[e+10|0]=o>>>8,p[e+11|0]=o>>>16,p[e+12|0]=o>>>24,E=-12,o=12;break g;case 0:break r;default:break A}if(t>>>0<12)break t;o=u[35673]|u[35674]<<8|u[35675]<<16|u[35676]<<24,f=u[35669]|u[35670]<<8|u[35671]<<16|u[35672]<<24,p[0|e]=f,p[e+1|0]=f>>>8,p[e+2|0]=f>>>16,p[e+3|0]=f>>>24,p[e+4|0]=o,p[e+5|0]=o>>>8,p[e+6|0]=o>>>16,p[e+7|0]=o>>>24,o=u[35677]|u[35678]<<8|u[35679]<<16|u[35680]<<24,p[e+8|0]=o,p[e+9|0]=o>>>8,p[e+10|0]=o>>>16,p[e+11|0]=o>>>24,E=-11,o=11}if(f=qB(n))break A;if(ir(a+5|0,19),!((f=t+E|0)>>>0<=(t=Ut(a+5|0))>>>0)&&(e=V0(e+o|0,a+5|0,t+1|0),!((o=f-t|0)>>>0<4)&&(p[0|(e=e+t|0)]=36,p[e+1|0]=109,p[e+2|0]=61,p[e+3|0]=0,ir(a+5|0,r[n+44>>2]),!((o=o-3|0)>>>0<=(t=Ut(a+5|0))>>>0)&&(e=V0(e+3|0,a+5|0,t+1|0),!((o=o-t|0)>>>0<4)&&(p[0|(e=e+t|0)]=44,p[e+1|0]=116,p[e+2|0]=61,p[e+3|0]=0,ir(a+5|0,r[n+40>>2]),!((o=o-3|0)>>>0<=(t=Ut(a+5|0))>>>0)&&(e=V0(e+3|0,a+5|0,t+1|0),!((o=o-t|0)>>>0<4)&&(p[0|(e=e+t|0)]=44,p[e+1|0]=112,p[e+2|0]=61,p[e+3|0]=0,ir(a+5|0,r[n+48>>2]),!((o=o-3|0)>>>0<=(t=Ut(a+5|0))>>>0)&&(e=V0(e+3|0,a+5|0,t+1|0),!((o=o-t|0)>>>0<2)&&(p[0|(e=e+t|0)]=36,p[e+1|0]=0,JB(e=e+1|0,t=o-1|0,r[n+16>>2],r[n+20>>2],3)))))))))){if(f=-31,(o=(o=t)-(t=Ut(e))|0)>>>0<2)break A;return p[0|(e=e+t|0)]=36,p[e+1|0]=0,e=JB(e+1|0,o-1|0,r[n>>2],r[n+4>>2],3),BA=a+16|0,e?0:-31}}f=-31}return BA=a+16|0,f}function MB(e,t,n,o){var a,f=0;a=f=BA,BA=f=f-576&-64,r[f+188>>2]=0,y0(f+188|0,t);A:if(t>>>0<=64){if((0|Cr(f+192|0,0,0,t))<0)break A;(0|at(f+192|0,f+188|0,4,0))<0,(0|at(f+192|0,n,o,0))<0,Er(f+192|0,e,t)}else if(!((0|Cr(f+192|0,0,0,64))<0||(0|at(f+192|0,f+188|0,4,0))<0||(0|at(f+192|0,n,o,0))<0||(0|Er(f+192|0,f+112|0,64))<0)){if(n=r[f+116>>2],o=r[f+112>>2],p[0|e]=o,p[e+1|0]=o>>>8,p[e+2|0]=o>>>16,p[e+3|0]=o>>>24,p[e+4|0]=n,p[e+5|0]=n>>>8,p[e+6|0]=n>>>16,p[e+7|0]=n>>>24,n=r[f+124>>2],o=r[f+120>>2],p[e+8|0]=o,p[e+9|0]=o>>>8,p[e+10|0]=o>>>16,p[e+11|0]=o>>>24,p[e+12|0]=n,p[e+13|0]=n>>>8,p[e+14|0]=n>>>16,p[e+15|0]=n>>>24,n=r[f+140>>2],o=r[f+136>>2],p[e+24|0]=o,p[e+25|0]=o>>>8,p[e+26|0]=o>>>16,p[e+27|0]=o>>>24,p[e+28|0]=n,p[e+29|0]=n>>>8,p[e+30|0]=n>>>16,p[e+31|0]=n>>>24,n=r[f+132>>2],o=r[f+128>>2],p[e+16|0]=o,p[e+17|0]=o>>>8,p[e+18|0]=o>>>16,p[e+19|0]=o>>>24,p[e+20|0]=n,p[e+21|0]=n>>>8,p[e+22|0]=n>>>16,p[e+23|0]=n>>>24,e=e+32|0,(t=t-32|0)>>>0>=65)for(;;){if(V0(f+48|0,f+112|0,64),(0|ZB(f+112|0,64,f+48|0,64,0,0,0))<0)break A;if(n=r[f+116>>2],o=r[f+112>>2],p[0|e]=o,p[e+1|0]=o>>>8,p[e+2|0]=o>>>16,p[e+3|0]=o>>>24,p[e+4|0]=n,p[e+5|0]=n>>>8,p[e+6|0]=n>>>16,p[e+7|0]=n>>>24,n=r[f+124>>2],o=r[f+120>>2],p[e+8|0]=o,p[e+9|0]=o>>>8,p[e+10|0]=o>>>16,p[e+11|0]=o>>>24,p[e+12|0]=n,p[e+13|0]=n>>>8,p[e+14|0]=n>>>16,p[e+15|0]=n>>>24,n=r[f+140>>2],o=r[f+136>>2],p[e+24|0]=o,p[e+25|0]=o>>>8,p[e+26|0]=o>>>16,p[e+27|0]=o>>>24,p[e+28|0]=n,p[e+29|0]=n>>>8,p[e+30|0]=n>>>16,p[e+31|0]=n>>>24,n=r[f+132>>2],o=r[f+128>>2],p[e+16|0]=o,p[e+17|0]=o>>>8,p[e+18|0]=o>>>16,p[e+19|0]=o>>>24,p[e+20|0]=n,p[e+21|0]=n>>>8,p[e+22|0]=n>>>16,p[e+23|0]=n>>>24,e=e+32|0,!((t=t-32|0)>>>0>64))break}V0(f+48|0,f+112|0,64),(0|ZB(f+112|0,t,f+48|0,64,0,0,0))<0||V0(e,f+112|0,t)}Q0(f+192|0,384),BA=a}function gr(e,t,n){var o=0,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0;for(f=2036477234,D=857760878,v=1634760805,E=1797285236,w=u[0|n]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24,o=u[n+4|0]|u[n+5|0]<<8|u[n+6|0]<<16|u[n+7|0]<<24,a=u[n+8|0]|u[n+9|0]<<8|u[n+10|0]<<16|u[n+11|0]<<24,y=u[n+12|0]|u[n+13|0]<<8|u[n+14|0]<<16|u[n+15|0]<<24,U=u[n+16|0]|u[n+17|0]<<8|u[n+18|0]<<16|u[n+19|0]<<24,H=u[n+20|0]|u[n+21|0]<<8|u[n+22|0]<<16|u[n+23|0]<<24,c=u[n+24|0]|u[n+25|0]<<8|u[n+26|0]<<16|u[n+27|0]<<24,N=u[n+28|0]|u[n+29|0]<<8|u[n+30|0]<<16|u[n+31|0]<<24,n=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,Y=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24,s=u[t+8|0]|u[t+9|0]<<8|u[t+10|0]<<16|u[t+11|0]<<24,t=u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24;_=w,v=TA((i=n)^(n=w+v|0),16),_=U=TA(_^(w=v+U|0),12),U=TA((i=v)^(v=n+U|0),8),w=TA(_^(l=U+w|0),7),_=o,D=TA((n=o+D|0)^Y,16),_=Y=TA(_^(o=D+H|0),12),Y=TA((i=D)^(D=n+Y|0),8),n=TA(_^(H=Y+o|0),7),_=a,o=TA((f=f+a|0)^s,16),_=s=TA(_^(a=o+c|0),12),i=TA(o^(s=f+s|0),8),f=TA(_^(o=i+a|0),7),E=TA((a=t)^(t=E+y|0),16),y=TA((a=E+N|0)^y,12),t=TA(E^(F=t+y|0),8),E=TA(y^(a=t+a|0),7),_=o,o=TA((o=t)^(t=n+v|0),16),n=TA((y=_+o|0)^n,12),t=TA(o^(v=t+n|0),8),o=TA(n^(c=y+t|0),7),_=a,a=TA((n=f+D|0)^U,16),f=TA((y=_+a|0)^f,12),n=TA(a^(D=n+f|0),8),a=TA(f^(N=y+n|0),7),y=TA((f=E+s|0)^Y,16),E=TA((s=y+l|0)^E,12),Y=TA(y^(f=f+E|0),8),y=TA(E^(U=s+Y|0),7),s=TA((E=w+F|0)^i,16),w=TA((H=s+H|0)^w,12),s=TA(s^(E=E+w|0),8),w=TA(w^(H=H+s|0),7),(0|(b=b+1|0))!=10;);y0(e,v),y0(e+4|0,D),y0(e+8|0,f),y0(e+12|0,E),y0(e+16|0,n),y0(e+20|0,Y),y0(e+24|0,s),y0(e+28|0,t)}function RB(e){var t,n=0,o=0;BA=t=BA-48|0,n=u[28+(e|=0)|0]|u[e+29|0]<<8|u[e+30|0]<<16|u[e+31|0]<<24,r[t+24>>2]=u[e+24|0]|u[e+25|0]<<8|u[e+26|0]<<16|u[e+27|0]<<24,r[t+28>>2]=n,n=u[e+20|0]|u[e+21|0]<<8|u[e+22|0]<<16|u[e+23|0]<<24,r[t+16>>2]=u[e+16|0]|u[e+17|0]<<8|u[e+18|0]<<16|u[e+19|0]<<24,r[t+20>>2]=n,n=u[e+4|0]|u[e+5|0]<<8|u[e+6|0]<<16|u[e+7|0]<<24,r[t>>2]=u[0|e]|u[e+1|0]<<8|u[e+2|0]<<16|u[e+3|0]<<24,r[t+4>>2]=n,n=u[e+12|0]|u[e+13|0]<<8|u[e+14|0]<<16|u[e+15|0]<<24,r[t+8>>2]=u[e+8|0]|u[e+9|0]<<8|u[e+10|0]<<16|u[e+11|0]<<24,r[t+12>>2]=n,n=u[e+40|0]|u[e+41|0]<<8|u[e+42|0]<<16|u[e+43|0]<<24,r[t+32>>2]=u[e+36|0]|u[e+37|0]<<8|u[e+38|0]<<16|u[e+39|0]<<24,r[t+36>>2]=n,Ct[r[8957]](t,t,40,0,e+32|0,0,e),n=r[t+28>>2],o=r[t+24>>2],p[e+24|0]=o,p[e+25|0]=o>>>8,p[e+26|0]=o>>>16,p[e+27|0]=o>>>24,p[e+28|0]=n,p[e+29|0]=n>>>8,p[e+30|0]=n>>>16,p[e+31|0]=n>>>24,n=r[t+20>>2],o=r[t+16>>2],p[e+16|0]=o,p[e+17|0]=o>>>8,p[e+18|0]=o>>>16,p[e+19|0]=o>>>24,p[e+20|0]=n,p[e+21|0]=n>>>8,p[e+22|0]=n>>>16,p[e+23|0]=n>>>24,n=r[t+12>>2],o=r[t+8>>2],p[e+8|0]=o,p[e+9|0]=o>>>8,p[e+10|0]=o>>>16,p[e+11|0]=o>>>24,p[e+12|0]=n,p[e+13|0]=n>>>8,p[e+14|0]=n>>>16,p[e+15|0]=n>>>24,n=r[t+4>>2],o=r[t>>2],p[0|e]=o,p[e+1|0]=o>>>8,p[e+2|0]=o>>>16,p[e+3|0]=o>>>24,p[e+4|0]=n,p[e+5|0]=n>>>8,p[e+6|0]=n>>>16,p[e+7|0]=n>>>24,n=r[t+36>>2],o=r[t+32>>2],p[e+36|0]=o,p[e+37|0]=o>>>8,p[e+38|0]=o>>>16,p[e+39|0]=o>>>24,p[e+40|0]=n,p[e+41|0]=n>>>8,p[e+42|0]=n>>>16,p[e+43|0]=n>>>24,ta(e),BA=t+48|0}function LB(e,t,n){var o=0,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0;for(a=2036477234,f=857760878,E=1634760805,s=1797285236,c=20,w=u[0|n]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24,i=u[n+4|0]|u[n+5|0]<<8|u[n+6|0]<<16|u[n+7|0]<<24,N=u[n+8|0]|u[n+9|0]<<8|u[n+10|0]<<16|u[n+11|0]<<24,U=u[n+12|0]|u[n+13|0]<<8|u[n+14|0]<<16|u[n+15|0]<<24,D=u[n+16|0]|u[n+17|0]<<8|u[n+18|0]<<16|u[n+19|0]<<24,y=u[n+20|0]|u[n+21|0]<<8|u[n+22|0]<<16|u[n+23|0]<<24,v=u[n+24|0]|u[n+25|0]<<8|u[n+26|0]<<16|u[n+27|0]<<24,Y=u[n+28|0]|u[n+29|0]<<8|u[n+30|0]<<16|u[n+31|0]<<24,n=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,_=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24,o=u[t+8|0]|u[t+9|0]<<8|u[t+10|0]<<16|u[t+11|0]<<24,t=u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24;l=o,o=TA(E+y|0,7)^U,H=l^TA(o+E|0,9),F=TA(o+H|0,13)^y,U=TA(H+F|0,18),t=TA(f+w|0,7)^t,v=TA(t+f|0,9)^v,w=TA(t+v|0,13)^w,V=TA(v+w|0,18),Y=TA(n+a|0,7)^Y,y=TA(Y+a|0,9)^i,b=TA(y+Y|0,13)^n,W=TA(y+b|0,18),n=TA(s+D|0,7)^N,_=TA(n+s|0,9)^_,D=TA(n+_|0,13)^D,l=TA(_+D|0,18),w=TA((E^=U)+n|0,7)^w,i=TA(w+E|0,9)^y,N=TA(w+i|0,13)^n,E=TA(i+N|0,18)^E,n=TA((f^=V)+o|0,7)^b,_=TA(n+f|0,9)^_,U=TA(n+_|0,13)^o,f=TA(_+U|0,18)^f,D=TA((a^=W)+t|0,7)^D,o=TA(D+a|0,9)^H,t=TA(o+D|0,13)^t,a=TA(t+o|0,18)^a,y=TA((s^=l)+Y|0,7)^F,v=TA(y+s|0,9)^v,Y=TA(y+v|0,13)^Y,s=TA(v+Y|0,18)^s,H=c>>>0>2,c=c-2|0,H;);return y0(e,E),y0(e+4|0,f),y0(e+8|0,a),y0(e+12|0,s),y0(e+16|0,n),y0(e+20|0,_),y0(e+24|0,o),y0(e+28|0,t),0}function fa(e,t,n,o,a,f,E){var s,y,_,w,D,v,Y,U=0;return BA=s=BA-560|0,aa(s+352|0,E),he(s+288|0,f,32,0),wt(s+352|0,s+320|0,32,0),wt(s+352|0,n,o,a),ag(s+352|0,s+224|0),y=u[(U=f)+32|0]|u[U+33|0]<<8|u[U+34|0]<<16|u[U+35|0]<<24,_=u[U+36|0]|u[U+37|0]<<8|u[U+38|0]<<16|u[U+39|0]<<24,w=u[U+40|0]|u[U+41|0]<<8|u[U+42|0]<<16|u[U+43|0]<<24,D=u[U+44|0]|u[U+45|0]<<8|u[U+46|0]<<16|u[U+47|0]<<24,v=u[U+48|0]|u[U+49|0]<<8|u[U+50|0]<<16|u[U+51|0]<<24,f=u[U+52|0]|u[U+53|0]<<8|u[U+54|0]<<16|u[U+55|0]<<24,Y=u[U+60|0]|u[U+61|0]<<8|u[U+62|0]<<16|u[U+63|0]<<24,U=u[U+56|0]|u[U+57|0]<<8|u[U+58|0]<<16|u[U+59|0]<<24,p[e+56|0]=U,p[e+57|0]=U>>>8,p[e+58|0]=U>>>16,p[e+59|0]=U>>>24,p[e+60|0]=Y,p[e+61|0]=Y>>>8,p[e+62|0]=Y>>>16,p[e+63|0]=Y>>>24,p[e+48|0]=v,p[e+49|0]=v>>>8,p[e+50|0]=v>>>16,p[e+51|0]=v>>>24,p[e+52|0]=f,p[e+53|0]=f>>>8,p[e+54|0]=f>>>16,p[e+55|0]=f>>>24,p[e+40|0]=w,p[e+41|0]=w>>>8,p[e+42|0]=w>>>16,p[e+43|0]=w>>>24,p[e+44|0]=D,p[e+45|0]=D>>>8,p[e+46|0]=D>>>16,p[e+47|0]=D>>>24,p[0|(f=e+32|0)]=y,p[f+1|0]=y>>>8,p[f+2|0]=y>>>16,p[f+3|0]=y>>>24,p[f+4|0]=_,p[f+5|0]=_>>>8,p[f+6|0]=_>>>16,p[f+7|0]=_>>>24,YB(s+224|0),PB(s,s+224|0),OB(e,s),aa(s+352|0,E),wt(s+352|0,e,64,0),wt(s+352|0,n,o,a),ag(s+352|0,s+160|0),YB(s+160|0),p[s+288|0]=248&u[s+288|0],p[s+319|0]=63&u[s+319|0]|64,function(H,i,c,N){var l,F,b,V,W,O,z,tA,AA,gA,aA,iA,hA,yA,fA,_A,wA,mA,bA,RA,j,rA,YA,SA,NA,VA,XA,g0,$,cA,zA,ZA,t0,r0,o0,E0,B0,n0,X,eA,CA,h0,I0,w0,d0,S0,Y0,T0,k=0,DA=0,HA=0,jA=0,A0=0,a0=0,C0=0,f0=0,G0=0,H0=0,R0=0,M0=0,x0=0,P0=0,X0=0,gt=0,rt=0,et=0,Bt=0,nt=0,it=0,Qt=0,ft=0,Et=0,lt=0,Dt=0,Rt=0,dt=0,Lt=0,xt=0,bt=0,tg=0,gg=0,Jt=0,vg=0,og=0,Cg=0,Qg=0,Eg=0,sg=0,cg=0,hg=0,kg=0,Gg=0,Tg=0,Vg=0,pe=0,Fr=0,le=0,we=0,mr=0;Eg=U0(i),rt=u[i+2|0]|u[i+3|0]<<8|u[i+4|0]<<16|u[i+5|0]<<24,pe=U0(i+5|0),Lt=h,et=u[i+7|0]|u[i+8|0]<<8|u[i+9|0]<<16|u[i+10|0]<<24,Bt=u[i+10|0]|u[i+11|0]<<8|u[i+12|0]<<16|u[i+13|0]<<24,bt=U0(i+13|0),R0=h,x0=u[i+15|0]|u[i+16|0]<<8|u[i+17|0]<<16|u[i+18|0]<<24,kg=U0(i+18|0),P0=h,xt=U0(i+21|0),C0=u[i+23|0]|u[i+24|0]<<8|u[i+25|0]<<16|u[i+26|0]<<24,G0=U0(i+26|0),jA=h,HA=u[i+28|0]|u[i+29|0]<<8|u[i+30|0]<<16|u[i+31|0]<<24,vg=U0(c),Qt=u[(i=c)+2|0]|u[i+3|0]<<8|u[i+4|0]<<16|u[i+5|0]<<24,Tg=U0(i+5|0),H0=h,X0=u[i+7|0]|u[i+8|0]<<8|u[i+9|0]<<16|u[i+10|0]<<24,gt=u[i+10|0]|u[i+11|0]<<8|u[i+12|0]<<16|u[i+13|0]<<24,Vg=U0(i+13|0),M0=h,A0=u[i+15|0]|u[i+16|0]<<8|u[i+17|0]<<16|u[i+18|0]<<24,Gg=U0(i+18|0),DA=h,sg=U0(i+21|0),k=u[i+23|0]|u[i+24|0]<<8|u[i+25|0]<<16|u[i+26|0]<<24,f0=U0(i+26|0),c=h,i=u[i+28|0]|u[i+29|0]<<8|u[i+30|0]<<16|u[i+31|0]<<24,w0=U0(N),d0=u[N+2|0]|u[N+3|0]<<8|u[N+4|0]<<16|u[N+5|0]<<24,S0=U0(N+5|0),Y0=h,og=u[N+7|0]|u[N+8|0]<<8|u[N+9|0]<<16|u[N+10|0]<<24,cg=u[N+10|0]|u[N+11|0]<<8|u[N+12|0]<<16|u[N+13|0]<<24,hg=U0(N+13|0),Jt=h,tg=u[N+15|0]|u[N+16|0]<<8|u[N+17|0]<<16|u[N+18|0]<<24,Fr=U0(N+18|0),Rt=h,Et=U0(N+21|0),i=K(l=i>>>7|0,0,F=2097151&((3&jA)<<30|G0>>>2),0),a0=h,jA=i,i=K(b=2097151&((3&c)<<30|f0>>>2),0,V=HA>>>7|0,0),c=h+a0|0,a0=HA=jA+i|0,HA=i>>>0>HA>>>0?c+1|0:c,i=K(F,0,b,0),jA=h,k=(c=K(W=k>>>5&2097151,0,V,0))+i|0,i=h+jA|0,c=i=c>>>0>k>>>0?i+1|0:i,i=K(l,0,O=C0>>>5&2097151,0),c=h+c|0,C0=k=i+k|0,ft=c=i>>>0>k>>>0?c+1|0:c,nt=(i=k)- -1048576|0,it=c=c-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+HA|0,G0=i=(c=(2097151&c)<<11|nt>>>21)>>>0>(HA=jA=c+a0|0)>>>0?i+1|0:i,lt=(i=HA)- -1048576|0,f0=a0=G0-((i>>>0<4293918720)-1|0)|0,jA=K(l,0,V,0),c=dt=(Qg=h)-(((i=jA)>>>0<4293918720)-1|0)|0,k=a0>>21,dt=(2097151&a0)<<11|lt>>>21,jA=i-(a0=-2097152&(Cg=i- -1048576|0))|0,i=(Qg-((i>>>0>>0)+c|0)|0)+k|0,ZA=i=jA>>>0>(VA=dt+jA|0)>>>0?i+1|0:i,a0=K(VA,i,-683901,-1),jA=h,t0=i=c>>21,i=K(g0=(2097151&c)<<11|Cg>>>21,i,136657,0),k=h+jA|0,dt=c=i+a0|0,a0=i>>>0>c>>>0?k+1|0:k,i=K(z=2097151&((1&M0)<<31|Vg>>>1),0,F,0),c=h,k=i,i=K(tA=gt>>>4&2097151,0,V,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,i=K(AA=A0>>>6&2097151,0,O,0),c=h+c|0,c=i>>>0>(k=i+k|0)>>>0?c+1|0:c,NA=i=0,jA=k,k=K(gA=2097151&sg,i,aA=2097151&((7&P0)<<29|kg>>>3),0),i=h+c|0,i=k>>>0>(jA=jA+k|0)>>>0?i+1|0:i,k=K(iA=2097151&((7&DA)<<29|Gg>>>3),0,hA=2097151&xt,0),c=h+i|0,c=k>>>0>(jA=k+jA|0)>>>0?c+1|0:c,i=K(W,0,yA=x0>>>6&2097151,0),k=h+c|0,k=i>>>0>(jA=i+jA|0)>>>0?k+1|0:k,c=K(b,0,fA=2097151&((1&R0)<<31|bt>>>1),0),i=h+k|0,c=c>>>0>(k=jA=c+jA|0)>>>0?i+1|0:i,i=K(l,0,_A=Bt>>>4&2097151,0),c=h+c|0,P0=k=i+k|0,jA=i>>>0>k>>>0?c+1|0:c,i=K(F,0,tA,0),c=h,DA=(k=i)+(i=K(wA=X0>>>7&2097151,0,V,0))|0,k=h+c|0,k=i>>>0>DA>>>0?k+1|0:k,c=K(O,0,z,0),i=h+k|0,i=c>>>0>(DA=c+DA|0)>>>0?i+1|0:i,k=K(AA,0,hA,0),c=h+i|0,c=k>>>0>(DA=k+DA|0)>>>0?c+1|0:c,i=K(gA,NA,yA,0),c=h+c|0,c=i>>>0>(k=i+DA|0)>>>0?c+1|0:c,DA=(i=k)+(k=K(aA,0,iA,0))|0,i=h+c|0,i=k>>>0>DA>>>0?i+1|0:i,c=K(W,0,fA,0),k=h+i|0,k=c>>>0>(DA=c+DA|0)>>>0?k+1|0:k,c=K(b,0,_A,0),i=h+k|0,c=c>>>0>(k=DA=c+DA|0)>>>0?i+1|0:i,i=K(l,0,mA=et>>>7&2097151,0),c=h+c|0,gt=k=i+k|0,A0=c=i>>>0>k>>>0?c+1|0:c,M0=(i=k)- -1048576|0,DA=c=c-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+jA|0,c=i=(c=(2097151&c)<<11|M0>>>21)>>>0>(X0=c+P0|0)>>>0?i+1|0:i,i=i+a0|0,i=(k=jA=X0)>>>0>(X0=k+dt|0)>>>0?i+1|0:i,a0=(a0=c)-(((c=jA)>>>0<4293918720)-1|0)|0,R0=c- -1048576|0,x0=(c=k=X0)-(k=-2097152&R0)|0,P0=i-((jA=a0)+(c>>>0>>0)|0)|0,$=HA-(i=-2097152<)|0,r0=c=G0-((i>>>0>HA>>>0)+f0|0)|0,i=K(g0,t0,-997805,-1),k=h+A0|0,k=i>>>0>(HA=i+gt|0)>>>0?k+1|0:k,A0=(i=HA)+(HA=K(VA,ZA,136657,0))|0,i=h+k|0,c=K($,c,-683901,-1),i=h+(HA>>>0>A0>>>0?i+1|0:i)|0,i=c>>>0>(k=c+A0|0)>>>0?i+1|0:i,a0=k-(c=-2097152&M0)|0,A0=i-((c>>>0>k>>>0)+DA|0)|0,i=K(F,0,wA,0),k=h,HA=(c=K(bA=2097151&((3&H0)<<30|Tg>>>2),0,V,0))+i|0,i=h+k|0,i=c>>>0>HA>>>0?i+1|0:i,k=K(O,0,tA,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,i=K(z,0,hA,0),k=h+c|0,k=i>>>0>(HA=i+HA|0)>>>0?k+1|0:k,c=K(AA,0,aA,0),i=h+k|0,i=c>>>0>(HA=c+HA|0)>>>0?i+1|0:i,k=K(gA,NA,fA,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,k=K(iA,0,yA,0),i=h+c|0,i=k>>>0>(HA=k+HA|0)>>>0?i+1|0:i,k=K(W,0,_A,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,i=K(b,0,mA,0),k=h+c|0,k=i>>>0>(HA=i+HA|0)>>>0?k+1|0:k,c=K(l,0,RA=2097151&((3&Lt)<<30|pe>>>2),0),i=h+k|0,HA=c>>>0>(DA=HA=c+HA|0)>>>0?i+1|0:i,i=K(F,0,bA,0),c=h,k=i,i=K(j=Qt>>>5&2097151,0,V,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,f0=(i=K(O,0,wA,0))+k|0,k=h+c|0,k=i>>>0>f0>>>0?k+1|0:k,c=K(tA,0,hA,0),i=h+k|0,i=c>>>0>(f0=c+f0|0)>>>0?i+1|0:i,c=K(z,0,aA,0),i=h+i|0,i=c>>>0>(k=c+f0|0)>>>0?i+1|0:i,f0=(c=k)+(k=K(AA,0,yA,0))|0,c=h+i|0,c=k>>>0>f0>>>0?c+1|0:c,i=K(gA,NA,_A,0),c=h+c|0,c=i>>>0>(k=i+f0|0)>>>0?c+1|0:c,f0=(i=K(iA,0,fA,0))+k|0,k=h+c|0,k=i>>>0>f0>>>0?k+1|0:k,c=K(W,0,mA,0),i=h+k|0,i=c>>>0>(f0=c+f0|0)>>>0?i+1|0:i,c=K(b,0,RA,0),i=h+i|0,c=i=c>>>0>(k=c+f0|0)>>>0?i+1|0:i,i=K(l,0,rA=rt>>>5&2097151,0),c=h+c|0,X0=k=i+k|0,Tg=c=i>>>0>k>>>0?c+1|0:c,T0=(i=k)- -1048576|0,Vg=k=c-((i>>>0<4293918720)-1|0)|0,i=(i=k>>21)+HA|0,gt=k=(c=(2097151&k)<<11|T0>>>21)+DA|0,Gg=i=c>>>0>k>>>0?i+1|0:i,pe=(i=k)- -1048576|0,sg=k=Gg-((i>>>0<4293918720)-1|0)|0,c=(i=k>>21)+A0|0,M0=HA=(k=(2097151&k)<<11|pe>>>21)+a0|0,Qg=c=k>>>0>HA>>>0?c+1|0:c,bt=(i=HA)- -1048576|0,dt=k=c-((i>>>0<4293918720)-1|0)|0,i=(i=k>>21)+P0|0,A0=k=(c=(2097151&k)<<11|bt>>>21)+x0|0,rt=k=(lt=i=c>>>0>k>>>0?i+1|0:i)-(((i=k)>>>0<4293918720)-1|0)|0,G0=(2097151&k)<<11|(xt=i- -1048576|0)>>>21,DA=k>>21,i=K(F,0,AA,0),c=h,k=i,i=K(V,0,z,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,i=K(gA,NA,hA,0),c=h+c|0,c=i>>>0>(k=i+k|0)>>>0?c+1|0:c,HA=(i=k)+(k=K(O,0,iA,0))|0,i=h+c|0,i=k>>>0>HA>>>0?i+1|0:i,c=K(W,0,aA,0),k=h+i|0,k=c>>>0>(HA=c+HA|0)>>>0?k+1|0:k,c=K(b,0,yA,0),i=h+k|0,i=c>>>0>(HA=c+HA|0)>>>0?i+1|0:i,k=K(l,0,fA,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,k=K(g0,t0,-683901,-1),c=(i=c)+h|0,c=k>>>0>(a0=HA+k|0)>>>0?c+1|0:c,k=a0,a0=(a0=i)-(((i=HA)>>>0<4293918720)-1|0)|0,Qt=i- -1048576|0,f0=(i=k)-(k=-2097152&Qt)|0,k=c-((HA=a0)+(i>>>0>>0)|0)|0,i=(i=jA>>21)+k|0,i=(c=(2097151&jA)<<11|R0>>>21)>>>0>(jA=c+f0|0)>>>0?i+1|0:i,a0=(c=jA)-(k=-2097152&(H0=c- -1048576|0))|0,k=(i-((c>>>0>>0)+(jA=f0=i-((c>>>0<4293918720)-1|0)|0)|0)|0)+DA|0,o0=G0=a0+G0|0,E0=k=a0>>>0>G0>>>0?k+1|0:k,f0=K(G0,k,-683901,-1),a0=h,c=K(O,0,gA,NA),i=h,k=c,c=K(V,0,AA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,DA=(c=k)+(k=K(F,0,iA,0))|0,c=h+i|0,c=k>>>0>DA>>>0?c+1|0:c,k=K(W,0,hA,0),i=h+c|0,i=k>>>0>(DA=k+DA|0)>>>0?i+1|0:i,k=K(b,0,aA,0),c=h+i|0,c=k>>>0>(DA=k+DA|0)>>>0?c+1|0:c,i=K(l,0,yA,0),k=h+c|0,k=i>>>0>(DA=i+DA|0)>>>0?k+1|0:k,i=(i=HA>>21)+k|0,et=DA=(i=(c=(2097151&HA)<<11|Qt>>>21)>>>0>(HA=c+DA|0)>>>0?i+1|0:i)-(((c=HA)>>>0<4293918720)-1|0)|0,HA=c-(k=-2097152&(gg=c- -1048576|0))|0,k=(i-((c>>>0>>0)+DA|0)|0)+(jA>>21)|0,B0=HA=(i=(2097151&jA)<<11|H0>>>21)+HA|0,n0=k=i>>>0>HA>>>0?k+1|0:k,c=K(HA,k,136657,0),i=h+a0|0,kg=k=c+f0|0,Bt=c>>>0>k>>>0?i+1|0:i,c=K(hA,0,j,0),i=h,k=c,c=K(YA=2097151&vg,0,O,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,HA=(c=k)+(k=K(aA,0,bA,0))|0,c=h+i|0,c=k>>>0>HA>>>0?c+1|0:c,i=K(yA,0,wA,0),k=h+c|0,k=i>>>0>(HA=i+HA|0)>>>0?k+1|0:k,c=K(tA,0,fA,0),i=h+k|0,i=c>>>0>(HA=c+HA|0)>>>0?i+1|0:i,k=K(z,0,_A,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,k=K(AA,0,mA,0),i=h+c|0,i=k>>>0>(HA=k+HA|0)>>>0?i+1|0:i,k=K(gA,NA,rA,0),c=h+i|0,c=k>>>0>(HA=k+HA|0)>>>0?c+1|0:c,i=K(iA,0,RA,0),k=h+c|0,k=i>>>0>(HA=i+HA|0)>>>0?k+1|0:k,c=K(W,0,SA=2097151&Eg,0),i=h+k|0,i=c>>>0>(HA=c+HA|0)>>>0?i+1|0:i,jA=HA=(k=(u[N+23|0]|u[N+24|0]<<8|u[N+25|0]<<16|u[N+26|0]<<24)>>>5&2097151)+HA|0,HA=k>>>0>HA>>>0?i+1|0:i,i=K(aA,0,j,0),c=h,k=i,i=K(hA,0,YA,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,DA=(i=K(yA,0,bA,0))+k|0,k=h+c|0,k=i>>>0>DA>>>0?k+1|0:k,c=K(fA,0,wA,0),i=h+k|0,i=c>>>0>(DA=c+DA|0)>>>0?i+1|0:i,c=K(tA,0,_A,0),i=h+i|0,i=c>>>0>(k=c+DA|0)>>>0?i+1|0:i,DA=(c=k)+(k=K(z,0,mA,0))|0,c=h+i|0,c=k>>>0>DA>>>0?c+1|0:c,i=K(AA,0,RA,0),c=h+c|0,c=i>>>0>(k=i+DA|0)>>>0?c+1|0:c,DA=(i=K(gA,NA,SA,0))+k|0,k=h+c|0,k=i>>>0>DA>>>0?k+1|0:k,c=K(iA,0,rA,0),i=h+k|0,i=c>>>0>(DA=c+DA|0)>>>0?i+1|0:i,DA=k=(c=2097151&Et)+DA|0,x0=k=(R0=i=c>>>0>k>>>0?i+1|0:i)-(((i=k)>>>0<4293918720)-1|0)|0,i=(2097151&k)<<11|(Lt=i- -1048576|0)>>>21,k=(k>>>21|0)+HA|0,H0=k=i>>>0>(jA=i+jA|0)>>>0?k+1|0:k,vg=C0-(i=-2097152&nt)|0,Et=ft-((i>>>0>C0>>>0)+it|0)|0,c=K(F,0,W,0),i=h,k=c,c=K(V,0,gA,NA),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,HA=(c=k)+(k=K(b,0,O,0))|0,c=h+i|0,c=k>>>0>HA>>>0?c+1|0:c,i=K(l,0,hA,0),k=h+c|0,k=i>>>0>(HA=i+HA|0)>>>0?k+1|0:k,a0=HA,i=K(V,0,iA,0),c=h,HA=i,i=K(F,0,gA,NA),c=h+c|0,c=i>>>0>(HA=HA+i|0)>>>0?c+1|0:c,C0=(i=HA)+(HA=K(O,0,W,0))|0,i=h+c|0,i=HA>>>0>C0>>>0?i+1|0:i,c=K(b,0,hA,0),i=h+i|0,i=c>>>0>(HA=c+C0|0)>>>0?i+1|0:i,C0=(c=HA)+(HA=K(l,0,aA,0))|0,c=h+i|0,G0=c=HA>>>0>C0>>>0?c+1|0:c,ft=(i=HA=C0)- -1048576|0,f0=C0=c-((i>>>0<4293918720)-1|0)|0,c=(i=C0>>21)+k|0,a0=c=(k=a0=(C0=(2097151&C0)<<11|ft>>>21)+a0|0)>>>0>>0?c+1|0:c,it=(i=k)- -1048576|0,c=(i=(C0=nt=c-((i>>>0<4293918720)-1|0)|0)>>21)+Et|0,X=c=(nt=(2097151&C0)<<11|it>>>21)>>>0>(XA=vg=nt+vg|0)>>>0?c+1|0:c,Et=K(XA,c,470296,0),nt=h,cA=k-(c=-2097152&it)|0,Cg=i=a0-((c>>>0>k>>>0)+C0|0)|0,c=K($,r0,666643,0),k=h+nt|0,k=c>>>0>(C0=c+Et|0)>>>0?k+1|0:k,c=K(cA,i,654183,0),i=h+k|0,c=c>>>0>(a0=C0=c+C0|0)>>>0?i+1|0:i,i=HA-(k=-2097152&ft)|0,k=(et>>21)+(C0=G0-((k>>>0>HA>>>0)+f0|0)|0)|0,eA=f0=(HA=(2097151&et)<<11|gg>>>21)+i|0,Eg=k=HA>>>0>f0>>>0?k+1|0:k,le=jA- -1048576|0,HA=C0=H0-((jA>>>0<4293918720)-1|0)|0,i=K(f0,k,-997805,-1),c=h+c|0,i=(c=i>>>0>(k=i+a0|0)>>>0?c+1|0:c)+H0|0,i=k>>>0>(jA=k+jA|0)>>>0?i+1|0:i,Et=(k=jA)-(c=-2097152&le)|0,nt=i-((c>>>0>k>>>0)+HA|0)|0,i=K(cA,Cg,470296,0),c=h,jA=(k=i)+(i=K(XA,X,666643,0))|0,k=h+c|0,k=i>>>0>jA>>>0?k+1|0:k,c=K(f0,Eg,654183,0),i=h+k|0,c=R0+(c>>>0>(jA=c+jA|0)>>>0?i+1|0:i)|0,H0=(k=DA+jA|0)-(i=-2097152&Lt)|0,C0=(c=k>>>0>>0?c+1|0:c)-((i>>>0>k>>>0)+x0|0)|0,c=K(yA,0,j,0),i=h,k=c,c=K(aA,0,YA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,c=K(fA,0,bA,0),i=h+i|0,i=c>>>0>(k=c+k|0)>>>0?i+1|0:i,jA=(c=k)+(k=K(_A,0,wA,0))|0,c=h+i|0,c=k>>>0>jA>>>0?c+1|0:c,i=K(tA,0,mA,0),k=h+c|0,k=i>>>0>(jA=i+jA|0)>>>0?k+1|0:k,i=K(z,0,RA,0),c=h+k|0,c=i>>>0>(jA=i+jA|0)>>>0?c+1|0:c,k=K(AA,0,rA,0),i=h+c|0,i=k>>>0>(jA=k+jA|0)>>>0?i+1|0:i,c=K(iA,0,SA,0),i=h+i|0,i=c>>>0>(k=c+jA|0)>>>0?i+1|0:i,c=k,jA=(k=2097151&((7&Rt)<<29|Fr>>>3))>>>0>(DA=jA=c+k|0)>>>0?i+1|0:i,i=K(fA,0,j,0),c=h,a0=(k=i)+(i=K(yA,0,YA,0))|0,k=h+c|0,k=i>>>0>a0>>>0?k+1|0:k,c=K(_A,0,bA,0),i=h+k|0,i=c>>>0>(a0=c+a0|0)>>>0?i+1|0:i,k=K(mA,0,wA,0),c=h+i|0,c=k>>>0>(a0=k+a0|0)>>>0?c+1|0:c,k=K(tA,0,RA,0),i=h+c|0,i=k>>>0>(a0=k+a0|0)>>>0?i+1|0:i,k=K(z,0,rA,0),c=h+i|0,c=k>>>0>(a0=k+a0|0)>>>0?c+1|0:c,i=K(AA,0,SA,0),k=h+c|0,i=i>>>0>(c=a0=i+a0|0)>>>0?k+1|0:k,ft=k=a0+(c=tg>>>6&2097151)|0,P0=k=(G0=i=c>>>0>k>>>0?i+1|0:i)-(((i=k)>>>0<4293918720)-1|0)|0,i=(2097151&k)<<11|(it=i- -1048576|0)>>>21,k=(k>>>21|0)+jA|0,f0=k=i>>>0>(DA=i+DA|0)>>>0?k+1|0:k,et=(i=DA)- -1048576|0,a0=k=k-((i>>>0<4293918720)-1|0)|0,i=(c=k>>>21|0)+C0|0,R0=jA=(k=(2097151&k)<<11|et>>>21)+H0|0,Qt=k=(C0=i=k>>>0>jA>>>0?i+1|0:i)-(((i=jA)>>>0<4293918720)-1|0)|0,i=(2097151&k)<<11|(x0=i- -1048576|0)>>>21,k=(k>>21)+nt|0,i=(c=k=i>>>0>(jA=i+Et|0)>>>0?k+1|0:k)+Bt|0,H0=(H0=c)-(((c=jA)>>>0<4293918720)-1|0)|0,we=c- -1048576|0,mr=(c=k=Rt=jA+kg|0)-(k=-2097152&we)|0,Dt=(i=jA>>>0>Rt>>>0?i+1|0:i)-((jA=H0)+(c>>>0>>0)|0)|0,i=K(B0,n0,-997805,-1),c=h+C0|0,gg=k=i+R0|0,H0=i>>>0>k>>>0?c+1|0:c,c=K(eA,Eg,470296,0),i=h,k=c,c=K(cA,Cg,666643,0),i=h+i|0,i=(i=c>>>0>(k=k+c|0)>>>0?i+1|0:i)+f0|0,i=(c=k+DA|0)>>>0>>0?i+1|0:i,et=(k=c)-(c=-2097152&et)|0,Bt=i-((c>>>0>k>>>0)+a0|0)|0,i=K(eA,Eg,666643,0),c=h+G0|0,R0=k=i+ft|0,C0=i>>>0>k>>>0?c+1|0:c,c=K(_A,0,j,0),i=h,k=c,c=K(fA,0,YA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,c=K(mA,0,bA,0),i=h+i|0,i=c>>>0>(k=c+k|0)>>>0?i+1|0:i,DA=(c=k)+(k=K(RA,0,wA,0))|0,c=h+i|0,c=k>>>0>DA>>>0?c+1|0:c,i=K(tA,0,rA,0),k=h+c|0,k=i>>>0>(DA=i+DA|0)>>>0?k+1|0:k,i=K(z,0,SA,0),c=h+k|0,i=c=i>>>0>(DA=i+DA|0)>>>0?c+1|0:c,a0=DA=(k=2097151&((1&Jt)<<31|hg>>>1))+DA|0,DA=k>>>0>DA>>>0?i+1|0:i,c=K(mA,0,j,0),i=h,k=c,c=K(_A,0,YA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,f0=(c=k)+(k=K(RA,0,bA,0))|0,c=h+i|0,c=k>>>0>f0>>>0?c+1|0:c,i=K(rA,0,wA,0),c=h+c|0,c=i>>>0>(k=i+f0|0)>>>0?c+1|0:c,f0=(i=K(tA,0,SA,0))+k|0,k=h+c|0,i=i>>>0>(c=f0)>>>0?k+1|0:k,G0=k=f0+(c=cg>>>4&2097151)|0,cg=k=(Lt=i=c>>>0>k>>>0?i+1|0:i)-(((i=k)>>>0<4293918720)-1|0)|0,i=(2097151&k)<<11|(Fr=i- -1048576|0)>>>21,k=(k>>>21|0)+DA|0,f0=a0=i+a0|0,Jt=k=i>>>0>a0>>>0?k+1|0:k,kg=(i=a0)- -1048576|0,tg=k=k-((i>>>0<4293918720)-1|0)|0,i=(c=k>>>21|0)+C0|0,ft=k=(Rt=(k=(k=(2097151&k)<<11|kg>>>21)>>>0>(c=DA=k+R0|0)>>>0?i+1|0:i)-(((i=-2097152&it)>>>0>c>>>0)+P0|0)|0)-(((i=a0=c-i|0)>>>0<4293918720)-1|0)|0,c=(c=k>>21)+Bt|0,Et=k=(i=(2097151&k)<<11|(vg=i- -1048576|0)>>>21)+et|0,it=c=i>>>0>k>>>0?c+1|0:c,nt=(i=k)- -1048576|0,et=DA=c-((i>>>0<4293918720)-1|0)|0,zA=A0-(i=-2097152&xt)|0,hg=k=lt-((i>>>0>A0>>>0)+rt|0)|0,i=(c=DA>>21)+H0|0,i=(DA=(2097151&DA)<<11|nt>>>21)>>>0>(A0=DA+gg|0)>>>0?i+1|0:i,C0=(DA=K(o0,E0,136657,0))+(A0-(c=-2097152&x0)|0)|0,c=h+(i-((c>>>0>A0>>>0)+Qt|0)|0)|0,c=DA>>>0>C0>>>0?c+1|0:c,k=K(zA,k,-683901,-1),i=h+c|0,C0=DA=k+C0|0,R0=k=(Bt=i=k>>>0>DA>>>0?i+1|0:i)-(((i=DA)>>>0<4293918720)-1|0)|0,c=(c=k>>21)+Dt|0,A0=k=(i=(2097151&k)<<11|(xt=i- -1048576|0)>>>21)+mr|0,x0=c=i>>>0>k>>>0?c+1|0:c,P0=k=c-(((i=k)>>>0<4293918720)-1|0)|0,gg=(2097151&k)<<11|(lt=i- -1048576|0)>>>21,Qt=k>>21,c=K(O,0,j,0),i=h,k=c,c=K(F,0,YA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,DA=(c=K(hA,0,bA,0))+k|0,k=h+i|0,k=c>>>0>DA>>>0?k+1|0:k,i=K(aA,0,wA,0),c=h+k|0,c=i>>>0>(DA=i+DA|0)>>>0?c+1|0:c,k=K(tA,0,yA,0),i=h+c|0,i=k>>>0>(DA=k+DA|0)>>>0?i+1|0:i,k=K(z,0,fA,0),c=h+i|0,c=k>>>0>(DA=k+DA|0)>>>0?c+1|0:c,k=K(AA,0,_A,0),i=h+c|0,i=k>>>0>(DA=k+DA|0)>>>0?i+1|0:i,c=K(gA,NA,RA,0),k=h+i|0,k=c>>>0>(DA=c+DA|0)>>>0?k+1|0:k,i=K(iA,0,mA,0),c=h+k|0,c=i>>>0>(DA=i+DA|0)>>>0?c+1|0:c,k=K(W,0,rA,0),i=h+c|0,i=k>>>0>(DA=k+DA|0)>>>0?i+1|0:i,k=K(b,0,SA,0),c=h+i|0,c=k>>>0>(DA=k+DA|0)>>>0?c+1|0:c,i=U0(N+26|0),k=2097151&((3&(k=h))<<30|i>>>2),i=c,rt=DA=k+DA|0,DA=i=k>>>0>DA>>>0?i+1|0:i,i=K($,r0,470296,0),c=h,Dt=(k=i)+(i=K(VA,ZA,666643,0))|0,k=h+c|0,k=i>>>0>Dt>>>0?k+1|0:k,i=K(XA,X,654183,0),c=h+k|0,c=i>>>0>(Dt=i+Dt|0)>>>0?c+1|0:c,i=K(cA,Cg,-997805,-1),c=h+c|0,c=i>>>0>(k=i+Dt|0)>>>0?c+1|0:c,Dt=(i=k)+(k=K(eA,Eg,136657,0))|0,i=h+c|0,i=(i=k>>>0>Dt>>>0?i+1|0:i)+DA|0,i=(c=Dt)>>>0>(k=c+rt|0)>>>0?i+1|0:i,c=k,k=i,CA=(i=rt)- -1048576|0,DA=H0=DA-((i>>>0<4293918720)-1|0)|0,H0=c,k=(c=HA>>21)+k|0,k=(i=(2097151&HA)<<11|le>>>21)>>>0>(HA=H0+i|0)>>>0?k+1|0:k,c=HA-(i=-2097152&CA)|0,rt=K(B0,n0,-683901,-1),i=(HA=k-((i>>>0>HA>>>0)+DA|0)|0)+h|0,k=i=rt>>>0>(Dt=c+rt|0)>>>0?i+1|0:i,H0=HA-(((i=c)>>>0<4293918720)-1|0)|0,h0=i- -1048576|0,k=(c=jA>>21)+k|0,k=(i=(2097151&jA)<<11|we>>>21)>>>0>(jA=i+(rt=Dt)|0)>>>0?k+1|0:k,rt=c=jA-(i=-2097152&h0)|0,i=(jA=k-((i>>>0>jA>>>0)+(HA=H0)|0)|0)+Qt|0,I0=c- -1048576|0,H0=jA-((c>>>0<4293918720)-1|0)|0,le=(c=k=gg=c+gg|0)-(k=-2097152&I0)|0,we=(rt>>>0>c>>>0?i+1|0:i)-((c>>>0>>0)+(jA=H0)|0)|0,mr=A0-(i=-2097152<)|0,Dt=x0-((i>>>0>A0>>>0)+P0|0)|0,gg=C0-(i=-2097152&xt)|0,xt=Bt-((i>>>0>C0>>>0)+R0|0)|0,c=K(B0,n0,654183,0),i=h+it|0,i=c>>>0>(k=c+Et|0)>>>0?i+1|0:i,C0=((A0=k)-(c=-2097152&nt)|0)+(k=K(o0,E0,-997805,-1))|0,c=h+(i-((c>>>0>A0>>>0)+et|0)|0)|0,c=k>>>0>C0>>>0?c+1|0:c,k=K(zA,hg,136657,0),i=h+c|0,lt=A0=k+C0|0,C0=k>>>0>A0>>>0?i+1|0:i,rt=M0-(i=-2097152&bt)|0,Bt=Qg-((i>>>0>M0>>>0)+dt|0)|0,i=K(VA,ZA,-997805,-1),c=h,k=i,i=K(g0,t0,654183,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,i=K($,r0,136657,0),c=h+c|0,c=i>>>0>(k=i+k|0)>>>0?c+1|0:c,A0=(i=k)+(k=K(XA,X,-683901,-1))|0,i=h+c|0,k=Gg+(k>>>0>A0>>>0?i+1|0:i)|0,R0=(c=A0+gt|0)-(i=-2097152&pe)|0,x0=(k=c>>>0>>0?k+1|0:k)-((i>>>0>c>>>0)+sg|0)|0,i=K(VA,ZA,654183,0),c=h,k=i,i=K(g0,t0,470296,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,A0=(i=k)+(k=K($,r0,-997805,-1))|0,i=h+c|0,c=A0+X0|0,k=Tg+(k>>>0>A0>>>0?i+1|0:i)|0,A0=(i=K(XA,X,136657,0))+c|0,c=h+(c>>>0>>0?k+1|0:k)|0,c=i>>>0>A0>>>0?c+1|0:c,k=K(cA,Cg,-683901,-1),i=h+c|0,i=k>>>0>(A0=k+A0|0)>>>0?i+1|0:i,gt=(k=A0)-(c=-2097152&T0)|0,M0=i-((c>>>0>k>>>0)+Vg|0)|0,c=K(F,0,j,0),i=h,k=c,c=K(V,0,YA,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,A0=(c=k)+(k=K(O,0,bA,0))|0,c=h+i|0,c=k>>>0>A0>>>0?c+1|0:c,k=K(hA,0,wA,0),i=h+c|0,i=k>>>0>(A0=k+A0|0)>>>0?i+1|0:i,c=K(tA,0,aA,0),k=h+i|0,k=c>>>0>(A0=c+A0|0)>>>0?k+1|0:k,i=K(z,0,yA,0),c=h+k|0,c=i>>>0>(A0=i+A0|0)>>>0?c+1|0:c,k=K(AA,0,fA,0),i=h+c|0,i=k>>>0>(A0=k+A0|0)>>>0?i+1|0:i,k=K(gA,NA,mA,0),c=h+i|0,c=k>>>0>(A0=k+A0|0)>>>0?c+1|0:c,k=K(iA,0,_A,0),i=h+c|0,i=k>>>0>(A0=k+A0|0)>>>0?i+1|0:i,c=K(W,0,RA,0),k=h+i|0,k=c>>>0>(A0=c+A0|0)>>>0?k+1|0:k,i=K(l,0,SA,0),c=h+k|0,c=i>>>0>(A0=i+A0|0)>>>0?c+1|0:c,k=K(b,0,rA,0),i=h+c|0,i=k>>>0>(A0=k+A0|0)>>>0?i+1|0:i,c=(N=(u[N+28|0]|u[N+29|0]<<8|u[N+30|0]<<16|u[N+31|0]<<24)>>>7|0)>>>0>(k=N+A0|0)>>>0?i+1|0:i,i=k,k=DA>>21,DA=i+(N=(2097151&DA)<<11|CA>>>21)|0,i=c+k|0,A0=DA,P0=i=N>>>0>DA>>>0?i+1|0:i,it=(i=DA)- -1048576|0,Qt=c=P0-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+M0|0,DA=N=(c=(2097151&c)<<11|it>>>21)+gt|0,H0=i=c>>>0>N>>>0?i+1|0:i,et=(i=N)- -1048576|0,X0=c=H0-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+x0|0,gt=i=(c=(2097151&c)<<11|et>>>21)>>>0>(N=c+R0|0)>>>0?i+1|0:i,x0=(i=N)- -1048576|0,M0=c=gt-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+Bt|0,bt=R0=(c=(2097151&c)<<11|x0>>>21)+rt|0,dt=i=c>>>0>R0>>>0?i+1|0:i,i=K(R0,i,-683901,-1),c=h+C0|0,R0=k=i+lt|0,C0=i>>>0>k>>>0?c+1|0:c,Et=N-(i=-2097152&x0)|0,lt=M0=gt-((i>>>0>N>>>0)+M0|0)|0,c=K(B0,n0,470296,0)+a0|0,i=Rt+h|0,i=c>>>0>>0?i+1|0:i,a0=((k=c)-(N=-2097152&vg)|0)+(c=K(o0,E0,654183,0))|0,k=h+(i-((N>>>0>k>>>0)+ft|0)|0)|0,i=K(zA,hg,-997805,-1),c=h+(c>>>0>a0>>>0?k+1|0:k)|0,c=i>>>0>(N=i+a0|0)>>>0?c+1|0:c,k=(i=N)+(N=K(bt,dt,136657,0))|0,i=h+c|0,i=N>>>0>k>>>0?i+1|0:i,N=K(Et,M0,-683901,-1),c=h+i|0,gt=c=N>>>0>(k=N+k|0)>>>0?c+1|0:c,Bt=(i=k)- -1048576|0,M0=N=c-((i>>>0<4293918720)-1|0)|0,i=(i=N>>21)+C0|0,a0=i=(c=(2097151&N)<<11|Bt>>>21)>>>0>(N=c+R0|0)>>>0?i+1|0:i,x0=(i=N)- -1048576|0,c=(i=(C0=R0=a0-((i>>>0<4293918720)-1|0)|0)>>21)+xt|0,xt=ft=(R0=(2097151&C0)<<11|x0>>>21)+gg|0,R0=R0>>>0>ft>>>0?c+1|0:c,Tg=N-(i=-2097152&x0)|0,Vg=a0-((i>>>0>N>>>0)+C0|0)|0,sg=k-(i=-2097152&Bt)|0,Qg=gt-((i>>>0>k>>>0)+M0|0)|0,i=K(B0,n0,666643,0),k=h+(Jt-(((c=-2097152&kg)>>>0>f0>>>0)+tg|0)|0)|0,k=i>>>0>(N=i+(f0-c|0)|0)>>>0?k+1|0:k,i=K(o0,E0,470296,0),c=h+k|0,c=i>>>0>(N=i+N|0)>>>0?c+1|0:c,k=(i=N)+(N=K(zA,hg,654183,0))|0,i=h+c|0,M0=k,N=N>>>0>k>>>0?i+1|0:i,f0=DA-(i=-2097152&et)|0,C0=H0-((i>>>0>DA>>>0)+X0|0)|0,c=K(VA,ZA,470296,0),i=h,k=c,c=K(g0,t0,666643,0),i=h+i|0,i=c>>>0>(k=k+c|0)>>>0?i+1|0:i,DA=(c=k)+(k=K($,r0,654183,0))|0,c=h+i|0,c=k>>>0>DA>>>0?c+1|0:c,k=K(XA,X,-997805,-1),i=h+c|0,i=k>>>0>(DA=k+DA|0)>>>0?i+1|0:i,c=K(cA,Cg,136657,0),k=h+i|0,k=c>>>0>(DA=c+DA|0)>>>0?k+1|0:k,i=K(eA,Eg,-683901,-1),c=h+k|0,i=P0+(i>>>0>(DA=i+DA|0)>>>0?c+1|0:c)|0,i=(k=DA+A0|0)>>>0>>0?i+1|0:i,c=(DA=k)-(k=-2097152&it)|0,k=i-((k>>>0>DA>>>0)+Qt|0)|0,i=(i=HA>>21)+k|0,a0=HA=(DA=c)+(c=(2097151&HA)<<11|h0>>>21)|0,X0=k=(H0=i=c>>>0>HA>>>0?i+1|0:i)-(((i=HA)>>>0<4293918720)-1|0)|0,c=(2097151&k)<<11|(Rt=i- -1048576|0)>>>21,k=(k>>21)+C0|0,nt=HA=c+f0|0,rt=k=c>>>0>HA>>>0?k+1|0:k,i=K(HA,k,-683901,-1),c=h+N|0,c=i>>>0>(k=i+M0|0)>>>0?c+1|0:c,N=K(bt,dt,-997805,-1),i=h+c|0,i=N>>>0>(k=N+k|0)>>>0?i+1|0:i,N=K(Et,lt,136657,0),c=h+i|0,f0=k=N+k|0,DA=N>>>0>k>>>0?c+1|0:c,c=K(RA,0,j,0),i=h,N=c,c=K(mA,0,YA,0),i=h+i|0,i=c>>>0>(N=N+c|0)>>>0?i+1|0:i,c=K(rA,0,bA,0),k=h+i|0,k=c>>>0>(N=c+N|0)>>>0?k+1|0:k,i=K(SA,0,wA,0),c=h+k|0,i=c=i>>>0>(N=i+N|0)>>>0?c+1|0:c,A0=N=(c=og>>>7&2097151)+N|0,N=c>>>0>N>>>0?i+1|0:i,i=K(rA,0,j,0),c=h,k=i,i=K(RA,0,YA,0),c=h+c|0,c=i>>>0>(k=k+i|0)>>>0?c+1|0:c,i=K(SA,0,bA,0),c=h+c|0,c=i>>>0>(k=i+k|0)>>>0?c+1|0:c,HA=(i=k)+(k=2097151&((3&Y0)<<30|S0>>>2))|0,i=c,C0=HA,x0=k=(HA=i=k>>>0>HA>>>0?i+1|0:i)-(((i=C0)>>>0<4293918720)-1|0)|0,c=(c=k>>>21|0)+N|0,A0=k=(i=(2097151&k)<<11|(tg=i- -1048576|0)>>>21)+A0|0,P0=c=i>>>0>k>>>0?c+1|0:c,ft=(i=k)- -1048576|0,gt=N=c-((i>>>0<4293918720)-1|0)|0,i=(c=N>>>21|0)+Lt|0,i=(N=G0+((2097151&N)<<11|ft>>>21)|0)>>>0>>0?i+1|0:i,G0=((k=N)-(c=-2097152&Fr)|0)+(N=K(o0,E0,666643,0))|0,c=h+(i-((c>>>0>k>>>0)+cg|0)|0)|0,c=N>>>0>G0>>>0?c+1|0:c,i=K(zA,hg,470296,0),c=h+c|0,c=i>>>0>(N=i+G0|0)>>>0?c+1|0:c,k=(i=N)+(N=K(nt,rt,136657,0))|0,i=h+c|0,i=N>>>0>k>>>0?i+1|0:i,c=K(bt,dt,654183,0),i=h+i|0,i=c>>>0>(N=c+k|0)>>>0?i+1|0:i,c=K(Et,lt,-997805,-1),k=h+i|0,it=N=c+N|0,M0=k=c>>>0>N>>>0?k+1|0:k,et=(i=N)- -1048576|0,G0=N=k-((i>>>0<4293918720)-1|0)|0,c=(i=N>>21)+DA|0,DA=k=(N=(2097151&N)<<11|et>>>21)+f0|0,N=c=N>>>0>k>>>0?c+1|0:c,f0=k=c-(((i=k)>>>0<4293918720)-1|0)|0,c=(2097151&k)<<11|(Bt=i- -1048576|0)>>>21,k=(k>>21)+Qg|0,Gg=Qt=c+sg|0,Qt=c>>>0>Qt>>>0?k+1|0:k,k=jA>>21,jA=(i=(2097151&jA)<<11|I0>>>21)+(a0-(c=-2097152&Rt)|0)|0,c=k+(H0-((c>>>0>a0>>>0)+X0|0)|0)|0,H0=c=i>>>0>jA>>>0?c+1|0:c,X0=c=c-(((i=jA)>>>0<4293918720)-1|0)|0,Jt=k=c>>21,c=K(og=(2097151&c)<<11|(Rt=i- -1048576|0)>>>21,k,-683901,-1),i=h+N|0,i=c>>>0>(k=c+DA|0)>>>0?i+1|0:i,sg=k-(c=-2097152&Bt)|0,Qg=i-((c>>>0>k>>>0)+f0|0)|0,i=K(og,Jt,136657,0),c=h+M0|0,c=i>>>0>(N=i+it|0)>>>0?c+1|0:c,Lt=N-(i=-2097152&et)|0,cg=c-((i>>>0>N>>>0)+G0|0)|0,N=(i=K(zA,hg,666643,0))+(A0-(c=-2097152&ft)|0)|0,c=h+(P0-((c>>>0>A0>>>0)+gt|0)|0)|0,c=i>>>0>N>>>0?c+1|0:c,k=(i=N)+(N=K(nt,rt,-997805,-1))|0,i=h+c|0,i=N>>>0>k>>>0?i+1|0:i,N=(c=K(bt,dt,470296,0))+k|0,k=h+i|0,k=c>>>0>N>>>0?k+1|0:k,i=K(Et,lt,654183,0),c=h+k|0,P0=N=i+N|0,a0=i>>>0>N>>>0?c+1|0:c,DA=HA,c=K(SA,0,j,0),i=h,N=c,c=K(rA,0,YA,0),i=h+i|0,i=c>>>0>(N=N+c|0)>>>0?i+1|0:i,c=N,c=(N=d0>>>5&2097151)>>>0>(k=c+N|0)>>>0?i+1|0:i,N=2097151&w0,HA=K(SA,0,YA,0)+N|0,i=h,M0=N=(gt=i=N>>>0>HA>>>0?i+1|0:i)-(((i=HA)>>>0<4293918720)-1|0)|0,A0=k,c=c+(k=N>>>21|0)|0,G0=c=(i=(2097151&N)<<11|(ft=i- -1048576|0)>>>21)>>>0>(N=A0+i|0)>>>0?c+1|0:c,it=(i=N)- -1048576|0,f0=c=c-((i>>>0<4293918720)-1|0)|0,i=(k=c>>>21|0)+DA|0,i=(c=(2097151&c)<<11|it>>>21)>>>0>(A0=c+C0|0)>>>0?i+1|0:i,A0=(k=K(nt,rt,654183,0))+((DA=A0)-(c=-2097152&tg)|0)|0,c=h+(i-((16383&x0)+(c>>>0>DA>>>0)|0)|0)|0,i=K(bt,dt,666643,0),k=h+(k>>>0>A0>>>0?c+1|0:c)|0,k=i>>>0>(DA=i+A0|0)>>>0?k+1|0:k,c=K(Et,lt,470296,0),i=h+k|0,et=DA=c+DA|0,C0=i=c>>>0>DA>>>0?i+1|0:i,Bt=(i=DA)- -1048576|0,A0=c=C0-((i>>>0<4293918720)-1|0)|0,i=(k=c>>21)+a0|0,x0=DA=(c=(2097151&c)<<11|Bt>>>21)+P0|0,c=i=c>>>0>DA>>>0?i+1|0:i,P0=(i=DA)- -1048576|0,i=(k=(DA=a0=c-((i>>>0<4293918720)-1|0)|0)>>21)+cg|0,a0=(a0=(2097151&DA)<<11|P0>>>21)>>>0>(Lt=tg=a0+Lt|0)>>>0?i+1|0:i,i=K(og,Jt,-997805,-1),c=h+c|0,c=i>>>0>(k=i+x0|0)>>>0?c+1|0:c,cg=k-(i=-2097152&P0)|0,tg=c-((i>>>0>k>>>0)+DA|0)|0,i=K(og,Jt,654183,0),c=h+C0|0,c=i>>>0>(k=i+et|0)>>>0?c+1|0:c,x0=k-(i=-2097152&Bt)|0,P0=c-((i>>>0>k>>>0)+A0|0)|0,k=(c=K(nt,rt,470296,0))+(N-(i=-2097152&it)|0)|0,i=h+(G0-((16383&f0)+(i>>>0>N>>>0)|0)|0)|0,i=c>>>0>k>>>0?i+1|0:i,N=(c=K(Et,lt,666643,0))+k|0,k=h+i|0,k=c>>>0>N>>>0?k+1|0:k,DA=N,N=(i=K(nt,rt,666643,0))+(HA-(c=-2097152&ft)|0)|0,c=h+(gt-((4095&M0)+(c>>>0>HA>>>0)|0)|0)|0,C0=c=i>>>0>N>>>0?c+1|0:c,M0=(i=N)- -1048576|0,A0=HA=c-((i>>>0<4293918720)-1|0)|0,k=(i=HA>>21)+k|0,G0=HA=(c=(2097151&HA)<<11|M0>>>21)+DA|0,DA=k=c>>>0>HA>>>0?k+1|0:k,f0=(i=HA)- -1048576|0,HA=k=k-((i>>>0<4293918720)-1|0)|0,c=(i=k>>21)+P0|0,k=c=(k=(2097151&k)<<11|f0>>>21)>>>0>(gt=k+x0|0)>>>0?c+1|0:c,c=K(og,Jt,470296,0),i=h+DA|0,i=c>>>0>(G0=c+G0|0)>>>0?i+1|0:i,c=G0-(DA=-2097152&f0)|0,DA=i-((DA>>>0>G0>>>0)+HA|0)|0,f0=c,HA=(i=K(og,Jt,666643,0))+(N-(c=-2097152&M0)|0)|0,c=h+(C0-((c>>>0>N>>>0)+A0|0)|0)|0,i=(i=(c=i>>>0>HA>>>0?c+1|0:c)>>21)+DA|0,A0=N=f0+(c=(2097151&c)<<11|(N=HA)>>>21)|0,k=(c=(i=c>>>0>N>>>0?i+1|0:i)>>21)+k|0,DA=N=(i=(2097151&i)<<11|N>>>21)+gt|0,N=(2097151&(k=i>>>0>(c=N)>>>0?k+1|0:k))<<11|c>>>21,c=(i=k>>21)+tg|0,G0=k=N+cg|0,k=(c=N>>>0>(i=k)>>>0?c+1|0:c)>>21,c=(2097151&c)<<11|i>>>21,i=k+a0|0,it=N=c+Lt|0,c=(c=(i=c>>>0>N>>>0?i+1|0:i)>>21)+Qg|0,et=N=(i=(2097151&i)<<11|N>>>21)+sg|0,i=(i=(c=i>>>0>N>>>0?c+1|0:c)>>21)+Qt|0,Bt=N=(c=(2097151&c)<<11|N>>>21)+Gg|0,k=(c=(i=c>>>0>N>>>0?i+1|0:i)>>21)+Vg|0,x0=N=(i=(2097151&i)<<11|N>>>21)+Tg|0,N=(2097151&(k=i>>>0>(c=N)>>>0?k+1|0:k))<<11|c>>>21,c=(i=k>>21)+R0|0,P0=k=N+xt|0,k=(c=N>>>0>(i=k)>>>0?c+1|0:c)>>21,c=(2097151&c)<<11|i>>>21,i=k+Dt|0,Qt=N=c+mr|0,c=(c=(i=c>>>0>N>>>0?i+1|0:i)>>21)+we|0,gt=N=(i=(2097151&i)<<11|N>>>21)+le|0,i=(c=i>>>0>N>>>0?c+1|0:c)>>21,C0=(k=(2097151&c)<<11|N>>>21)+(c=jA-(N=-2097152&Rt)|0)|0,k=(H0-((N>>>0>jA>>>0)+X0|0)|0)+i|0,M0=C0,X0=(2097151&(k=c>>>0>(i=C0)>>>0?k+1|0:k))<<11|i>>>21,a0=c=k>>21,i=2097151&HA,N=K(X0,c,666643,0)+i|0,c=h,C0=N,N=c=i>>>0>N>>>0?c+1|0:c,p[0|H]=C0,p[H+1|0]=(255&c)<<24|C0>>>8,HA=H,c=2097151&A0,k=K(X0,a0,470296,0)+c|0,i=h,i=c>>>0>k>>>0?i+1|0:i,A0=k,jA=(2097151&(k=N))<<11|C0>>>21,k=i+(c=k>>21)|0,k=jA>>>0>(A0=A0+jA|0)>>>0?k+1|0:k,jA=A0,p[HA+4|0]=(2047&k)<<21|jA>>>11,i=k,k=jA,p[HA+3|0]=(7&i)<<29|k>>>3,k=2097151&DA,DA=K(X0,a0,654183,0)+k|0,c=h,c=k>>>0>DA>>>0?c+1|0:c,k=DA,DA=(2097151&i)<<11|jA>>>21,i=(i>>21)+c|0,c=i=DA>>>0>(A0=k+DA|0)>>>0?i+1|0:i,p[HA+6|0]=(63&i)<<26|A0>>>6,DA=0,i=f0=2097151&jA,p[HA+2|0]=31&((65535&N)<<16|C0>>>16)|i<<5,N=2097151&G0,k=K(X0,a0,-997805,-1)+N|0,i=h,N=i=N>>>0>k>>>0?i+1|0:i,i=c>>21,jA=(c=(2097151&c)<<11|A0>>>21)+k|0,k=i+N|0,C0=jA,k=c>>>0>jA>>>0?k+1|0:k,p[HA+9|0]=(511&k)<<23|jA>>>9,i=k,p[HA+8|0]=(1&i)<<31|jA>>>1,jA=0,N=G0=2097151&A0,p[HA+5|0]=(524287&DA)<<13|f0>>>19|N<<2,N=2097151&it,k=K(X0,a0,136657,0)+N|0,c=h,c=N>>>0>k>>>0?c+1|0:c,N=k,c=c+(k=i>>21)|0,A0=N=N+(i=(2097151&i)<<11|C0>>>21)|0,c=i>>>0>N>>>0?c+1|0:c,p[HA+12|0]=(4095&c)<<20|N>>>12,N=c,i=c,c=A0,p[HA+11|0]=(15&i)<<28|c>>>4,HA=0,c=f0=2097151&C0,p[H+7|0]=(16383&jA)<<18|G0>>>14|c<<7,k=H,c=2097151&et,jA=K(X0,a0,-683901,-1)+c|0,i=h,i=(i=c>>>0>jA>>>0?i+1|0:i)+(c=N>>21)|0,c=i=(N=(2097151&N)<<11|A0>>>21)>>>0>(DA=jA=N+jA|0)>>>0?i+1|0:i,p[k+14|0]=(127&i)<<25|DA>>>7,jA=0,N=C0=2097151&A0,p[k+10|0]=(131071&HA)<<15|f0>>>17|N<<4,N=k,i>>=21,k=(c=(2097151&c)<<11|DA>>>21)>>>0>(A0=c+(2097151&Bt)|0)>>>0?i+1|0:i,p[N+17|0]=(1023&k)<<22|A0>>>10,i=k,p[N+16|0]=(3&i)<<30|A0>>>2,N=a0=2097151&DA,p[H+13|0]=(1048575&jA)<<12|C0>>>20|N<<1,c=i,i>>=21,c=(k=(2097151&c)<<11|A0>>>21)>>>0>(DA=k+(2097151&x0)|0)>>>0?i+1|0:i,p[(N=H)+20|0]=(8191&c)<<19|DA>>>13,i=c,c=DA,p[N+19|0]=(31&i)<<27|c>>>5,c=C0=2097151&A0,p[N+15|0]=(32767&HA)<<17|a0>>>15|c<<6,c=i,i>>=21,c=(N=(2097151&c)<<11|DA>>>21)>>>0>(a0=N+(2097151&P0)|0)>>>0?i+1|0:i,p[H+21|0]=a0,i=DA,p[H+18|0]=(262143&jA)<<14|C0>>>18|i<<3,N=c,i=c,c=a0,p[H+22|0]=(255&i)<<24|c>>>8,c=i>>21,k=(i=(2097151&i)<<11|a0>>>21)>>>0>(DA=i+(2097151&Qt)|0)>>>0?c+1|0:c,p[H+25|0]=(2047&k)<<21|DA>>>11,i=k,k=DA,p[H+24|0]=(7&i)<<29|k>>>3,c=i>>21,c=(HA=(2097151&i)<<11|DA>>>21)>>>0>(A0=HA+(2097151>)|0)>>>0?c+1|0:c,HA=A0,i=c,p[(k=H)+27|0]=(63&i)<<26|HA>>>6,k=0,c=A0=2097151&DA,p[H+23|0]=31&((65535&N)<<16|a0>>>16)|c<<5,c=i,i>>=21,i=(c=(2097151&c)<<11|HA>>>21)>>>0>(jA=c+(2097151&M0)|0)>>>0?i+1|0:i,N=jA,p[H+31|0]=(131071&i)<<15|N>>>17,p[H+30|0]=(511&i)<<23|N>>>9,p[H+29|0]=(1&i)<<31|N>>>1,i=0,DA=HA&=2097151,p[H+26|0]=(524287&k)<<13|A0>>>19|DA<<2,p[H+28|0]=(16383&i)<<18|DA>>>14|N<<7}(f,s+160|0,s+288|0,s+224|0),Q0(s+288|0,64),Q0(s+224|0,64),t&&(r[t>>2]=64,r[t+4>>2]=0),BA=s+560|0,0}function V0(e,t,n){var o,a=0,f=0;if(n>>>0>=512)return Dg(0|e,0|t,0|n),e;o=e+n|0;A:if(3&(e^t))if(o>>>0<4)n=e;else if((a=o-4|0)>>>0>>0)n=e;else for(n=e;p[0|n]=u[0|t],p[n+1|0]=u[t+1|0],p[n+2|0]=u[t+2|0],p[n+3|0]=u[t+3|0],t=t+4|0,a>>>0>=(n=n+4|0)>>>0;);else{t:if((0|n)<1)n=e;else if(3&e)for(n=e;;){if(p[0|n]=u[0|t],t=t+1|0,o>>>0<=(n=n+1|0)>>>0)break t;if(!(3&n))break}else n=e;if(!((a=-4&o)>>>0<64||(f=a+-64|0)>>>0>>0))for(;r[n>>2]=r[t>>2],r[n+4>>2]=r[t+4>>2],r[n+8>>2]=r[t+8>>2],r[n+12>>2]=r[t+12>>2],r[n+16>>2]=r[t+16>>2],r[n+20>>2]=r[t+20>>2],r[n+24>>2]=r[t+24>>2],r[n+28>>2]=r[t+28>>2],r[n+32>>2]=r[t+32>>2],r[n+36>>2]=r[t+36>>2],r[n+40>>2]=r[t+40>>2],r[n+44>>2]=r[t+44>>2],r[n+48>>2]=r[t+48>>2],r[n+52>>2]=r[t+52>>2],r[n+56>>2]=r[t+56>>2],r[n+60>>2]=r[t+60>>2],t=t- -64|0,f>>>0>=(n=n- -64|0)>>>0;);if(n>>>0>=a>>>0)break A;for(;r[n>>2]=r[t>>2],t=t+4|0,a>>>0>(n=n+4|0)>>>0;);}if(n>>>0>>0)for(;p[0|n]=u[0|t],t=t+1|0,(0|o)!=(0|(n=n+1|0)););return e}function wt(e,t,n,o){var a,f=0,E=0,s=0,y=0,_=0,w=0,D=0;if(BA=a=BA-704|0,n|o)if(f=o<<3|n>>>29,s=(D=r[(E=e)+72>>2])+(_=n<<3)|0,f=f+(y=r[E+76>>2])|0,w=s,r[E+72>>2]=s,f=s>>>0<_>>>0?f+1|0:f,r[E+76>>2]=f,w=(_=(0|f)==(0|y)&D>>>0>w>>>0|f>>>0>>0)+r[(E=s=E- -64|0)>>2]|0,f=r[E+4>>2],f=_>>>0>w>>>0?f+1|0:f,s=(_=o>>>29|0)+w|0,r[E>>2]=s,r[E+4>>2]=s>>>0<_>>>0?f+1|0:f,(0|(f=o))==(0|(w=0-((y=127&((7&y)<<29|D>>>3))>>>0>128)|0))&n>>>0>=(s=128-y|0)>>>0|f>>>0>w>>>0){for(E=0,f=0;p[80+(e+(_=E+y|0)|0)|0]=u[t+E|0],(0|s)!=(0|(E=E+1|0))|(0|(f=E>>>0<1?f+1|0:f))!=(0|w););if(Ar(e,e+80|0,a,f=a+640|0),t=t+s|0,!(o=o-((n>>>0>>0)+w|0)|0)&(n=n-s|0)>>>0>127|o)for(;Ar(e,t,a,f),t=t+128|0,!(o=o-(n>>>0<128)|0)&(n=n-128|0)>>>0>127|o;);if(n|o)for(E=0,f=0;p[80+(e+E|0)|0]=u[t+E|0],(0|n)!=(0|(E=y=E+1|0))|(0|o)!=(0|(f=y>>>0<1?f+1|0:f)););Q0(a,704)}else for(E=n,s=(n=!o&n>>>0>1|(0|o)!=0)?E:1,D=n?o:0,E=0,f=0;p[80+(e+(o=E+y|0)|0)|0]=u[t+E|0],(0|s)!=(0|(E=n=E+1|0))|(0|(f=n>>>0<1?f+1|0:f))!=(0|D););return BA=a+704|0,0}function xB(e,t,n,o,a,f,E,s){e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0;var y,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0;BA=y=BA-16|0,r[y+12>>2]=0,Ca(s);A:{if(o){i=4&s;t:{g:{r:{for(;;){_=v;e:{a:{for(;;){if(U=p[n+_|0],(0|(D=i?kn(U):Gn(U)))!=255)break a;if(!a)break e;if(!yr(a,U))break r;if(!((_=_+1|0)>>>0>>0))break}e=v+1|0,r[y+12>>2]=e>>>0>>0?o:e;break g}if(H=(H<<6)+D|0,(D=w+6|0)>>>0<8)w=D;else{if(w=w-2|0,t>>>0<=Y>>>0){r[y+12>>2]=_,r[8960]=68,_=1;break t}p[e+Y|0]=H>>>w,Y=Y+1|0}if((v=_+1|0)>>>0>>0)continue}break}r[y+12>>2]=v;break g}r[y+12>>2]=_}_=0}if(!(w>>>0<=4)){e=-1;break A}}if(e=-1,!((-1<>2];;){g:{if(l>>>0<=W>>>0)r[8960]=68;else{if((0|(O=p[N+W|0]))==61){V=V-1|0;break g}if(b&&yr(b,O))break g;r[8960]=28}z=-1;break t}if(W=W+1|0,r[F>>2]=W,!V)break}return z}(n,o,y+12|0,a,w>>>1|0)))){e=0;t:if(a&&!((_=r[y+12>>2])>>>0>=o>>>0)){g:{for(;;){if(!yr(a,p[n+_|0]))break g;if((0|(_=_+1|0))==(0|o))break}r[y+12>>2]=o;break t}r[y+12>>2]=_}c=Y}}return t=r[y+12>>2],E?r[E>>2]=t+n:(0|t)!=(0|o)&&(r[8960]=28,e=-1),f&&(r[f>>2]=c),BA=y+16|0,0|e}function Ia(e,t,n){var o,a,f,E=0;BA=o=BA-16|0,a=r[e+20>>2],r[e+20>>2]=0,f=r[e+4>>2],r[e+4>>2]=0,E=-26;A:{t:{g:switch(n-1|0){case 1:if(E=-32,Mt(t,35621,9))break A;t=t+9|0;break t;case 0:break g;default:break A}if(E=-32,Mt(t,35631,8))break A;t=t+8|0}if(!Mt(t,35640,3)&&(t=nr(t+3|0,o+12|0))){if(E=-26,r[o+12>>2]!=19)break A;if(!Mt(t,35644,3)&&(t=nr(t+3|0,o+12|0))&&(r[e+44>>2]=r[o+12>>2],!Mt(t,35648,3)&&(t=nr(t+3|0,o+12|0))&&(r[e+40>>2]=r[o+12>>2],!Mt(t,35652,3)&&(t=nr(t+3|0,o+12|0))&&(n=r[o+12>>2],r[e+48>>2]=n,r[e+52>>2]=n,(0|(n=u[0|t]))==36&&(r[o+12>>2]=a,t=(0|n)==36?t+1|0:t,!xB(r[e+16>>2],a,t,Ut(t),0,o+12|0,o+8|0,3)&&(r[e+20>>2]=r[o+12>>2],t=r[o+8>>2],(0|(n=u[0|t]))==36&&(r[o+12>>2]=f,t=(0|n)==36?t+1|0:t,!xB(r[e>>2],f,t,Ut(t),0,o+12|0,o+8|0,3)))))))){if(r[e+4>>2]=r[o+12>>2],t=r[o+8>>2],E=qB(e))break A;return BA=o+16|0,u[0|t]?-32:0}}E=-32}return BA=o+16|0,E}function er(e,t){var n;for(BA=n=BA-192|0,k0(n+144|0,t),k0(n+96|0,n+144|0),k0(n+96|0,n+96|0),_0(n+96|0,t,n+96|0),_0(n+144|0,n+144|0,n+96|0),k0(n+48|0,n+144|0),_0(n+96|0,n+96|0,n+48|0),k0(n+48|0,n+96|0),t=1;k0(n+48|0,n+48|0),(0|(t=t+1|0))!=5;);for(_0(n+96|0,n+48|0,n+96|0),k0(n+48|0,n+96|0),t=1;k0(n+48|0,n+48|0),(0|(t=t+1|0))!=10;);for(_0(n+48|0,n+48|0,n+96|0),k0(n,n+48|0),t=1;k0(n,n),(0|(t=t+1|0))!=20;);for(_0(n+48|0,n,n+48|0),t=1;k0(n+48|0,n+48|0),(0|(t=t+1|0))!=11;);for(_0(n+96|0,n+48|0,n+96|0),k0(n+48|0,n+96|0),t=1;k0(n+48|0,n+48|0),(0|(t=t+1|0))!=50;);for(_0(n+48|0,n+48|0,n+96|0),k0(n,n+48|0),t=1;k0(n,n),(0|(t=t+1|0))!=100;);for(_0(n+48|0,n,n+48|0),t=1;k0(n+48|0,n+48|0),(0|(t=t+1|0))!=51;);for(_0(n+96|0,n+48|0,n+96|0),t=1;k0(n+96|0,n+96|0),(0|(t=t+1|0))!=6;);_0(e,n+96|0,n+144|0),BA=n+192|0}function ua(e,t){var n,o,a,f,E,s,y,_,w,D,v=0,Y=0,U=0,H=0,i=0,c=0,N=0;(Y=U=r[e+60>>2])|(v=r[e+56>>2])&&(U=v,p[(H=v+e|0)- -64|0]=1,!(Y=(v=v+1|0)>>>0<1?Y+1|0:Y)&v>>>0<=15&&L0(H+65|0,0,15-U|0),p[e+80|0]=1,NB(e,e- -64|0,16,0)),w=r[e+52>>2],D=r[e+48>>2],U=r[e+44>>2],N=r[e+24>>2],i=r[e+28>>2]+(N>>>26|0)|0,v=r[e+32>>2]+(i>>>26|0)|0,_=(n=(f=(-67108864|(a=r[e+36>>2]+(v>>>26|0)|0))+((y=(s=67108863&v)+((i=(c=67108863&i)+((Y=(v=(67108863&N)+((Y=r[e+20>>2]+xA(a>>>26|0,5)|0)>>>26|0)|0)+((E=5+(H=67108863&Y)|0)>>>26|0)|0)>>>26|0)|0)>>>26|0)|0)>>>26|0)|0)>>31)&v|(o=67108863&(N=(f>>>31|0)-1|0))&Y,Y=0,Y=(v=H&n|o&E|_<<26)>>>0>(H=v+r[e+40>>2]|0)>>>0?1:Y,y0(t,H),i=(v=(c=c&n|i&o)<<20|_>>>6)+U|0,U=0,U=v>>>0>i>>>0?1:U,v=Y,Y=U,Y=v>>>0>(i=v+i|0)>>>0?Y+1|0:Y,y0(t+4|0,i),U=0,U=(v=(H=n&s|o&y)<<14|c>>>12)>>>0>(c=v+D|0)>>>0?1:U,v=Y,Y=U,Y=v>>>0>(c=v+c|0)>>>0?Y+1|0:Y,y0(t+8|0,c),y0(U=t+12|0,Y=Y+(H=(t=(N&f|n&a)<<8|H>>>18)+w|0)|0),Q0(e,88)}function JB(e,t,n,o,a){e|=0,t|=0,n|=0,o|=0;var f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0;Ca(a|=0),E=(f=(o>>>0)/3|0)<<2,(f=xA(f,-3)+o|0)&&(E=2&a?(2|E)+(f>>>1|0)|0:E+4|0);A:{t:{g:{r:{if(t>>>0>E>>>0){if(!(4&a)){if(s=0,!o)break g;a=0,f=0;break r}if(s=0,!o)break g;for(a=0,f=0;;){for(_=u[n+y|0]|_<<8,a=a+8|0;w=f,D=a,v=e+f|0,Y=Ta(_>>>(a=a-6|0)&63),p[0|v]=Y,f=f+1|0,a>>>0>5;);if((0|(y=y+1|0))==(0|o))break}if(s=f,!a)break g;v=e+f|0,Y=Ta(_<<12-D&63),p[0|v]=Y,s=w+2|0;break g}z0(),s0()}for(;;){for(_=u[n+y|0]|_<<8,a=a+8|0;w=f,D=a,v=e+f|0,Y=Va(_>>>(a=a-6|0)&63),p[0|v]=Y,f=f+1|0,a>>>0>5;);if((0|(y=y+1|0))==(0|o))break}s=f,a&&(v=e+f|0,Y=Va(_<<12-D&63),p[0|v]=Y,s=w+2|0)}if((f=s)>>>0<=E>>>0){if(f>>>0>>0)break t;E=f;break A}D0(35568,35587,230,35603),s0()}L0(e+f|0,61,E-f|0)}return L0(e+E|0,0,(t>>>0>(n=E+1|0)>>>0?t:n)-E|0),0|e}function _a(e,t,n,o){var a=0,f=0,E=0,s=0,y=0,_=0;A:{if((a=r[e+56>>2])|(f=r[e+60>>2])){if(_=e,y=E=16-a|0,y=(E=(0|(s=0-((a>>>0>16)+f|0)|0))==(0|o)&n>>>0>>0|o>>>0>>0)?n:y,(E=s=E?o:s)|y){if(p[(e+a|0)- -64|0]=u[0|t],f=1,a=0,(0|y)!=1|E)for(;s=f+r[e+56>>2]|0,p[(e+s|0)- -64|0]=u[t+f|0],(0|y)!=(0|(f=f+1|0))|(0|(a=f>>>0<1?a+1|0:a))!=(0|E););a=r[e+56>>2],f=r[e+60>>2]}if(s=a+y|0,a=f+E|0,f=s,r[_+56>>2]=f,a=f>>>0>>0?a+1|0:a,r[_+60>>2]=a,!a&f>>>0<16)break A;NB(e,e- -64|0,16,0),r[e+56>>2]=0,r[e+60>>2]=0,n=(a=n)-(f=y)|0,o=o-((a>>>0>>0)+E|0)|0,t=t+f|0}if(!o&n>>>0>=16|o&&(NB(e,t,a=-16&n,o),n&=15,o=0,t=t+a|0),n|o){for(f=0,a=0;_=f+r[e+56>>2]|0,p[(e+_|0)- -64|0]=u[t+f|0],(0|n)!=(0|(f=f+1|0))|(0|o)!=(0|(a=f>>>0<1?a+1|0:a)););t=e,a=n+r[e+56>>2]|0,e=o+r[e+60>>2]|0,r[t+56>>2]=a,r[t+60>>2]=n>>>0>a>>>0?e+1|0:e}}}function wn(e,t){var n=0,o=0,a=0,f=0,E=0,s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0;A:if(e&&(r[e+36>>2]!=2||(a=r[t>>2],u[t+8|0]<2&&!a)?(function(H,i,c){var N,l=0,F=0,b=0;if(BA=N=BA-4096|0,pr(N+3072|0),pr(N+2048|0),!(!H|!i)&&(r[N+2048>>2]=r[i>>2],r[N+2052>>2]=0,r[N+2056>>2]=r[i+4>>2],r[N+2060>>2]=0,r[N+2064>>2]=u[i+8|0],r[N+2068>>2]=0,r[N+2072>>2]=r[H+16>>2],r[N+2076>>2]=0,r[N+2080>>2]=r[H+8>>2],r[N+2084>>2]=0,r[N+2088>>2]=r[H+36>>2],r[N+2092>>2]=0,r[H+20>>2]))for(i=0;(b=127&i)||(l=r[N+2100>>2],l=(F=r[N+2096>>2]+1|0)>>>0<1?l+1|0:l,r[N+2096>>2]=F,r[N+2100>>2]=l,pr(N),pr(N+1024|0),HB(N+3072|0,N+2048|0,N),HB(N+3072|0,N,N+1024|0)),b=r[4+(F=(N+1024|0)+(b<<3)|0)>>2],r[(l=(i<<3)+c|0)>>2]=r[F>>2],r[l+4>>2]=b,(i=i+1|0)>>>0>2];);BA=N+4096|0}(e,t,_=r[e+4>>2]),a=r[t>>2],o=0):(_=r[e+4>>2],o=1),D=o,!((E=!((o=u[t+8|0])|a)<<1)>>>0>=(n=r[e+20>>2])>>>0)))for(f=r[e+24>>2],n=(a=(xA(f,r[t+4>>2])+E|0)+xA(n,o)|0)+((a>>>0)%(f>>>0)|0?-1:f-1|0)|0;;){if(w=((a>>>0)%(f>>>0)|0)==1?a-1|0:n,D?(s=r[e>>2],n=r[s+4>>2]+(w<<10)|0):(s=r[e>>2],n=(E<<3)+_|0),o=r[n+4>>2],v=r[n>>2],n=r[e+28>>2],r[t+12>>2]=E,o=(o>>>0)%(n>>>0)|0,y=r[t+4>>2],n=u[t+8|0]?o:y,s=r[s+4>>2],Y=f,U=o,f=r[t>>2],y=(s+(xA(Y,n=(o=f)?U:n)<<10)|0)+(dn(e,t,v,!0&(0|n)==(0|y))<<10)|0,o=s+(w<<10)|0,n=s+(a<<10)|0,f?HB(o,y,n):_n(o,y,n),(E=E+1|0)>>>0>=OA[e+20>>2])break A;a=a+1|0,n=w+1|0,f=r[e+24>>2]}}function rr(e,t,n){var o,a,f,E,s,y,_,w,D,v,Y,U,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0;o=r[t+4>>2],a=r[e+4>>2],f=r[t+8>>2],i=r[e+8>>2],E=r[t+12>>2],c=r[e+12>>2],s=r[t+16>>2],N=r[e+16>>2],y=r[t+20>>2],l=r[e+20>>2],_=r[t+24>>2],F=r[e+24>>2],w=r[t+28>>2],b=r[e+28>>2],D=r[t+32>>2],V=r[e+32>>2],v=r[t+36>>2],W=r[e+36>>2],U=(n=0-n|0)&((Y=r[t>>2])^(H=r[e>>2])),r[e>>2]=U^H,H=W,W=n&(W^v),r[e+36>>2]=H^W,H=V,V=n&(V^D),r[e+32>>2]=H^V,H=b,b=n&(b^w),r[e+28>>2]=H^b,H=F,F=n&(F^_),r[e+24>>2]=H^F,H=l,l=n&(l^y),r[e+20>>2]=H^l,H=N,N=n&(N^s),r[e+16>>2]=H^N,H=c,c=n&(c^E),r[e+12>>2]=H^c,H=i,i=n&(i^f),r[e+8>>2]=H^i,H=e,e=n&(o^a),r[H+4>>2]=e^a,r[t+36>>2]=W^v,r[t+32>>2]=V^D,r[t+28>>2]=b^w,r[t+24>>2]=F^_,r[t+20>>2]=l^y,r[t+16>>2]=N^s,r[t+12>>2]=c^E,r[t+8>>2]=i^f,r[t+4>>2]=e^o,r[t>>2]=Y^U}function pa(e,t){var n;r[e>>2]=67108863&(u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24),r[e+4>>2]=(u[t+3|0]|u[t+4|0]<<8|u[t+5|0]<<16|u[t+6|0]<<24)>>>2&67108611,r[e+8>>2]=(u[t+6|0]|u[t+7|0]<<8|u[t+8|0]<<16|u[t+9|0]<<24)>>>4&67092735,r[e+12>>2]=(u[t+9|0]|u[t+10|0]<<8|u[t+11|0]<<16|u[t+12|0]<<24)>>>6&66076671,n=u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24,r[e+20>>2]=0,r[e+24>>2]=0,r[e+28>>2]=0,r[e+32>>2]=0,r[e+36>>2]=0,r[e+16>>2]=n>>>8&1048575,r[e+40>>2]=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,r[e+44>>2]=u[t+20|0]|u[t+21|0]<<8|u[t+22|0]<<16|u[t+23|0]<<24,r[e+48>>2]=u[t+24|0]|u[t+25|0]<<8|u[t+26|0]<<16|u[t+27|0]<<24,t=u[t+28|0]|u[t+29|0]<<8|u[t+30|0]<<16|u[t+31|0]<<24,p[e+80|0]=0,r[e+56>>2]=0,r[e+60>>2]=0,r[e+52>>2]=t}function Br(e,t,n){var o=0;A:if((0|e)!=(0|t)){if((t-e|0)-n>>>0<=0-(n<<1)>>>0)return V0(e,t,n);if(o=3&(e^t),e>>>0>>0){if(o)o=e;else{if(3&e)for(o=e;;){if(!n)break A;if(p[0|o]=u[0|t],t=t+1|0,n=n-1|0,!(3&(o=o+1|0)))break}else o=e;if(!(n>>>0<=3))for(;r[o>>2]=r[t>>2],t=t+4|0,o=o+4|0,(n=n-4|0)>>>0>3;);}if(n)for(;p[0|o]=u[0|t],o=o+1|0,t=t+1|0,n=n-1|0;);}else{if(!o){if(e+n&3)for(;;){if(!n)break A;if(p[0|(o=(n=n-1|0)+e|0)]=u[t+n|0],!(3&o))break}if(!(n>>>0<=3))for(;r[(n=n-4|0)+e>>2]=r[t+n>>2],n>>>0>3;);}if(!n)break A;for(;p[(n=n-1|0)+e|0]=u[t+n|0],n;);}}return e}function Jg(e,t){var n,o=0;BA=n=BA-48|0,function(a,f){var E,s,y,_,w,D,v,Y,U=0;s=r[f+28>>2],y=r[f+24>>2],_=r[f+20>>2],w=r[f+16>>2],D=r[f+12>>2],v=r[f+8>>2],Y=r[f+4>>2],U=r[f>>2],E=r[f+36>>2],f=r[f+32>>2],U=xA(((s+(y+(_+(w+(D+(v+(Y+(U+(xA(E,19)+16777216>>>25|0)>>26)>>25)>>26)>>25)>>26)>>25)>>26)>>25)+f>>26)+E>>25,19)+U|0,r[a>>2]=67108863&U,U=Y+(U>>26)|0,r[a+4>>2]=33554431&U,U=v+(U>>25)|0,r[a+8>>2]=67108863&U,U=D+(U>>26)|0,r[a+12>>2]=33554431&U,U=w+(U>>25)|0,r[a+16>>2]=67108863&U,U=_+(U>>26)|0,r[a+20>>2]=33554431&U,U=y+(U>>25)|0,r[a+24>>2]=67108863&U,U=s+(U>>26)|0,r[a+28>>2]=33554431&U,f=f+(U>>25)|0,r[a+32>>2]=67108863&f,r[a+36>>2]=E+(f>>26)&33554431}(n,t),t=r[n>>2],p[0|e]=t,p[e+2|0]=t>>>16,p[e+1|0]=t>>>8,o=r[n+4>>2],p[e+5|0]=o>>>14,p[e+4|0]=o>>>6,p[e+3|0]=o<<2|t>>>24,t=r[n+8>>2],p[e+8|0]=t>>>13,p[e+7|0]=t>>>5,p[e+6|0]=t<<3|o>>>22,o=r[n+12>>2],p[e+11|0]=o>>>11,p[e+10|0]=o>>>3,p[e+9|0]=o<<5|t>>>21,t=r[n+16>>2],p[e+15|0]=t>>>18,p[e+14|0]=t>>>10,p[e+13|0]=t>>>2,p[e+12|0]=t<<6|o>>>19,t=r[n+20>>2],p[e+16|0]=t,p[e+18|0]=t>>>16,p[e+17|0]=t>>>8,o=r[n+24>>2],p[e+21|0]=o>>>15,p[e+20|0]=o>>>7,p[e+19|0]=o<<1|t>>>24,t=r[n+28>>2],p[e+24|0]=t>>>13,p[e+23|0]=t>>>5,p[e+22|0]=t<<3|o>>>23,o=r[n+32>>2],p[e+27|0]=o>>>12,p[e+26|0]=o>>>4,p[e+25|0]=o<<4|t>>>21,t=r[n+36>>2],p[e+31|0]=t>>>18,p[e+30|0]=t>>>10,p[e+29|0]=t>>>2,p[e+28|0]=t<<6|o>>>20,BA=n+48|0}function Ee(e,t,n,o){var a=0,f=0,E=0,s=0,y=0,_=0;A:if(n|o)for(_=e+224|0,E=e+96|0,a=u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24;;){if(s=96+(e+a|0)|0,y=f=256-a|0,!o&n>>>0<=f>>>0){V0(s,t,n),t=n+(u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)|0,p[e+352|0]=t,p[e+353|0]=t>>>8,p[e+354|0]=t>>>16,p[e+355|0]=t>>>24;break A}if(V0(s,t,f),a=(u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)+f|0,p[e+352|0]=a,p[e+353|0]=a>>>8,p[e+354|0]=a>>>16,p[e+355|0]=a>>>24,KB(e,128),SB(e,E),V0(E,_,128),a=(u[e+352|0]|u[e+353|0]<<8|u[e+354|0]<<16|u[e+355|0]<<24)-128|0,p[e+352|0]=a,p[e+353|0]=a>>>8,p[e+354|0]=a>>>16,p[e+355|0]=a>>>24,t=t+f|0,!((n=(f=n)-y|0)|(o=o-(f>>>0>>0)|0)))break}return 0}function PB(e,t){var n,o=0,a=0,f=0,E=0;for(BA=n=BA-464|0;a=o<<1,E=u[t+o|0],p[a+(n+400|0)|0]=15&E,p[(n+400|0)+(1|a)|0]=E>>>4,(0|(o=o+1|0))!=32;);for(o=0;t=((a=(t=o)+u[0|(o=(n+400|0)+f|0)]|0)<<24)- -134217728|0,p[0|o]=a-(t>>24&240),o=t>>28,(0|(f=f+1|0))!=63;);for(p[n+463|0]=u[n+463|0]+o,on(e),o=1;yn(n,o>>>1|0,p[(n+400|0)+o|0]),WB(n+240|0,e,n),Z0(e,n+240|0),t=o>>>0<62,o=o+2|0,t;);for(sr(n+240|0,e),Qr(n+120|0,n+240|0),ce(n+240|0,n+120|0),Qr(n+120|0,n+240|0),ce(n+240|0,n+120|0),Qr(n+120|0,n+240|0),ce(n+240|0,n+120|0),Z0(e,n+240|0),o=0;yn(n,o>>>1|0,p[(n+400|0)+o|0]),WB(n+240|0,e,n),Z0(e,n+240|0),t=o>>>0<62,o=o+2|0,t;);BA=n+464|0}function L0(e,t,n){var o=0,a=0,f=0,E=0;if(n&&(p[(o=e+n|0)-1|0]=t,p[0|e]=t,!(n>>>0<3||(p[o-2|0]=t,p[e+1|0]=t,p[o-3|0]=t,p[e+2|0]=t,n>>>0<7||(p[o-4|0]=t,p[e+3|0]=t,n>>>0<9||(a=(o=0-e&3)+e|0,t=xA(255&t,16843009),r[a>>2]=t,r[(o=(n=n-o&-4)+a|0)-4>>2]=t,n>>>0<9||(r[a+8>>2]=t,r[a+4>>2]=t,r[o-8>>2]=t,r[o-12>>2]=t,n>>>0<25||(r[a+24>>2]=t,r[a+20>>2]=t,r[a+16>>2]=t,r[a+12>>2]=t,r[o-16>>2]=t,r[o-20>>2]=t,r[o-24>>2]=t,r[o-28>>2]=t,(n=n-(E=4&a|24)|0)>>>0<32))))))))for(o=t,f=t,t=a+E|0;r[t+24>>2]=f,r[t+28>>2]=o,r[t+16>>2]=f,r[t+20>>2]=o,r[t+8>>2]=f,r[t+12>>2]=o,r[t>>2]=f,r[t+4>>2]=o,t=t+32|0,(n=n-32|0)>>>0>31;);return e}function KB(e,t){var n,o,a,f=0,E=0;E=f=e- -64|0,o=1+(n=u[f+4|0]|u[f+5|0]<<8|u[f+6|0]<<16|u[f+7|0]<<24)|0,f=(t=t+(f=a=u[0|f]|u[f+1|0]<<8|u[f+2|0]<<16|u[f+3|0]<<24)|0)>>>0>>0?o:n,p[0|E]=t,p[E+1|0]=t>>>8,p[E+2|0]=t>>>16,p[E+3|0]=t>>>24,p[E+4|0]=f,p[E+5|0]=f>>>8,p[E+6|0]=f>>>16,p[E+7|0]=f>>>24,t=(f=(0|f)==(0|n)&t>>>0>>0|f>>>0>>0)+(u[e+72|0]|u[e+73|0]<<8|u[e+74|0]<<16|u[e+75|0]<<24)|0,E=u[e+76|0]|u[e+77|0]<<8|u[e+78|0]<<16|u[e+79|0]<<24,f=t>>>0>>0?E+1|0:E,p[e+72|0]=t,p[e+73|0]=t>>>8,p[e+74|0]=t>>>16,p[e+75|0]=t>>>24,p[e+76|0]=f,p[e+77|0]=f>>>8,p[e+78|0]=f>>>16,p[e+79|0]=f>>>24}function la(e,t,n,o,a,f,E){var s,y,_,w,D=0;return BA=s=BA-352|0,LB(s,f,E),!a&o>>>0<=n-e>>>0|e>>>0>=n>>>0&&!(!a&o>>>0>e-n>>>0|a&&e>>>0>n>>>0)||(n=Br(e,n,o)),r[s+56>>2]=0,r[s+60>>2]=0,r[s+48>>2]=0,r[s+52>>2]=0,r[s+40>>2]=0,r[s+44>>2]=0,r[s+32>>2]=0,r[s+36>>2]=0,(y=!((E=(D=!a&o>>>0>32|(0|a)!=0)?32:o)|(D=D?0:a)))||V0(s- -64|0,n,E),w=f+16|0,Ba(s+32|0,s+32|0,_=E+32|0,f=_>>>0<32?D+1|0:D,w,s),$t(s+96|0,s+32|0),y||V0(e,s- -64|0,E),Q0(s+32|0,64),!a&o>>>0>=33|a&&Cn(e+E|0,f=n+E|0,(n=o)-E|0,a-(D+(n>>>0>>0)|0)|0,w,s),Q0(s,32),m0(s+96|0,e,o,a),Ag(s+96|0,t),Q0(s+96|0,256),BA=s+352|0,0}function ar(e,t){r[e>>2]=1634760805,r[e+4>>2]=857760878,r[e+8>>2]=2036477234,r[e+12>>2]=1797285236,r[e+16>>2]=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,r[e+20>>2]=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24,r[e+24>>2]=u[t+8|0]|u[t+9|0]<<8|u[t+10|0]<<16|u[t+11|0]<<24,r[e+28>>2]=u[t+12|0]|u[t+13|0]<<8|u[t+14|0]<<16|u[t+15|0]<<24,r[e+32>>2]=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,r[e+36>>2]=u[t+20|0]|u[t+21|0]<<8|u[t+22|0]<<16|u[t+23|0]<<24,r[e+40>>2]=u[t+24|0]|u[t+25|0]<<8|u[t+26|0]<<16|u[t+27|0]<<24,r[e+44>>2]=u[t+28|0]|u[t+29|0]<<8|u[t+30|0]<<16|u[t+31|0]<<24}function wa(e,t,n,o,a,f,E){var s,y,_=0,w=0;BA=s=BA-96|0,LB(s,f,E),y=f+16|0,Ct[r[8952]](s+32|0,32,0,y,s),f=-1;A:{if(!(0|Ct[r[8946]](n,t,o,a,s+32|0))){if(f=0,!e)break A;!a&o>>>0<=e-t>>>0|e>>>0<=t>>>0&&!(!a&o>>>0>t-e>>>0|a&&e>>>0>>0)||(t=Br(e,t,o)),n=(f=!a&o>>>0>32|(0|a)!=0)?32:o,E=f=f?0:a,n|f?(w=V0(s- -64|0,t,n),f=E,Ba(s+32|0,s+32|0,_=n+32|0,f=_>>>0<32?f+1|0:f,y,s),V0(e,w,n)):(f=E,Ba(s+32|0,s+32|0,_=n+32|0,f=_>>>0<32?f+1|0:f,y,s)),f=0,!a&o>>>0<33||Cn((_=e)+(e=n)|0,e+t|0,o-e|0,a-(E+(e>>>0>o>>>0)|0)|0,y,s)}Q0(s,32)}return BA=s+96|0,f}function qB(e){var t=0,n=0,o=0;if(!e)return-25;if(!r[e>>2])return-1;A:{t:{if(t=-2,!(OA[e+4>>2]<16)&&(r[e+8>>2]||(t=-18,!r[e+12>>2]))){if(n=r[e+20>>2],!r[e+16>>2])break t;if(t=-6,!(n>>>0<8)&&(r[e+24>>2]||(t=-20,!r[e+28>>2]))&&(r[e+32>>2]||(t=-21,!r[e+36>>2]))){if(!(n=r[e+48>>2]))return-16;if(t=-17,!(n>>>0>16777215||(t=-14,(o=r[e+44>>2])>>>0<8||(t=-15,o>>>0>2097152||(t=-14,n<<3>>>0>o>>>0))))){if(!r[e+40>>2])return-12;if(e=r[e+52>>2])break A;t=-28}}}return t}return n?-19:-6}return e>>>0>16777215?-29:0}function TB(e,t,n){var o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F,b,V;Y=r[t+4>>2],o=r[e+4>>2],U=r[t+8>>2],a=r[e+8>>2],H=r[t+12>>2],f=r[e+12>>2],i=r[t+16>>2],E=r[e+16>>2],c=r[t+20>>2],s=r[e+20>>2],N=r[t+24>>2],y=r[e+24>>2],l=r[t+28>>2],_=r[e+28>>2],F=r[t+32>>2],w=r[e+32>>2],b=r[t+36>>2],D=r[e+36>>2],v=r[e>>2],V=r[t>>2]^v,t=0-n|0,r[e>>2]=v^V&t,r[e+36>>2]=t&(D^b)^D,r[e+32>>2]=t&(w^F)^w,r[e+28>>2]=t&(_^l)^_,r[e+24>>2]=t&(y^N)^y,r[e+20>>2]=t&(s^c)^s,r[e+16>>2]=t&(E^i)^E,r[e+12>>2]=t&(f^H)^f,r[e+8>>2]=t&(a^U)^a,r[e+4>>2]=t&(o^Y)^o}function Da(e,t){for(var n=0,o=0,a=0,f=0,E=0,s=0,y=0,_=0;p[e+n|0]=u[(n>>>3|0)+t|0]>>>(7&n)&1,(0|(n=n+1|0))!=256;);for(;;){s=(t=s)+1|0;A:if(u[0|(E=e+t|0)]&&(n=s,a=1,!(t>>>0>254)))for(;;){t:if(f=p[0|(o=e+n|0)])if((0|(_=(y=p[0|E])+(f<<=a)|0))<=15)p[0|E]=_,p[0|o]=0;else{if((0|(o=y-f|0))<-15)break A;for(p[0|E]=o;;){if(!u[0|(o=e+n|0)]){p[0|o]=1;break t}if(p[0|o]=0,o=n>>>0<255,n=n+1|0,!o)break}}if(a>>>0>5)break A;if(!((n=t+(a=a+1|0)|0)>>>0<256))break}if((0|s)==256)break}}function da(e,t,n,o){var a,f,E,s,y=0;BA=a=BA+-64|0,L0(a+8|0,0,52),y=Ut(e),r[a+20>>2]=y,r[a+36>>2]=y,r[a+4>>2]=y,f=Nt(y),r[a+32>>2]=f,E=Nt(y),r[a+16>>2]=E,s=Nt(y),r[a>>2]=s;A:if(!s|!f|!E||!(y=Nt(y)))ot(f),ot(E),ot(s),e=-22;else{if(e=Ia(a,e,o)){ot(r[a+32>>2]),ot(r[a+16>>2]),ot(r[a>>2]),ot(y);break A}e=0,t=se(r[a+40>>2],r[a+44>>2],r[a+52>>2],t,n,r[a+16>>2],r[a+20>>2],y,r[a+4>>2],0,0,o),ot(r[a+32>>2]),ot(r[a+16>>2]),(t||or(y,r[a>>2],r[a+4>>2]))&&(e=-35),ot(y),ot(r[a>>2])}return BA=a- -64|0,e}function Fa(e,t){var n,o,a=0;BA=n=BA-288|0,ya(o=e+40|0,t),kt(a=e+80|0),k0(n+240|0,o),_0(n+192|0,n+240|0,2128),$0(n+240|0,n+240|0,a),O0(n+192|0,n+192|0,a),k0(n+144|0,n+192|0),_0(n+144|0,n+144|0,n+192|0),k0(e,n+144|0),_0(e,e,n+192|0),_0(e,e,n+240|0),function(f,E){var s,y=0;for(BA=s=BA-144|0,k0(s+96|0,E),k0(s+48|0,s+96|0),k0(s+48|0,s+48|0),_0(s+48|0,E,s+48|0),_0(s+96|0,s+96|0,s+48|0),k0(s+96|0,s+96|0),_0(s+96|0,s+48|0,s+96|0),k0(s+48|0,s+96|0),y=1;k0(s+48|0,s+48|0),(0|(y=y+1|0))!=5;);for(_0(s+96|0,s+48|0,s+96|0),k0(s+48|0,s+96|0),y=1;k0(s+48|0,s+48|0),(0|(y=y+1|0))!=10;);for(_0(s+48|0,s+48|0,s+96|0),k0(s,s+48|0),y=1;k0(s,s),(0|(y=y+1|0))!=20;);for(_0(s+48|0,s,s+48|0),y=1;k0(s+48|0,s+48|0),(0|(y=y+1|0))!=11;);for(_0(s+96|0,s+48|0,s+96|0),k0(s+48|0,s+96|0),y=1;k0(s+48|0,s+48|0),(0|(y=y+1|0))!=50;);for(_0(s+48|0,s+48|0,s+96|0),k0(s,s+48|0),y=1;k0(s,s),(0|(y=y+1|0))!=100;);for(_0(s+48|0,s,s+48|0),y=1;k0(s+48|0,s+48|0),(0|(y=y+1|0))!=51;);_0(s+96|0,s+48|0,s+96|0),k0(s+96|0,s+96|0),k0(s+96|0,s+96|0),_0(f,s+96|0,E),BA=s+144|0}(e,e),_0(e,e,n+144|0),_0(e,e,n+240|0),k0(n+96|0,e),_0(n+96|0,n+96|0,n+192|0),$0(n+48|0,n+96|0,n+240|0);A:{if(!Aa(n+48|0)){if(O0(n,n+96|0,n+240|0),a=-1,!Aa(n))break A;_0(e,e,2176)}(0|an(e))==(u[t+31|0]>>>7|0)&&Sa(e,e),_0(e+120|0,e,o),a=0}return BA=n+288|0,a}function $0(e,t,n){var o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F;o=r[n+4>>2],a=r[t+4>>2],f=r[n+8>>2],E=r[t+8>>2],s=r[n+12>>2],y=r[t+12>>2],_=r[n+16>>2],w=r[t+16>>2],D=r[n+20>>2],v=r[t+20>>2],Y=r[n+24>>2],U=r[t+24>>2],H=r[n+28>>2],i=r[t+28>>2],c=r[n+32>>2],N=r[t+32>>2],l=r[n+36>>2],F=r[t+36>>2],r[e>>2]=r[t>>2]-r[n>>2],r[e+36>>2]=F-l,r[e+32>>2]=N-c,r[e+28>>2]=i-H,r[e+24>>2]=U-Y,r[e+20>>2]=v-D,r[e+16>>2]=w-_,r[e+12>>2]=y-s,r[e+8>>2]=E-f,r[e+4>>2]=a-o}function O0(e,t,n){var o,a,f,E,s,y,_,w,D,v,Y,U,H,i,c,N,l,F;o=r[n+4>>2],a=r[t+4>>2],f=r[n+8>>2],E=r[t+8>>2],s=r[n+12>>2],y=r[t+12>>2],_=r[n+16>>2],w=r[t+16>>2],D=r[n+20>>2],v=r[t+20>>2],Y=r[n+24>>2],U=r[t+24>>2],H=r[n+28>>2],i=r[t+28>>2],c=r[n+32>>2],N=r[t+32>>2],l=r[n+36>>2],F=r[t+36>>2],r[e>>2]=r[n>>2]+r[t>>2],r[e+36>>2]=l+F,r[e+32>>2]=c+N,r[e+28>>2]=H+i,r[e+24>>2]=Y+U,r[e+20>>2]=D+v,r[e+16>>2]=_+w,r[e+12>>2]=s+y,r[e+8>>2]=f+E,r[e+4>>2]=o+a}function VB(e){var t,n=0,o=0,a=0,f=0;for(p[11+(t=BA-16|0)|0]=0,p[t+12|0]=0,p[t+13|0]=0,p[t+14|0]=0,r[t+8>>2]=0;;){for(a=u[e+o|0],n=0;p[0|(f=(t+8|0)+n|0)]=u[0|f]|a^u[(3232+(n<<5)|0)+o|0],(0|(n=n+1|0))!=7;);if((0|(o=o+1|0))==31)break}for(o=127&u[e+31|0],e=0,n=0;p[0|(a=(t+8|0)+n|0)]=u[0|a]|o^u[3263+(n<<5)|0],(0|(n=n+1|0))!=7;);for(n=0;n=u[(t+8|0)+e|0]-1|n,(0|(e=e+1|0))!=7;);return n>>>8&1}function XB(e,t){var n=0,o=0,a=0,f=0,E=0;for(L0(V0(e,1952,64)- -64|0,0,293);a=o=(n=f<<3)+e|0,n=t+n|0,E=u[0|o]|u[o+1|0]<<8|u[o+2|0]<<16|u[o+3|0]<<24,o=(u[n+4|0]|u[n+5|0]<<8|u[n+6|0]<<16|u[n+7|0]<<24)^(u[o+4|0]|u[o+5|0]<<8|u[o+6|0]<<16|u[o+7|0]<<24),n=(u[0|n]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24)^E,p[0|a]=n,p[a+1|0]=n>>>8,p[a+2|0]=n>>>16,p[a+3|0]=n>>>24,p[a+4|0]=o,p[a+5|0]=o>>>8,p[a+6|0]=o>>>16,p[a+7|0]=o>>>24,(0|(f=f+1|0))!=8;);}function ma(e,t,n,o,a){var f,E=0;BA=f=BA+-64|0;A:{t:{if(E=!n,(n=Ut(e))>>>0<128&&E){if(r[f+56>>2]=0,r[f+48>>2]=0,r[f+52>>2]=0,r[f+40>>2]=0,r[f+44>>2]=0,E=function(s){var y=0,_=0;return y=0,s&&(_=s,y=s,(1|s)>>>0<65536||(y=_)),_=y,!(s=Nt(y))|!(3&u[s-4|0])||L0(s,0,_),s}(n))break t}else r[8960]=28;e=-1;break A}r[f+32>>2]=0,r[f+36>>2]=0,r[f+8>>2]=E,r[f+16>>2]=E,r[f+20>>2]=n,r[f>>2]=E,r[f+12>>2]=n,r[f+24>>2]=0,r[f+28>>2]=0,r[f+4>>2]=n,Ia(f,e,a)?(r[8960]=28,e=-1):(e=1,(0|t)==r[f+40>>2]&&(e=r[f+44>>2]!=(o>>>10|0))),ot(E)}return BA=f- -64|0,e}function Dn(e,t){var n,o=0,a=0,f=0,E=0;if(BA=n=BA-48|0,!((o=qB(e))||(o=-26,t-1>>>0>1||(f=r[e+44>>2],o=r[e+48>>2],r[n>>2]=0,a=r[e+40>>2],r[n+28>>2]=o,r[n+12>>2]=-1,r[n+8>>2]=a,o=((a=f>>>0<(a=o<<3)>>>0?a:f)>>>0)/((f=o<<2)>>>0)|0,r[n+20>>2]=o,r[n+24>>2]=o<<2,r[n+16>>2]=xA(o,f),o=r[e+52>>2],r[n+36>>2]=t,r[n+32>>2]=o,o=function(s,y){var _,w=0;return BA=_=BA-80|0,w=-25,!s|!y||(w=Nt(r[s+20>>2]<<3),r[s+4>>2]=w,w?(w=function(D,v){var Y,U=0,H=0;BA=Y=BA-16|0,H=-22;A:if(!(!D|!v)&&(((U=v<<10)>>>0)/(v>>>0)|0)==1024&&(v=Nt(12),r[D>>2]=v,v)){r[v>>2]=0,r[v+4>>2]=0,v=function(i,c){if(c>>>0>4294967168)i=48;else{if(!(c=function(N){var l=0,F=0,b=0,V=0,W=0,O=0;return N>>>0>=4294967168?(r[8960]=48,0):(N=Nt(76+(b=N>>>0<11?16:N+11&-8)|0))?(l=N-8|0,63&N?(V=(-8&(O=r[(W=N-4|0)>>2]))-(F=(N=(N=(N+63&-64)-8|0)-l>>>0>15?N:N- -64|0)-l|0)|0,3&O?(r[N+4>>2]=V|1&r[N+4>>2]|2,r[4+(V=N+V|0)>>2]=1|r[V+4>>2],r[W>>2]=F|1&r[W>>2]|2,r[N+4>>2]=1|r[N+4>>2],ca(l,F)):(l=r[l>>2],r[N+4>>2]=V,r[N>>2]=l+F)):N=l,3&(l=r[N+4>>2])&&((F=-8&l)>>>0<=b+16>>>0||(r[N+4>>2]=b|1&l|2,l=N+b|0,b=F-b|0,r[l+4>>2]=3|b,r[4+(F=N+F|0)>>2]=1|r[F+4>>2],ca(l,b))),N+8|0):0}(c)))return 48;r[i>>2]=c,i=0}return i}(Y+12|0,U),r[8960]=v;t:{if(v)r[Y+12>>2]=0;else if(v=r[Y+12>>2])break t;ot(r[D>>2]),r[D>>2]=0;break A}r[r[D>>2]>>2]=v,r[r[D>>2]+4>>2]=v,r[r[D>>2]+8>>2]=U,H=0}return BA=Y+16|0,H}(s,r[s+16>>2]))?Wa(s,r[y+56>>2]):(function(D,v,Y){var U,H=0;U=H=BA,BA=H=H-448&-64,!D|!v||(Cr(H- -64|0,0,0,64),y0(H+60|0,r[v+48>>2]),at(H- -64|0,H+60|0,4,0),y0(H+60|0,r[v+4>>2]),at(H- -64|0,H+60|0,4,0),y0(H+60|0,r[v+44>>2]),at(H- -64|0,H+60|0,4,0),y0(H+60|0,r[v+40>>2]),at(H- -64|0,H+60|0,4,0),y0(H+60|0,19),at(H- -64|0,H+60|0,4,0),y0(H+60|0,Y),at(H- -64|0,H+60|0,4,0),y0(H+60|0,r[v+12>>2]),at(H- -64|0,H+60|0,4,0),(Y=r[v+8>>2])&&(at(H- -64|0,Y,r[v+12>>2],0),1&p[v+56|0]&&(Q0(r[v+8>>2],r[v+12>>2]),r[v+12>>2]=0)),y0(H+60|0,r[v+20>>2]),at(H- -64|0,H+60|0,4,0),(Y=r[v+16>>2])&&at(H- -64|0,Y,r[v+20>>2],0),y0(H+60|0,r[v+28>>2]),at(H- -64|0,H+60|0,4,0),(Y=r[v+24>>2])&&(at(H- -64|0,Y,r[v+28>>2],0),2&u[v+56|0]&&(Q0(r[v+24>>2],r[v+28>>2]),r[v+28>>2]=0)),y0(H+60|0,r[v+36>>2]),at(H- -64|0,H+60|0,4,0),(Y=r[v+32>>2])&&at(H- -64|0,Y,r[v+36>>2],0),Er(H- -64|0,D,64)),BA=U}(_,y,r[s+36>>2]),Q0(_- -64|0,8),function(D,v){var Y,U=0,H=0,i=0;if(BA=Y=BA-1024|0,r[v+28>>2])for(i=D+68|0,H=D- -64|0;y0(H,0),y0(i,U),MB(Y,1024,D,72),Ja(r[r[v>>2]+4>>2]+(xA(r[v+24>>2],U)<<10)|0,Y),y0(H,1),MB(Y,1024,D,72),Ja(1024+(r[r[v>>2]+4>>2]+(xA(r[v+24>>2],U)<<10)|0)|0,Y),(U=U+1|0)>>>0>2];);Q0(Y,1024),BA=Y+1024|0}(_,s),Q0(_,72),w=0):w=-22),BA=_+80|0,w}(n,e))))){if(r[n+8>>2])for(;Fn(n,E),(E=E+1|0)>>>0>2];);(function(s,y){var _,w=0,D=0;if(BA=_=BA-2048|0,!(!s|!y)){if(mg(_+1024|0,(r[r[y>>2]+4>>2]+(r[y+24>>2]<<10)|0)-1024|0),OA[y+28>>2]>=2)for(w=1;D=r[y+24>>2],Kg(_+1024|0,(r[r[y>>2]+4>>2]+(D+xA(w,D)<<10)|0)-1024|0),(w=w+1|0)>>>0>2];);(function(v,Y){for(var U=0,H=0;q0((U=H<<3)+v|0,r[(U=Y+U|0)>>2],r[U+4>>2]),(0|(H=H+1|0))!=128;);})(_,_+1024|0),MB(r[s>>2],r[s+4>>2],_,1024),Q0(_+1024|0,1024),Q0(_,1024),Wa(y,r[s+56>>2])}BA=_+2048|0})(e,n),o=0}return BA=n+48|0,o}function se(e,t,n,o,a,f,E,s,y,_,w,D){var v,Y;return BA=v=BA+-64|0,(Y=Nt(y))?(r[v+32>>2]=0,r[v+36>>2]=0,r[v+24>>2]=0,r[v+28>>2]=0,r[v+20>>2]=E,r[v+16>>2]=f,r[v+12>>2]=a,r[v+8>>2]=o,r[v+4>>2]=y,r[v>>2]=Y,r[v+56>>2]=0,r[v+52>>2]=n,r[v+48>>2]=n,r[v+44>>2]=t,r[v+40>>2]=e,(n=Dn(v,D))?Q0(Y,y):!_|!w||!ln(_,w,v,D)?(s&&V0(s,Y,y),Q0(Y,y),n=0):(Q0(Y,y),Q0(_,w),n=-31),ot(Y)):n=-22,BA=v- -64|0,n}function va(e,t,n,o,a,f){var E,s,y=0,_=0,w=0;return BA=E=BA-592|0,y=-1,function(D){var v=0,Y=0,U=0,H=0,i=0;for(v=32,Y=1;i=(U=u[(v=v-1|0)+D|0])-(H=u[v+3456|0])>>8&Y|255&i,Y&=65535+(U^H)>>>8,v;);return(0|i)!=0}(s=e+32|0)&&(VB(e)||function(D){var v=0,Y=0;for(Y=127&(-1^u[D+31|0]),v=30;Y=-1^u[D+v|0]|Y,v=v-1|0;);return 1&(((255&Y)-1&236-u[0|D])>>>8^-1)}(a)&&(VB(a)||Fa(E+128|0,a)||(aa(E+384|0,f),wt(E+384|0,e,32,0),wt(E+384|0,a,32,0),wt(E+384|0,t,n,o),ag(E+384|0,E+320|0),YB(E+320|0),function(D,v,Y,U){var H;BA=H=BA-2272|0,Da(H+2016|0,v),Da(H+1760|0,U),yt(H+480|0,Y),sr(H+320|0,Y),Z0(H,H+320|0),ht(H+320|0,H,H+480|0),Z0(H+160|0,H+320|0),yt(v=H+640|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(v=H+800|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(v=H+960|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(v=H+1120|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(v=H+1280|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(v=H+1440|0,H+160|0),ht(H+320|0,H,v),Z0(H+160|0,H+320|0),yt(H+1600|0,H+160|0),Ie(D),kt(D+40|0),kt(D+80|0),U=255;A:{for(;;){if(!(u[(Y=U)+(H+2016|0)|0]|u[(H+1760|0)+Y|0])){if(U=Y-1|0,Y)continue;break A}break}if(!((0|Y)<0))for(;ce(H+320|0,D),(0|(Y=p[(v=Y)+(H+2016|0)|0]))>=1?(Z0(H+160|0,H+320|0),ht(H+320|0,H+160|0,(H+480|0)+xA((254&Y)>>>1|0,160)|0)):(0|Y)>-1||(Z0(H+160|0,H+320|0),xa(H+320|0,H+160|0,(H+480|0)+xA((0-Y&254)>>>1|0,160)|0)),(0|(Y=p[v+(H+1760|0)|0]))>=1?(Z0(H+160|0,H+320|0),WB(H+320|0,H+160|0,xA((254&Y)>>>1|0,120)+2272|0)):(0|Y)>-1||(Z0(H+160|0,H+320|0),bn(H+320|0,H+160|0,xA((0-Y&254)>>>1|0,120)+2272|0)),Qr(D,H+320|0),Y=v-1|0,(0|v)>0;);}BA=H+2272|0}(E+8|0,E+320|0,E+128|0,s),OB(E+288|0,E+8|0),_=-1,w=fn(E+288|0,e),y=((E+288|0)==(0|e)?_:w)|or(e,E+288|0,32)))),BA=E+592|0,y}function dn(e,t,n,o){var a=0,f=0;A:if(r[t>>2])f=r[e+24>>2],a=r[e+20>>2],o=o?r[t+12>>2]+(f+(-1^a)|0)|0:(f-a|0)-!r[t+12>>2]|0,f=0,(0|(t=u[t+8|0]))!=3&&(f=xA(a,t+1|0));else{if(!(a=u[t+8|0])){o=r[t+12>>2]-1|0,f=0;break A}if(a=xA(a,r[e+20>>2]),t=r[t+12>>2],o){o=(t+a|0)-1|0,f=0;break A}o=a-!t|0,f=0}return t=f+(a=o-1|0)|0,K(n,0,n,0),K(o,0,h,0),function(E,s,y){var _=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0;A:{t:{g:{r:{e:{a:{B:{C:{Q:{if(w=s){if(!(_=y))break Q;break C}return Lg=E-xA((E>>>0)/(y>>>0)|0,y)|0,xg=0,void(h=0)}if(!E)break B;break a}if(!((v=_-1|0)&_))break e;Y=0-(v=(p0(_)+33|0)-p0(w)|0)|0;break g}return Lg=0,xg=w,void(h=0)}if((_=32-p0(w)|0)>>>0<31)break r;break t}if(Lg=E&v,xg=0,(0|_)==1)break A;return y=31&(E=_?31-p0(_-1^_)|0:32),void(h=(63&E)>>>0>=32?0:s>>>y|0)}v=_+1|0,Y=63-_|0}if(_=s,D=31&(w=63&v),w>>>0>=32?(w=0,D=_>>>D|0):(w=_>>>D|0,D=((1<>>D),_=31&(Y&=63),Y>>>0>=32?(s=E<<_,E=0):(s=(1<<_)-1&E>>>32-_|s<<_,E<<=_),v)for(Y=(0|(_=y-1|0))!=-1?0:-1;D=(H=U=D<<1|s>>>31)-(i=y&(U=Y-((w=w<<1|D>>>31)+(_>>>0>>0)|0)>>31))|0,w=w-(H>>>0>>0)|0,s=s<<1|E>>>31,E=c|E<<1,c=1&U,v=v-1|0;);return Lg=D,xg=w,void(h=s<<1|E>>>31)}Lg=E,xg=s,s=0}h=s}(t-(n=h)|0,(t>>>0>>0)-(t>>>0>>0)|0,r[e+24>>2]),h=xg,Lg}function ka(e,t,n,o,a,f,E,s,y,_){var w;return BA=w=BA-352|0,fe(w+32|0,64,y,_),$t(w+96|0,w+32|0),Q0(w+32|0,64),m0(w+96|0,f,E,s),m0(w+96|0,34688,0-E&15,0),m0(w+96|0,t,n,o),m0(w+96|0,34688,0-n&15,0),q0(w+24|0,E,s),m0(w+96|0,w+24|0,8,0),q0(w+24|0,n,o),m0(w+96|0,w+24|0,8,0),Ag(w+96|0,w),Q0(w+96|0,256),a=ur(w,a),Q0(w,16),e&&(a?(L0(e,0,n),a=-1):(Pg(e,t,n,o,y,1,_),a=0)),BA=w+352|0,a}function Fn(e,t){var n,o=0,a=0,f=0;if(BA=n=BA-32|0,!(!e|!r[e+28>>2]))for(r[n+16>>2]=t,o=1;;){if(p[n+24|0]=a,t=0,f=0,o)for(;r[n+28>>2]=0,o=r[n+28>>2],r[n+8>>2]=r[n+24>>2],r[n+12>>2]=o,r[n+20>>2]=t,o=r[n+20>>2],r[n>>2]=r[n+16>>2],r[n+4>>2]=o,wn(e,n),(t=t+1|0)>>>0<(f=r[e+28>>2])>>>0;);if(o=f,(0|(a=a+1|0))==4)break}BA=n+32|0}function Ga(e,t,n,o,a,f,E,s,y,_,w){var D;return BA=D=BA-336|0,fe(D+16|0,64,_,w),$t(D+80|0,D+16|0),Q0(D+16|0,64),m0(D+80|0,E,s,y),m0(D+80|0,34688,0-s&15,0),Pg(e,o,a,f,_,1,w),m0(D+80|0,e,a,f),m0(D+80|0,34688,0-a&15,0),q0(D+8|0,s,y),m0(D+80|0,D+8|0,8,0),q0(D+8|0,a,f),m0(D+80|0,D+8|0,8,0),Ag(D+80|0,t),Q0(D+80|0,256),n&&(r[n>>2]=16,r[n+4>>2]=0),BA=D+336|0,0}function ba(e,t,n,o,a,f,E,s,y,_){var w;return BA=w=BA-352|0,hn(w+32|0,y,_),$t(w+96|0,w+32|0),Q0(w+32|0,64),m0(w+96|0,f,E,s),q0(w+24|0,E,s),m0(w+96|0,w+24|0,8,0),m0(w+96|0,t,n,o),q0(w+24|0,n,o),m0(w+96|0,w+24|0,8,0),Ag(w+96|0,w),Q0(w+96|0,256),a=ur(w,a),Q0(w,16),e&&(a?(L0(e,0,n),a=-1):(rn(e,t,n,o,y,_),a=0)),BA=w+352|0,a}function Ut(e){var t=0,n=0,o=0;A:{t:if(3&(t=e)){if(!u[0|e])return 0;for(;;){if(!(3&(t=t+1|0)))break t;if(!u[0|t])break}break A}for(;n=t,t=t+4|0,!((-1^(o=r[n>>2]))&o-16843009&-2139062144););if(!(255&o))return n-e|0;for(;o=u[n+1|0],n=t=n+1|0,o;);}return t-e|0}function nr(e,t){var n,o=0,a=0,f=0,E=0,s=0;A:if(!(((n=u[0|e])-48&255)>>>0>9)){for(a=n,o=e;;){if(E=o,f>>>0>429496729||(a=(255&a)-48|0)>>>0>(-1^(o=xA(f,10)))>>>0)break A;if(f=o+a|0,!(((a=u[0|(o=E+1|0)])-48&255)>>>0<10))break}(0|e)==(0|o)|((0|n)==48?(0|e)!=(0|E):0)||(r[t>>2]=f,s=o)}return s}function Sa(e,t){var n,o,a,f,E,s,y,_,w;n=r[t+4>>2],o=r[t+8>>2],a=r[t+12>>2],f=r[t+16>>2],E=r[t+20>>2],s=r[t+24>>2],y=r[t+28>>2],_=r[t+32>>2],w=r[t+36>>2],r[e>>2]=0-r[t>>2],r[e+36>>2]=0-w,r[e+32>>2]=0-_,r[e+28>>2]=0-y,r[e+24>>2]=0-s,r[e+20>>2]=0-E,r[e+16>>2]=0-f,r[e+12>>2]=0-a,r[e+8>>2]=0-o,r[e+4>>2]=0-n}function mn(e,t,n){var o=0;o=t<<8&16711680|t<<24,o|=255&(n<<8|t>>>24)|65280&(n<<24|t>>>8),t=-16777216&((255&n)<<24|t>>>8)|16711680&((16777215&n)<<8|t>>>24)|n>>>8&65280|n>>>24|0,p[0|e]=t,p[e+1|0]=t>>>8,p[e+2|0]=t>>>16,p[e+3|0]=t>>>24,t=o,p[e+4|0]=t,p[e+5|0]=t>>>8,p[e+6|0]=t>>>16,p[e+7|0]=t>>>24}function Ya(e,t,n){var o;o=e,n?(r[e+48>>2]=u[0|n]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24,n=u[n+4|0]|u[n+5|0]<<8|u[n+6|0]<<16|u[n+7|0]<<24):(r[e+48>>2]=0,n=0),r[o+52>>2]=n,r[e+56>>2]=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,r[e+60>>2]=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24}function dg(e,t){var n,o,a,f,E,s,y,_,w;n=r[t+8>>2],o=r[t+12>>2],a=r[t+16>>2],f=r[t+20>>2],E=r[t+24>>2],s=r[t+28>>2],y=r[t>>2],_=r[t+4>>2],w=r[t+36>>2],r[e+32>>2]=r[t+32>>2],r[e+36>>2]=w,r[e+24>>2]=E,r[e+28>>2]=s,r[e+16>>2]=a,r[e+20>>2]=f,r[e+8>>2]=n,r[e+12>>2]=o,r[e>>2]=y,r[e+4>>2]=_}function Ha(e,t,n,o,a,f,E,s,y,_,w){var D;return BA=D=BA-48|0,r[D+8>>2]=0,r[D>>2]=0,r[D+4>>2]=0,gr(D+16|0,_,w),w=u[_+16|0]|u[_+17|0]<<8|u[_+18|0]<<16|u[_+19|0]<<24,_=u[_+20|0]|u[_+21|0]<<8|u[_+22|0]<<16|u[_+23|0]<<24,r[D+4>>2]=w,r[D+8>>2]=_,function(v,Y,U,H,i,c,N,l,F,b,V){var W;BA=W=BA-336|0,ia(W+16|0,64,b,V),$t(W+80|0,W+16|0),Q0(W+16|0,64),m0(W+80|0,N,l,F),m0(W+80|0,34704,0-l&15,0),$B(v,H,i,c,b,1,V),m0(W+80|0,v,i,c),m0(W+80|0,34704,0-i&15,0),q0(W+8|0,l,F),m0(W+80|0,W+8|0,8,0),q0(W+8|0,i,c),m0(W+80|0,W+8|0,8,0),Ag(W+80|0,Y),Q0(W+80|0,256),U&&(r[U>>2]=16,r[U+4>>2]=0),BA=W+336|0}(e,t,n,o,a,f,E,s,y,D,D+16|0),Q0(D+16|0,32),BA=D+48|0,0}function Na(e,t,n,o,a,f,E,s,y,_){var w;return BA=w=BA-48|0,r[w+8>>2]=0,r[w>>2]=0,r[w+4>>2]=0,gr(w+16|0,y,_),_=u[y+16|0]|u[y+17|0]<<8|u[y+18|0]<<16|u[y+19|0]<<24,y=u[y+20|0]|u[y+21|0]<<8|u[y+22|0]<<16|u[y+23|0]<<24,r[w+4>>2]=_,r[w+8>>2]=y,e=function(D,v,Y,U,H,i,c,N,l,F){var b;return BA=b=BA-352|0,ia(b+32|0,64,l,F),$t(b+96|0,b+32|0),Q0(b+32|0,64),m0(b+96|0,i,c,N),m0(b+96|0,34704,0-c&15,0),m0(b+96|0,v,Y,U),m0(b+96|0,34704,0-Y&15,0),q0(b+24|0,c,N),m0(b+96|0,b+24|0,8,0),q0(b+24|0,Y,U),m0(b+96|0,b+24|0,8,0),Ag(b+96|0,b),Q0(b+96|0,256),H=ur(b,H),Q0(b,16),D&&(H?(L0(D,0,Y),H=-1):($B(D,v,Y,U,l,1,F),H=0)),BA=b+352|0,H}(e,t,n,o,a,f,E,s,w,w+16|0),Q0(w+16|0,32),BA=w+48|0,e}function vn(e){var t;return t=u[0|e]|u[e+1|0]<<8|u[e+2|0]<<16|u[e+3|0]<<24,e=u[e+4|0]|u[e+5|0]<<8|u[e+6|0]<<16|u[e+7|0]<<24,h=65280&(e<<24|t>>>8)|255&(e<<8|t>>>24)|t<<8&16711680|t<<24,-16777216&((255&e)<<24|t>>>8)|16711680&((16777215&e)<<8|t>>>24)|e>>>8&65280|e>>>24|0}function Ua(e,t,n,o,a,f,E,s,y,_,w){var D;return BA=D=BA-336|0,hn(D+16|0,_,w),$t(D+80|0,D+16|0),Q0(D+16|0,64),m0(D+80|0,E,s,y),q0(D+8|0,s,y),m0(D+80|0,D+8|0,8,0),rn(e,o,a,f,_,w),m0(D+80|0,e,a,f),q0(D+8|0,a,f),m0(D+80|0,D+8|0,8,0),Ag(D+80|0,t),Q0(D+80|0,256),n&&(r[n>>2]=16,r[n+4>>2]=0),BA=D+336|0,0}function Ma(e,t,n,o){var a;if(BA=a=BA-192|0,!(!n|(t-1&255)>>>0>=64|(o-1&255)>>>0>=64))return lA[a+130>>1]=257,p[a+129|0]=o,p[a+128|0]=t,ga(a+128|4),q0(a+128|8,0,0),L0(a+144|0,0,48),XB(e,a+128|0),L0(o+a|0,0,128-o|0),Ee(t=e,e=V0(a,n,o),128,0),Q0(e,128),BA=e+192|0,0;z0(),s0()}function Ra(e,t,n){r[e+48>>2]=n?u[0|n]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24:0,r[e+52>>2]=u[0|t]|u[t+1|0]<<8|u[t+2|0]<<16|u[t+3|0]<<24,r[e+56>>2]=u[t+4|0]|u[t+5|0]<<8|u[t+6|0]<<16|u[t+7|0]<<24,r[e+60>>2]=u[t+8|0]|u[t+9|0]<<8|u[t+10|0]<<16|u[t+11|0]<<24}function La(e,t,n,o,a,f,E){var s;return BA=s=BA-16|0,e=L0(e,0,128),E>>>0<2147483649&&!(o|f)?E>>>0>8191&&a|f?(vt(s,16),e=se(a,E>>>10|0,1,t,n,s,16,0,32,e,128,2)?-1:0):(r[8960]=28,e=-1):(r[8960]=22,e=-1),BA=s+16|0,e}function kn(e){var t=0;return(0-(t=e+4&(e+65488>>>8^-1)&(57-e>>>8^-1)&255|((t=e-65|0)>>>8^-1)&t&(90-e>>>8^-1)&255|e+185&(e+65439>>>8^-1)&(122-e>>>8^-1)&255|63&(1+(16288^e)>>>8^-1)|62&(1+(16338^e)>>>8^-1))>>>8^-1)&1+(65470^e)>>>8&255|t}function Gn(e){var t=0;return(0-(t=e+4&(e+65488>>>8^-1)&(57-e>>>8^-1)&255|((t=e-65|0)>>>8^-1)&t&(90-e>>>8^-1)&255|e+185&(e+65439>>>8^-1)&(122-e>>>8^-1)&255|63&(1+(16336^e)>>>8^-1)|62&(1+(16340^e)>>>8^-1))>>>8^-1)&1+(65470^e)>>>8&255|t}function ir(e,t){var n,o,a=0,f=0,E=0,s=0;for(BA=n=BA-16|0,a=10;s=a,E=(t>>>0)/10|0,p[0|(f=(a=a-1|0)+(n+6|0)|0)]=t-xA(E,10)|48,!(t>>>0<10)&&(t=E,a););o=V0(t=e,f,e=11-s|0)+e|0,p[0|o]=0,BA=n+16|0}function Mt(e,t,n){var o=0,a=0,f=0;if(!n)return 0;A:if(o=u[0|e]){for(;;){if((0|(a=u[0|t]))==(0|o)&&!(!(n=n-1|0)|!a)){if(t=t+1|0,o=u[e+1|0],e=e+1|0,o)continue;break A}break}f=o}return(255&f)-u[0|t]|0}function ht(e,t,n){var o,a,f,E=0;BA=a=BA-48|0,O0(e,E=t+40|0,t),$0(o=e+40|0,E,t),_0(E=e+80|0,e,n),_0(o,o,n+40|0),_0(f=e+120|0,n+120|0,t+120|0),_0(e,t+80|0,n+80|0),O0(a,e,e),$0(e,E,o),O0(o,E,o),O0(E,a,f),$0(f,a,f),BA=a+48|0}function xa(e,t,n){var o,a,f,E=0;BA=a=BA-48|0,O0(e,E=t+40|0,t),$0(o=e+40|0,E,t),_0(E=e+80|0,e,n+40|0),_0(o,o,n),_0(f=e+120|0,n+120|0,t+120|0),_0(e,t+80|0,n+80|0),O0(a,e,e),$0(e,E,o),O0(o,E,o),$0(E,a,f),O0(f,a,f),BA=a+48|0}function Ja(e,t){for(var n=0,o=0,a=0,f=0;a=(n=o<<3)+e|0,f=u[0|(n=t+n|0)]|u[n+1|0]<<8|u[n+2|0]<<16|u[n+3|0]<<24,n=u[n+4|0]|u[n+5|0]<<8|u[n+6|0]<<16|u[n+7|0]<<24,r[a>>2]=f,r[a+4>>2]=n,(0|(o=o+1|0))!=128;);}function Pa(e,t,n){var o;if(r[12+(o=BA-16|0)>>2]=e,r[o+8>>2]=t,t=0,r[o+4>>2]=0,(0|n)>=1)for(;r[o+4>>2]=r[o+4>>2]|u[r[o+8>>2]+t|0]^u[r[o+12>>2]+t|0],(0|n)!=(0|(t=t+1|0)););return(r[o+4>>2]-1>>>8&1)-1|0}function bn(e,t,n){var o,a,f,E=0;BA=a=BA-48|0,O0(e,E=t+40|0,t),$0(o=e+40|0,E,t),_0(E=e+80|0,e,n+40|0),_0(o,o,n),_0(f=e+120|0,n+80|0,t+120|0),O0(a,t=t+80|0,t),$0(e,E,o),O0(o,E,o),$0(E,a,f),O0(f,a,f),BA=a+48|0}function WB(e,t,n){var o,a,f,E=0;BA=a=BA-48|0,O0(e,E=t+40|0,t),$0(o=e+40|0,E,t),_0(E=e+80|0,e,n),_0(o,o,n+40|0),_0(f=e+120|0,n+80|0,t+120|0),O0(a,t=t+80|0,t),$0(e,E,o),O0(o,E,o),O0(E,a,f),$0(f,a,f),BA=a+48|0}function or(e,t,n){var o;if(r[12+(o=BA-16|0)>>2]=e,r[o+8>>2]=t,t=0,p[o+7|0]=0,n)for(;p[o+7|0]=u[o+7|0]|u[r[o+8>>2]+t|0]^u[r[o+12>>2]+t|0],(0|n)!=(0|(t=t+1|0)););return(u[o+7|0]-1>>>8&1)-1|0}function Ka(e,t,n){var o,a=0,f=0;if(BA=o=BA-16|0,p[o+15|0]=0,f=-1,!(0|Ct[r[8950]](e,t,n))){for(;p[o+15|0]=u[e+a|0]|u[o+15|0],(0|(a=a+1|0))!=32;);f=0-(u[o+15|0]-1>>>8&1)|0}return BA=o+16|0,f}function ce(e,t){var n,o,a,f,E;BA=o=BA-48|0,k0(e,t),k0(n=e+80|0,E=t+40|0),function(s,y){var _,w,D,v,Y,U,H,i,c,N,l,F,b,V,W,O,z,tA,AA,gA,aA,iA,hA,yA,fA,_A,wA,mA,bA,RA,j,rA,YA,SA,NA,VA,XA,g0,$=0,cA=0,zA=0,ZA=0,t0=0,r0=0,o0=0,E0=0,B0=0,n0=0,X=0,eA=0,CA=0,h0=0,I0=0,w0=0,d0=0,S0=0,Y0=0,T0=0;Y=$=(t0=r[y+12>>2])<<1,U=$>>31,H=$=(B0=r[y+4>>2])<<1,$=K(Y,U,$,_=$>>31),zA=h,cA=$,iA=$=h0=r[y+8>>2],ZA=K($,n0=$>>31,$,n0),$=h+zA|0,$=(cA=cA+ZA|0)>>>0>>0?$+1|0:$,ZA=cA,w=cA=I0=r[y+16>>2],i=cA>>31,c=cA=(w0=r[y>>2])<<1,zA=K(w,i,cA,D=cA>>31),$=h+$|0,$=(cA=ZA+zA|0)>>>0>>0?$+1|0:$,o0=cA,zA=r[y+28>>2],AA=cA=xA(zA,38),bA=zA,ZA=K(cA,O=cA>>31,zA,hA=zA>>31),$=h+$|0,$=(cA=o0+ZA|0)>>>0>>0?$+1|0:$,r0=cA,o0=r[y+32>>2],E0=K(l=cA=xA(o0,19),F=cA>>31,cA=(ZA=r[y+24>>2])<<1,cA>>31),cA=h+$|0,cA=E0>>>0>(X=r0+E0|0)>>>0?cA+1|0:cA,r0=X,CA=r[y+36>>2],N=$=xA(CA,38),v=$>>31,z=y=(X=r[y+20>>2])<<1,E0=K($,v,y,V=y>>31),y=h+cA|0,yA=($=r0+E0|0)<<1,SA=$=($>>>0>>0?y+1|0:y)<<1|$>>>31,RA=y=yA+33554432|0,NA=$=y>>>0<33554432?$+1|0:$,y=$>>26,$=(67108863&$)<<6|RA>>>26,cA=K(H,_,w,i),E0=h,r0=$,tA=$=h0<<1,d0=t0,t0=K($,W=$>>31,t0,fA=t0>>31),$=h+E0|0,$=(cA=t0+cA|0)>>>0>>0?$+1|0:$,h0=X,t0=(E0=K(X,gA=X>>31,c,D))+cA|0,cA=h+$|0,cA=t0>>>0>>0?cA+1|0:cA,I0=t0,j=$=zA<<1,t0=K(l,F,$,_A=$>>31),$=h+cA|0,$=(zA=I0+t0|0)>>>0>>0?$+1|0:$,cA=zA,t0=ZA,zA=K(N,v,ZA,b=ZA>>31),$=h+$|0,$=(cA=cA+zA|0)>>>0>>0?$+1|0:$,zA=cA,y=y+(cA=$<<1|cA>>>31)|0,S0=$=r0+(zA<<=1)|0,$=$>>>0>>0?y+1|0:y,VA=y=S0+16777216|0,y=(33554431&($=y>>>0<16777216?$+1|0:$))<<7|y>>>25,zA=$>>25,$=K(Y,U,d0,fA),cA=h,r0=y,y=(E0=K(w,i,tA,W))+$|0,$=h+cA|0,$=y>>>0>>0?$+1|0:$,cA=K(H,_,z,V),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=(E0=K(c,D,ZA,b))+y|0,y=h+$|0,y=cA>>>0>>0?y+1|0:y,E0=o0,o0=K(l,F,o0,aA=o0>>31),$=h+y|0,$=(cA=o0+cA|0)>>>0>>0?$+1|0:$,y=(o0=K(N,v,j,_A))+cA|0,cA=h+$|0,y=(($=y)>>>0>>0?cA+1|0:cA)<<1|$>>>31,o0=$<<1,$=y+zA|0,$=(cA=r0+o0|0)>>>0>>0?$+1|0:$,Y0=cA=(y=cA)+33554432|0,zA=$=cA>>>0<33554432?$+1|0:$,$=-67108864&cA,r[s+24>>2]=y-$,o0=s,y=K(y=xA(X,38),y>>31,X,gA),$=h,r0=y,X=K(y=w0,cA=y>>31,y,cA),cA=h+$|0,cA=(y=r0+X|0)>>>0>>0?cA+1|0:cA,$=y,eA=y=xA(ZA,19),wA=y>>31,rA=y=w<<1,y=$+(ZA=K(eA,wA,y,mA=y>>31))|0,$=h+cA|0,$=y>>>0>>0?$+1|0:$,cA=K(Y,U,AA,O),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=(ZA=K(l,F,tA,W))+y|0,y=h+$|0,y=cA>>>0>>0?y+1|0:y,ZA=K(H,_,N,v),$=h+y|0,XA=$=((y=cA=ZA+cA|0)>>>0>>0?$+1|0:$)<<1|y>>>31,w0=y=33554432+(X=y<<1)|0,I0=cA=y>>>0<33554432?$+1|0:$,y=(67108863&cA)<<6|y>>>26,ZA=cA>>26,$=K(eA,wA,z,V),cA=h,T0=y,y=(B0=K(c,D,r0=B0,YA=r0>>31))+$|0,$=h+cA|0,$=y>>>0>>0?$+1|0:$,cA=(B0=K(w,i,AA,O))+y|0,y=h+$|0,y=cA>>>0>>0?y+1|0:y,B0=K(l,F,Y,U),$=h+y|0,$=(cA=B0+cA|0)>>>0>>0?$+1|0:$,y=(B0=K(N,v,iA,n0))+cA|0,cA=h+$|0,y=(($=y)>>>0>>0?cA+1|0:cA)<<1|$>>>31,B0=$<<1,$=y+ZA|0,$=(cA=T0+B0|0)>>>0>>0?$+1|0:$,B0=cA,(y=cA+16777216|0)>>>0<16777216&&($=$+1|0),T0=y,cA=y,y=$>>25,$=(33554431&$)<<7|cA>>>25,ZA=y,y=K(c,D,iA,n0),cA=h,g0=$,r0=K(H,_,r0,YA),$=h+cA|0,$=(y=r0+y|0)>>>0>>0?$+1|0:$,r0=K(eA,wA,t0,b),cA=h+$|0,cA=(y=r0+y|0)>>>0>>0?cA+1|0:cA,r0=K(z,V,AA,O),$=h+cA|0,$=(y=r0+y|0)>>>0>>0?$+1|0:$,cA=K(l,F,rA,mA),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=(r0=K(N,v,Y,U))+y|0,y=h+$|0,$=($=(y=cA>>>0>>0?y+1|0:y)<<1|cA>>>31)+ZA|0,cA=$=(y=g0+(cA<<=1)|0)>>>0>>0?$+1|0:$,r0=$=y+33554432|0,ZA=cA=$>>>0<33554432?cA+1|0:cA,$&=-67108864,r[o0+8>>2]=y-$,y=K(tA,W,h0,gA),cA=h,$=(eA=K(w,i,Y,U))+y|0,y=h+cA|0,y=$>>>0>>0?y+1|0:y,cA=(eA=K(H,_,t0,b))+$|0,$=h+y|0,$=cA>>>0>>0?$+1|0:$,y=(eA=K(c,D,bA,hA))+cA|0,cA=h+$|0,cA=y>>>0>>0?cA+1|0:cA,eA=K(N,v,E0,aA),$=h+cA|0,$=($=($=(y=eA+y|0)>>>0>>0?$+1|0:$)<<1|y>>>31)+(cA=zA>>26)|0,cA=y=(zA=(67108863&zA)<<6|Y0>>>26)+(y<<1)|0,y=$=y>>>0>>0?$+1|0:$,Y0=$=cA+16777216|0,zA=y=$>>>0<16777216?y+1|0:y,y=-33554432&$,r[o0+28>>2]=cA-y,y=K(c,D,d0,fA),$=h,cA=K(H,_,iA,n0),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=K(t0,b,AA,O),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=(n0=K(l,F,z,V))+y|0,y=h+$|0,y=cA>>>0>>0?y+1|0:y,$=(n0=K(N,v,w,i))+cA|0,cA=h+y|0,y=$,$=($>>>0>>0?cA+1|0:cA)<<1|$>>>31,cA=y<<1,$=(y=ZA>>26)+$|0,$=(cA=cA+(ZA=(67108863&ZA)<<6|r0>>>26)|0)>>>0>>0?$+1|0:$,d0=cA=(y=cA)+16777216|0,ZA=$=cA>>>0<16777216?$+1|0:$,$=-33554432&cA,r[o0+12>>2]=y-$,n0=s,y=K(t0,b,tA,W),$=h,cA=K(w,i,w,i),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=K(Y,U,z,V),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=K(H,_,j,_A),$=h+$|0,$=(y=cA+y|0)>>>0>>0?$+1|0:$,cA=(o0=K(c,D,E0,aA))+y|0,y=h+$|0,y=cA>>>0>>0?y+1|0:y,$=(CA=K(N,v,o0=CA,r0=o0>>31))+cA|0,cA=h+y|0,s=(y=$)<<1,$=(y=zA>>25)+($=($>>>0>>0?cA+1|0:cA)<<1|$>>>31)|0,$=(cA=s+(zA=(33554431&zA)<<7|Y0>>>25)|0)>>>0>>0?$+1|0:$,CA=cA=(y=cA)+33554432|0,zA=$=cA>>>0<33554432?$+1|0:$,$=-67108864&cA,r[n0+32>>2]=y-$,$=ZA>>25,cA=(ZA=(33554431&ZA)<<7|d0>>>25)+(yA-(y=-67108864&RA)|0)|0,y=$+(SA-((y>>>0>yA>>>0)+NA|0)|0)|0,$=y=cA>>>0>>0?y+1|0:y,ZA=y=cA+33554432|0,y=((67108863&($=y>>>0<33554432?$+1|0:$))<<6|y>>>26)+(S0=S0-(-33554432&VA)|0)|0,r[n0+20>>2]=y,y=-67108864&ZA,r[n0+16>>2]=cA-y,y=K(Y,U,t0,b),cA=h,$=(t0=K(h0,gA,rA,mA))+y|0,y=h+cA|0,y=$>>>0>>0?y+1|0:y,cA=(t0=K(tA,W,bA,hA))+$|0,$=h+y|0,$=cA>>>0>>0?$+1|0:$,y=(t0=K(H,_,E0,aA))+cA|0,cA=h+$|0,cA=y>>>0>>0?cA+1|0:cA,t0=K(c,D,o0,r0),$=h+cA|0,$=($=($=(y=t0+y|0)>>>0>>0?$+1|0:$)<<1|y>>>31)+(cA=zA>>26)|0,$=(y=(zA=(67108863&zA)<<6|CA>>>26)+(y<<1)|0)>>>0>>0?$+1|0:$,cA=y,zA=y,y=$,y=($=cA+16777216|0)>>>0<16777216?y+1|0:y,cA=-33554432&$,r[n0+36>>2]=zA-cA,ZA=B0-(-33554432&T0)|0,y=($=K((33554431&y)<<7|$>>>25,y>>25,19,0))+(X-(cA=-67108864&w0)|0)|0,cA=h+(XA-((cA>>>0>X>>>0)+I0|0)|0)|0,cA=y>>>0<$>>>0?cA+1|0:cA,$=y,y=cA,y=((67108863&(y=(cA=$+33554432|0)>>>0<33554432?y+1|0:y))<<6|cA>>>26)+ZA|0,r[n0+4>>2]=y,s=-67108864&cA,r[n0>>2]=$-s}(f=e+120|0,t+80|0),O0(a=e+40|0,t,E),k0(o,a),O0(a,n,e),$0(n,n,e),$0(e,o,a),$0(f,f,n),BA=o+48|0}function Fg(e){var t,n;return(e=(t=r[8943])+(n=e+3&-4)|0)>>>0<=t>>>0&&(0|n)>=1||e>>>0>In()<<16>>>0&&!(0|un(0|e))?(r[8960]=48,-1):(r[8943]=e,t)}function qa(e,t){var n;return BA=n=BA+-64|0,(t-1&255)>>>0>=64&&(z0(),s0()),p[n+3|0]=1,p[n+1|0]=0,p[n+2|0]=1,p[0|n]=t,ga(4|n),q0(8|n,0,0),L0(n+16|0,0,48),XB(e,n),BA=n- -64|0,0}function Pg(e,t,n,o,a,f,E){var s=0,y=0;s=o,(((s=(y=n+63|0)>>>0<63?s+1|0:s)>>>6|0)+((0|(s=(63&s)<<26|y>>>6))!=0)|0)==1&(y=0-s|0)>>>0>>0&&(z0(),s0()),$B(e,t,n,o,a,f,E)}function Kg(e,t){for(var n=0,o=0,a=0,f=0;o=(n=a<<3)+e|0,f=r[(n=t+n|0)>>2],n=r[o+4>>2]^r[n+4>>2],r[o>>2]=r[o>>2]^f,r[o+4>>2]=n,(0|(a=a+1|0))!=128;);}function Ta(e){var t,n;return 95&(1+(32704^e)>>>8^-1)|45&(1+(16321^e)>>>8^-1)|(t=e+65510>>>8&255)&e+65|(n=e+65484>>>8|0)&e+71&(255^t)|e+252&e+65474>>>8&(-1^n)&255}function Va(e){var t,n;return 47&(1+(16320^e)>>>8^-1)|43&(1+(16321^e)>>>8^-1)|(t=e+65510>>>8&255)&e+65|(n=e+65484>>>8|0)&e+71&(255^t)|e+252&e+65474>>>8&(-1^n)&255}function Cr(e,t,n,o){var a=0;a=-1;A:if(!(n>>>0>64|o-1>>>0>63)){t:{if((!n||!t)&&!qa(e,255&o))break t;if(Ma(e,255&o,t,255&n))break A}a=0}return a}function OB(e,t){var n,o,a;BA=n=BA-144|0,er(n+96|0,t+80|0),_0(n+48|0,t,n+96|0),_0(n,t+40|0,n+96|0),Jg(e,n),o=e,a=an(n+48|0)<<7^u[e+31|0],p[o+31|0]=a,BA=n+144|0}function jB(e,t){var n,o=0;if(p[15+(n=BA-16|0)|0]=0,t)for(;p[n+15|0]=u[e+o|0]|u[n+15|0],(0|(o=o+1|0))!=(0|t););return u[n+15|0]-1>>>8&1}function qA(e,t,n,o){var a;return o=t+o|0,o=(a=e+n|0)>>>0>>0?o+1|0:o,n=K(e<<1&-2,1&(t=t<<1|e>>>31),n,0),e=h+o|0,h=e=(t=n+a|0)>>>0>>0?e+1|0:e,t}function Xa(e,t,n){var o,a=0;if(o=n>>>3|0)for(n=0;mn((a=n<<3)+e|0,r[(a=t+a|0)>>2],r[a+4>>2]),(0|o)!=(0|(n=n+1|0)););}function Wa(e,t){var n=0;(function(o,a){a&&((a=r[o>>2])&&Q0(r[a+4>>2],r[o+16>>2]<<10),(a=r[o+4>>2])&&Q0(a,r[o+20>>2]<<3))})(e,4&t),ot(r[e+4>>2]),r[e+4>>2]=0,(t=r[e>>2])&&(n=r[t>>2])&&ot(n),ot(t),r[e>>2]=0}function q0(e,t,n){p[0|e]=t,p[e+1|0]=t>>>8,p[e+2|0]=t>>>16,p[e+3|0]=t>>>24,p[e+4|0]=n,p[e+5|0]=n>>>8,p[e+6|0]=n>>>16,p[e+7|0]=n>>>24}function Q0(e,t){var n;if(r[12+(n=BA-16|0)>>2]=e,t)for(e=0;p[r[n+12>>2]+e|0]=0,(0|t)!=(0|(e=e+1|0)););}function vt(e,t){e|=0;var n=0,o=0,a=0;if(t|=0)for(;o=e+n|0,a=zB(),p[0|o]=a,(0|(n=n+1|0))!=(0|t););}function Oa(e,t,n,o,a){var f,E;return e|=0,t|=0,n|=0,o|=0,BA=f=(E=BA)-128&-64,pa(f,a|=0),_a(f,t,n,o),ua(f,e),BA=E,0}function ja(e){var t=0,n=0,o=0;for(t=1;t=u[0|(o=e+n|0)]+t|0,p[0|o]=t,t=t>>>8|0,(0|(n=n+1|0))!=4;);}function Za(e,t,n,o,a,f,E,s){var y,_=0;return BA=y=BA-32|0,_=-1,ea(y,E,s)||(_=fr(e,t,n,o,a,f,y),Q0(y,32)),BA=y+32|0,_}function za(e,t,n,o,a,f,E,s){var y,_=0;return BA=y=BA-32|0,_=-1,ea(y,E,s)||(_=Ir(e,t,n,o,a,f,y),Q0(y,32)),BA=y+32|0,_}function Z0(e,t){var n,o,a;_0(e,t,n=t+120|0),_0(e+40|0,o=t+40|0,a=t+80|0),_0(e+80|0,a,n),_0(e+120|0,t,o)}function $a(e,t,n,o,a,f,E){return!o&n>>>0>=16|o?za(e,t+16|0,t,n-16|0,o-(n>>>0<16)|0,a,f,E):-1}function An(e,t){for(var n=0,o=0;p[0|(o=e+n|0)]=u[0|o]^u[t+n|0],(0|(n=n+1|0))!=8;);}function tn(e,t,n){var o,a;BA=o=(a=BA)-384&-64,cr(o,0,0,24),zt(o,t,32,0),zt(o,n,32,0),hr(o,e,24),BA=a}function yt(e,t){var n;O0(e,n=t+40|0,t),$0(e+40|0,n,t),dg(e+80|0,t+80|0),_0(e+120|0,t+120|0,2224)}function ZB(e,t,n,o,a,f,E){return t-1>>>0>63|E>>>0>64?-1:function(s,y,_,w,D,v,Y){var U,H=0;if(U=H=BA,BA=H=H-384&-64,!(!s|(w-1&255)>>>0>=64|(D|v?!y:0)|Y>>>0>=65|(Y?!_:0)))return Y?Ma(H,w,_,Y):qa(H,w),Ee(H,y,D,v),UB(H,s,w),BA=U,0;z0(),s0()}(e,n,f,255&t,o,a,255&E)}function gn(e,t,n,o,a,f,E){return!o&n>>>0>=4294967280|o&&(z0(),s0()),Za(e+16|0,e,t,n,o,a,f,E)}function Qr(e,t){var n;_0(e,t,n=t+120|0),_0(e+40|0,t+40|0,t=t+80|0),_0(e+80|0,t,n)}function U0(e){var t;return t=u[0|e]|u[e+1|0]<<8,e=u[e+2|0],h=e>>>16|0,t|e<<16}function zB(){var e,t;return BA=e=BA-16|0,p[e+15|0]=0,t=0|N0(1024,e+15|0,0),BA=e+16|0,0|t}function en(e,t,n,o,a){var f;return BA=f=BA-416|0,function(E,s){var y,_=0,w=0;for(BA=y=BA-192|0,ye(E),L0(y- -64|0,54,128),p[y+64|0]=54^u[0|s],_=1;p[0|(w=(y- -64|0)+_|0)]=u[0|w]^u[s+_|0],(0|(_=_+1|0))!=32;);for(wt(E,y- -64|0,128,0),ye(E=E+208|0),L0(y- -64|0,92,128),p[y+64|0]=92^u[0|s],_=1;p[0|(w=(y- -64|0)+_|0)]=u[0|w]^u[s+_|0],(0|(_=_+1|0))!=32;);wt(E,y- -64|0,128,0),Q0(y- -64|0,128),Q0(y,64),BA=y+192|0}(f,a),wt(f,t,n,o),function(E,s){var y,_=0;BA=y=BA+-64|0,function(w,D){var v;BA=v=BA+-64|0,ag(w,v),wt(w=w+208|0,v,64,0),ag(w,D),Q0(v,64),BA=v- -64|0}(E,y),_=r[y+28>>2],E=r[y+24>>2],p[s+24|0]=E,p[s+25|0]=E>>>8,p[s+26|0]=E>>>16,p[s+27|0]=E>>>24,p[s+28|0]=_,p[s+29|0]=_>>>8,p[s+30|0]=_>>>16,p[s+31|0]=_>>>24,_=r[y+20>>2],E=r[y+16>>2],p[s+16|0]=E,p[s+17|0]=E>>>8,p[s+18|0]=E>>>16,p[s+19|0]=E>>>24,p[s+20|0]=_,p[s+21|0]=_>>>8,p[s+22|0]=_>>>16,p[s+23|0]=_>>>24,_=r[y+12>>2],E=r[y+8>>2],p[s+8|0]=E,p[s+9|0]=E>>>8,p[s+10|0]=E>>>16,p[s+11|0]=E>>>24,p[s+12|0]=_,p[s+13|0]=_>>>8,p[s+14|0]=_>>>16,p[s+15|0]=_>>>24,_=r[y+4>>2],E=r[y>>2],p[0|s]=E,p[s+1|0]=E>>>8,p[s+2|0]=E>>>16,p[s+3|0]=E>>>24,p[s+4|0]=_,p[s+5|0]=_>>>8,p[s+6|0]=_>>>16,p[s+7|0]=_>>>24,BA=y- -64|0}(f,e),BA=f+416|0,0}function he(e,t,n,o){var a;return BA=a=BA-208|0,ye(a),wt(a,t,n,o),ag(a,e),BA=a+208|0,0}function pt(e,t){var n=0;return(-1>>>(n=31&t)&e)<>>e}function ag(e,t){var n;BA=n=BA-704|0,function(o,a){var f,E=0;(f=r[o+72>>2]>>>3&127)>>>0<=111?V0(80+(o+f|0)|0,35424,112-f|0):(V0((E=o+80|0)+f|0,35424,128-f|0),Ar(o,E,a,a+640|0),L0(E,0,112)),Xa(o+192|0,o- -64|0,16),Ar(o,o+80|0,a,a+640|0)}(e,n),Xa(t,e,64),Q0(n,704),Q0(e,208),BA=n+704|0}function $B(e,t,n,o,a,f,E){(0|o)==1|o>>>0>1&&(z0(),s0()),Ct[r[8957]](e,t,n,o,a,f,E)}function rn(e,t,n,o,a,f){(0|o)==1|o>>>0>1&&(z0(),s0()),Ct[r[8956]](e,t,n,o,a,1,0,f)}function ye(e){r[e+64>>2]=0,r[e+68>>2]=0,r[e+72>>2]=0,r[e+76>>2]=0,V0(e,34720,64)}function Er(e,t,n){return n>>>0>=256&&(D0(2016,2036,107,2089),s0()),UB(e,t,255&n)}function Bn(){var e;BA=e=BA-16|0,p[e+15|0]=0,N0(1062,e+15|0,0),BA=e+16|0}function Aa(e){var t;return BA=t=BA-32|0,Jg(t,e),e=jB(t,32),BA=t+32|0,e}function sr(e,t){var n;BA=n=BA-128|0,function(o,a){dg(o,a),dg(o+40|0,a+40|0),dg(o+80|0,a+80|0)}(n+8|0,t),ce(e,n+8|0),BA=n+128|0}function y0(e,t){p[0|e]=t,p[e+1|0]=t>>>8,p[e+2|0]=t>>>16,p[e+3|0]=t>>>24}function Zt(e,t,n){TB(e,t,n),TB(e+40|0,t+40|0,n),TB(e+80|0,t+80|0,n)}function an(e){var t;return BA=t=BA-32|0,Jg(t,e),BA=t+32|0,1&p[0|t]}function cr(e,t,n,o){return 0|Cr(e|=0,t|=0,n|=0,o|=0)}function ta(e){p[e+32|0]=1,p[e+33|0]=0,p[e+34|0]=0,p[e+35|0]=0}function nn(e){r[e>>2]=0,r[e+4>>2]=0,r[e+8>>2]=0,r[e+12>>2]=0}function ga(e){p[0|e]=0,p[e+1|0]=0,p[e+2|0]=0,p[e+3|0]=0}function hr(e,t,n){return 0|Er(e|=0,t|=0,n|=0)}function ea(e,t,n){return 0|function(o,a,f){var E,s=0;return BA=E=BA-32|0,s=-1,Ka(E,f,a)||(s=LB(o,35552,E)),BA=E+32|0,s}(e|=0,t|=0,n|=0)}function ra(e,t,n){return 0|Ka(e|=0,t|=0,n|=0)}function z0(){var e;(e=r[9105])&&Ct[0|e](),W0(),s0()}function on(e){Ie(e),kt(e+40|0),kt(e+80|0),Ie(e+120|0)}function Ba(e,t,n,o,a,f){Ct[r[8953]](e,t,n,o,a,0,0,f)}function Cn(e,t,n,o,a,f){Ct[r[8953]](e,t,n,o,a,1,0,f)}function Qn(e,t){return e|=0,vt(t|=0,32),0|oa(e,t)}function yr(e,t){return e=function(n,o){var a=0,f=0;A:{if(f=255&o){if(3&n)for(;;){if(!(a=u[0|n])|(0|a)==(255&o))break A;if(!(3&(n=n+1|0)))break}t:if(!((-1^(a=r[n>>2]))&a-16843009&-2139062144))for(f=xA(f,16843009);;){if((-1^(a^=f))&a-16843009&-2139062144)break t;if(a=r[n+4>>2],n=n+4|0,a-16843009&(-1^a)&-2139062144)break}for(;(f=u[0|(a=n)])&&(n=a+1|0,(0|f)!=(255&o)););return a}return Ut(n)+n|0}return n}(e,t),u[0|e]==(255&t)?e:0}function En(e,t,n,o,a,f){return fa(e,t,n,o,a,f,0),0}function fr(e,t,n,o,a,f,E){return la(e,t,n,o,a,f,E)}function Ir(e,t,n,o,a,f,E){return wa(e,t,n,o,a,f,E)}function sn(e,t,n,o,a,f,E){return ZB(e,t,n,o,a,f,E)}function aa(e,t){ye(e),t&&wt(e,35728,34,0)}function cn(e,t,n,o,a){return va(e,t,n,o,a,0)}function na(e,t){return 0|oa(e|=0,t|=0)}function ia(e,t,n,o){Ct[r[8955]](e,t,0,n,o)}function hn(e,t,n){Ct[r[8954]](e,64,0,t,n)}function K(e,t,n,o){return function(a,f,E,s){var y,_,w,D,v=0,Y=0;return D=xA(v=E>>>16|0,Y=a>>>16|0),v=(65535&(Y=((w=xA(y=65535&E,_=65535&a))>>>16|0)+xA(Y,y)|0))+xA(v,_)|0,a=(xA(f,E)+D|0)+xA(a,s)+(Y>>>16)+(v>>>16)|0,h=a,65535&w|v<<16}(e,t,n,o)}function ng(e,t){return(255&(e^t))-1>>>31|0}function yn(e,t,n){(function(o,a,f){var E,s;BA=E=BA-128|0,kt(o),kt(o+40|0),Ie(o+80|0),Zt(o,a,ng(f=f-((0-(s=(128&f)>>>7|0)&f)<<1)<<24>>24,1)),Zt(o,a+120|0,ng(f,2)),Zt(o,a+240|0,ng(f,3)),Zt(o,a+360|0,ng(f,4)),Zt(o,a+480|0,ng(f,5)),Zt(o,a+600|0,ng(f,6)),Zt(o,a+720|0,ng(f,7)),Zt(o,a+840|0,ng(f,8)),dg(E+8|0,o+40|0),dg(E+48|0,o),Sa(E+88|0,o+80|0),Zt(o,E+8|0,s),BA=E+128|0})(e,xA(t,960)+3488|0,n)}function oa(e,t){return 0|Ct[r[8951]](e,t)}function m0(e,t,n,o){Ct[r[8948]](e,t,n,o)}function zt(e,t,n,o){return at(e,t,n,o)}function kt(e){r[e>>2]=1,L0(e+4|0,0,36)}function at(e,t,n,o){return Ee(e,t,n,o)}function v0(e,t,n){return function(o,a,f){var E=0,s=0,y=0,_=0;return E=31&(y=_=63&f),y>>>0>=32?E=-1>>>E|0:(s=-1>>>E|0,E=(1<>>E),y=E&o,E=a&s,s=31&_,_>>>0>=32?(E=y<>>32-s|E<>>0>=32?(E=-1<>>32-f|-1<>>0>=32?(f=0,o=E>>>a|0):(f=E>>>a|0,o=((1<>>a),h=f|y,o|_}(e,t,n)}function x(e,t,n){return function(o,a,f){var E=0,s=0,y=0,_=0,w=0;return E=31&(_=63&f),_>>>0>=32?(s=-1<>>32-E|-1<>>0>=32?(s=0,_=E>>>y|0):(s=E>>>y|0,_=((1<>>y),w=s,y=31&(E=0-f&63),E>>>0>=32?(s=0,f=-1>>>y|0):(s=-1>>>y|0,f=(1<>>y),o&=f,a&=s,s=31&E,E>>>0>=32?(f=o<>>32-s|a<>>0<18,wA=wA+2|0,hA;);y0(o,f+1634760805|0),y0(o+4|0,b+E|0),y0(o+8|0,V+s|0),y0(o+12|0,yA+y|0),y0(o+16|0,W+_|0),y0(o+20|0,iA+857760878|0),y0(o+24|0,O+U|0),y0(o+28|0,z+H|0),y0(o+32|0,tA+i|0),y0(o+36|0,aA+c|0),y0(o+40|0,a+2036477234|0),y0(o+44|0,l+w|0),y0(o+48|0,N+D|0),y0(o+52|0,F+v|0),y0(o+56|0,gA+Y|0),y0(o+60|0,AA+1797285236|0)})(e,t,n)}function pr(e){L0(e,0,1024)}function Ie(e){L0(e,0,40)}function Gt(){return 16}function tt(){return 32}function lr(){return 24}function ue(){return-17}function qg(){return 64}function wr(){return 1}function Dr(){return 2}function Qa(){return 8}function _e(){return 0}function Ea(){return-1}function sa(){return 3}T(G=u,1024,"InsgcmV0dXJuIE1vZHVsZS5nZXRSYW5kb21WYWx1ZSgpOyB9IgB7IGlmIChNb2R1bGUuZ2V0UmFuZG9tVmFsdWUgPT09IHVuZGVmaW5lZCkgeyB0cnkgeyB2YXIgd2luZG93XyA9ICdvYmplY3QnID09PSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogc2VsZjsgdmFyIGNyeXB0b18gPSB0eXBlb2Ygd2luZG93Xy5jcnlwdG8gIT09ICd1bmRlZmluZWQnID8gd2luZG93Xy5jcnlwdG8gOiB3aW5kb3dfLm1zQ3J5cHRvOyB2YXIgcmFuZG9tVmFsdWVzU3RhbmRhcmQgPSBmdW5jdGlvbigpIHsgdmFyIGJ1ZiA9IG5ldyBVaW50MzJBcnJheSgxKTsgY3J5cHRvXy5nZXRSYW5kb21WYWx1ZXMoYnVmKTsgcmV0dXJuIGJ1ZlswXSA+Pj4gMDsgfTsgcmFuZG9tVmFsdWVzU3RhbmRhcmQoKTsgTW9kdWxlLmdldFJhbmRvbVZhbHVlID0gcmFuZG9tVmFsdWVzU3RhbmRhcmQ7IH0gY2F0Y2ggKGUpIHsgdHJ5IHsgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpOyB2YXIgcmFuZG9tVmFsdWVOb2RlSlMgPSBmdW5jdGlvbigpIHsgdmFyIGJ1ZiA9IGNyeXB0b1sncmFuZG9tQnl0ZXMnXSg0KTsgcmV0dXJuIChidWZbMF0gPDwgMjQgfCBidWZbMV0gPDwgMTYgfCBidWZbMl0gPDwgOCB8IGJ1ZlszXSkgPj4+IDA7IH07IHJhbmRvbVZhbHVlTm9kZUpTKCk7IE1vZHVsZS5nZXRSYW5kb21WYWx1ZSA9IHJhbmRvbVZhbHVlTm9kZUpTOyB9IGNhdGNoIChlKSB7IHRocm93ICdObyBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZm91bmQnOyB9IH0gfSB9AExpYnNvZGl1bURSR2J1Zl9sZW4gPD0gU0laRV9NQVgAcmFuZG9tYnl0ZXMvcmFuZG9tYnl0ZXMuYwByYW5kb21ieXRlcwBTLT5idWZsZW4gPD0gQkxBS0UyQl9CTE9DS0JZVEVTAGNyeXB0b19nZW5lcmljaGFzaC9ibGFrZTJiL3JlZi9ibGFrZTJiLXJlZi5jAGJsYWtlMmJfZmluYWwAAAAAAAAAAAjJvPNn5glqO6fKhIWuZ7sr+JT+cvNuPPE2HV869U+l0YLmrX9SDlEfbD4rjGgFm2u9Qfur2YMfeSF+ExnN4FtvdXRsZW4gPD0gVUlOVDhfTUFYAGNyeXB0b19nZW5lcmljaGFzaC9ibGFrZTJiL3JlZi9nZW5lcmljaGFzaF9ibGFrZTJiLmMAY3J5cHRvX2dlbmVyaWNoYXNoX2JsYWtlMmJfZmluYWwAAAAAAAAAtnhZ/4Vy0wC9bhX/DwpqACnAAQCY6Hn/vDyg/5lxzv8At+L+tA1I/wAAAAAAAAAAsKAO/tPJhv+eGI8Af2k1AGAMvQCn1/v/n0yA/mpl4f8e/AQAkgyu"),T(G,2224,"WfGy/grlpv973Sr+HhTUAFKAAwAw0fMAd3lA/zLjnP8AbsUBZxuQ"),T(G,2272,"hTuMAb3xJP/4JcMBYNw3ALdMPv/DQj0AMkykAeGkTP9MPaP/dT4fAFGRQP92QQ4AonPW/waKLgB85vT/CoqPADQawgC49EwAgY8pAb70E/97qnr/YoFEAHnVkwBWZR7/oWebAIxZQ//v5b4BQwu1AMbwif7uRbz/Q5fuABMqbP/lVXEBMkSH/xFqCQAyZwH/UAGoASOYHv8QqLkBOFno/2XS/AAp+kcAzKpP/w4u7/9QTe8AvdZL/xGN+QAmUEz/vlV1AFbkqgCc2NABw8+k/5ZCTP+v4RD/jVBiAUzb8gDGonIALtqYAJsr8f6boGj/M7ulAAIRrwBCVKAB9zoeACNBNf5F7L8ALYb1AaN73QAgbhT/NBelALrWRwDpsGAA8u82ATlZigBTAFT/iKBkAFyOeP5ofL4AtbE+//opVQCYgioBYPz2AJeXP/7vhT4AIDicAC2nvf+OhbMBg1bTALuzlv76qg7/0qNOACU0lwBjTRoA7pzV/9XA0QFJLlQAFEEpATbOTwDJg5L+qm8Y/7EhMv6rJsv/Tvd0ANHdmQCFgLIBOiwZAMknOwG9E/wAMeXSAXW7dQC1s7gBAHLbADBekwD1KTgAfQ3M/vStdwAs3SD+VOoUAPmgxgHsfur/L2Oo/qrimf9ms9gA4o16/3pCmf629YYA4+QZAdY56//YrTj/tefSAHeAnf+BX4j/bn4zAAKpt/8HgmL+RbBe/3QE4wHZ8pH/yq0fAWkBJ/8ur0UA5C86/9fgRf7POEX/EP6L/xfP1P/KFH7/X9Vg/wmwIQDIBc//8SqA/iMhwP/45cQBgRF4APtnl/8HNHD/jDhC/yji9f/ZRiX+rNYJ/0hDhgGSwNb/LCZwAES4S//OWvsAleuNALWqOgB09O8AXJ0CAGatYgDpiWABfzHLAAWblAAXlAn/03oMACKGGv/bzIgAhggp/+BTK/5VGfcAbX8A/qmIMADud9v/563VAM4S/v4Iugf/fgkHAW8qSABvNOz+YD+NAJO/f/7NTsD/DmrtAbvbTACv87v+aVmtAFUZWQGi85QAAnbR/iGeCQCLoy7/XUYoAGwqjv5v/I7/m9+QADPlp/9J/Jv/XnQM/5ig2v+c7iX/s+rP/8UAs/+apI0A4cRoAAojGf7R1PL/Yf3e/rhl5QDeEn8BpIiH/x7PjP6SYfMAgcAa/slUIf9vCk7/k1Gy/wQEGACh7tf/Bo0hADXXDv8ptdD/54udALPL3f//uXEAveKs/3FC1v/KPi3/ZkAI/06uEP6FdUT/"),T(G,3264,"AQ=="),T(G,3296,"JuiVj8KyJ7BFw/SJ8u+Y8NXfrAXTxjM5sTgCiG1T/AXHF2pwPU3YT7o8C3YNEGcPKiBT+iw5zMZOx/13kqwDeuz///////////////////////////////////////9/7f///////////////////////////////////////3/u////////////////////////////////////////f+3T9VwaYxJY1pz3ot753hQ="),T(G,3487,"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"),T(G,34460,"AQ=="),T(G,34496,"AQ=="),T(G,34528,"4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuABfnJW8o1CMJLHQsVWcg+9bBERcxFgcjobYIk7d0J8RV+z///////////////////////////////////////9/7f///////////////////////////////////////3/u////////////////////////////////////////fw=="),T(G,34720,"CMm882fmCWo7p8qEha5nuyv4lP5y82488TYdXzr1T6XRguatf1IOUR9sPiuMaAWba71B+6vZgx95IX4TGc3gWyKuKNeYL4pCzWXvI5FEN3EvO03sz/vAtbzbiYGl27XpOLVI81vCVjkZ0AW28RHxWZtPGa+kgj+SGIFt2tVeHKtCAgOjmKoH2L5vcEUBW4MSjLLkTr6FMSTitP/Vw30MVW+Je/J0Xb5ysZYWO/6x3oA1Esclpwbcm5Qmac908ZvB0krxnsFpm+TjJU84hke+77XVjIvGncEPZZysd8yhDCR1AitZbyzpLYPkpm6qhHRK1PtBvdypsFy1UxGD2oj5dqvfZu5SUT6YEDK0LW3GMag/IfuYyCcDsOQO777Hf1m/wo+oPfML4MYlpwqTR5Gn1W+CA+BRY8oGcG4OCmcpKRT8L9JGhQq3JybJJlw4IRsu7SrEWvxtLE3fs5WdEw04U95jr4tUcwplqLJ3PLsKanbmru1HLsnCgTs1ghSFLHKSZAPxTKHov6IBMEK8S2YaqJGX+NBwi0vCML5UBqNRbMcYUu/WGeiS0RCpZVUkBpnWKiBxV4U1DvS40bsycKBqEMjQ0rgWwaQZU6tBUQhsNx6Z647fTHdIJ6hIm+G1vLA0Y1rJxbMMHDnLikHjSqrYTnPjY3dPypxbo7iy1vNvLmj8su9d7oKPdGAvF0NvY6V4cqvwoRR4yITsOWQaCALHjCgeYyP6/76Q6b2C3utsUKQVecay96P5vitTcuPyeHHGnGEm6s4+J8oHwsAhx7iG0R7r4M3WfdrqeNFu7n9PffW6bxdyqmfwBqaYyKLFfWMKrg35vgSYPxEbRxwTNQtxG4R9BCP1d9sokyTHQHuryjK8vskVCr6ePEwNEJzEZx1DtkI+y77UxUwqfmX8nCl/Wez61jqrb8tfF1hHSowZRGyA"),T(G,35568,"YjY0X3BvcyA8PSBiNjRfbGVuAHNvZGl1bS9jb2RlY3MuYwBzb2RpdW1fYmluMmJhc2U2NAAkYXJnb24yaWQAJGFyZ29uMmkAJHY9ACRtPQAsdD0ALHA9ACRhcmdvbjJpZCR2PQAkYXJnb24yaSR2PQAkYXJnb24yaWQkACRhcmdvbjJpJA=="),T(G,35728,"U2lnRWQyNTUxOSBubyBFZDI1NTE5IGNvbGxpc2lvbnMBADEuMC4xOA=="),T(G,35772,"UI5QAABAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAAN");var dr,Ct=((dr=[null,Oa,function(e,t,n,o,a){var f;return e|=0,BA=f=BA-16|0,Oa(f,t|=0,n|=0,o|=0,a|=0),e=ur(e,f),BA=f+16|0,0|e},function(e,t){return pa(e|=0,t|=0),0},function(e,t,n,o){return _a(e|=0,t|=0,n|=0,o|=0),0},function(e,t){return ua(e|=0,t|=0),0},function(e,t,n){e|=0,t|=0;var o,a=0,f=0;if(BA=o=BA-336|0,a=-1,!function(E){var s,y=0,_=0,w=0,D=0;for(p[11+(s=BA-16|0)|0]=0,p[s+12|0]=0,p[s+13|0]=0,p[s+14|0]=0,r[s+8>>2]=0;;){for(w=u[E+_|0],y=0;p[0|(D=(s+8|0)+y|0)]=u[0|D]|w^u[(34464+(y<<5)|0)+_|0],(0|(y=y+1|0))!=7;);if((0|(_=_+1|0))==31)break}for(_=127&u[E+31|0],E=0,y=0;p[0|(w=(s+8|0)+y|0)]=u[0|w]|_^u[34495+(y<<5)|0],(0|(y=y+1|0))!=7;);for(y=0;y=u[(s+8|0)+E|0]-1|y,(0|(E=E+1|0))!=7;);return y>>>8&1}(n|=0)){for(a=0;p[e+a|0]=u[t+a|0],(0|(a=a+1|0))!=32;);for(p[0|e]=248&u[0|e],p[e+31|0]=63&u[e+31|0]|64,ya(o+288|0,n),kt(o+240|0),Ie(o+192|0),dg(o+144|0,o+288|0),kt(o+96|0),n=254,t=0;a=t,f=n,rr(o+240|0,o+144|0,a^=t=u[(n>>>3|0)+e|0]>>>(7&n)&1),rr(o+192|0,o+96|0,a),n=n-1|0,$0(o+48|0,o+144|0,o+96|0),$0(o,o+240|0,o+192|0),O0(o+240|0,o+240|0,o+192|0),O0(o+192|0,o+144|0,o+96|0),_0(o+96|0,o+48|0,o+240|0),_0(o+192|0,o+192|0,o),k0(o+48|0,o),k0(o,o+240|0),O0(o+144|0,o+96|0,o+192|0),$0(o+192|0,o+96|0,o+192|0),_0(o+240|0,o,o+48|0),$0(o,o,o+48|0),k0(o+192|0,o+192|0),pn(o+96|0,o),k0(o+144|0,o+144|0),O0(o+48|0,o+48|0,o+96|0),_0(o+96|0,o+288|0,o+192|0),_0(o+192|0,o,o+48|0),f;);rr(o+240|0,o+144|0,t),rr(o+192|0,o+96|0,t),er(o+192|0,o+192|0),_0(o+240|0,o+240|0,o+192|0),Jg(e,o+240|0),a=0}return BA=o+336|0,0|a},function(e,t){e|=0,t|=0;var n,o=0;for(BA=n=BA-208|0;p[e+o|0]=u[t+o|0],(0|(o=o+1|0))!=32;);return p[0|e]=248&u[0|e],p[e+31|0]=63&u[e+31|0]|64,PB(n+48|0,e),function(a,f,E){var s;BA=s=BA-96|0,O0(s+48|0,E,f),$0(s,E,f),er(s,s),_0(a,s+48|0,s),BA=s+96|0}(n,n+88|0,n+128|0),Jg(e,n),BA=n+208|0,0},function(e,t,n,o,a){e|=0,o|=0,a|=0;var f,E=0;if(BA=f=BA-112|0,(t|=0)|(n|=0)){E=u[a+28|0]|u[a+29|0]<<8|u[a+30|0]<<16|u[a+31|0]<<24,r[f+24>>2]=u[a+24|0]|u[a+25|0]<<8|u[a+26|0]<<16|u[a+27|0]<<24,r[f+28>>2]=E,E=u[a+20|0]|u[a+21|0]<<8|u[a+22|0]<<16|u[a+23|0]<<24,r[f+16>>2]=u[a+16|0]|u[a+17|0]<<8|u[a+18|0]<<16|u[a+19|0]<<24,r[f+20>>2]=E,E=u[a+4|0]|u[a+5|0]<<8|u[a+6|0]<<16|u[a+7|0]<<24,r[f>>2]=u[0|a]|u[a+1|0]<<8|u[a+2|0]<<16|u[a+3|0]<<24,r[f+4>>2]=E,E=u[a+12|0]|u[a+13|0]<<8|u[a+14|0]<<16|u[a+15|0]<<24,r[f+8>>2]=u[a+8|0]|u[a+9|0]<<8|u[a+10|0]<<16|u[a+11|0]<<24,r[f+12>>2]=E,a=u[0|o]|u[o+1|0]<<8|u[o+2|0]<<16|u[o+3|0]<<24,o=u[o+4|0]|u[o+5|0]<<8|u[o+6|0]<<16|u[o+7|0]<<24,r[f+104>>2]=0,r[f+108>>2]=0,r[f+96>>2]=a,r[f+100>>2]=o;A:{if(!n&t>>>0>=64|n){for(;;){for(_r(e,f+96|0,f),a=8,o=1;o=u[0|(E=(f+96|0)+a|0)]+o|0,p[0|E]=o,o=o>>>8|0,(0|(a=a+1|0))!=16;);if(e=e- -64|0,n=n-1|0,!(!(n=(t=t+-64|0)>>>0<4294967232?n+1|0:n)&t>>>0>63|n))break}if(!(t|n))break A}for(a=0,_r(f+32|0,f+96|0,f);p[e+a|0]=u[(f+32|0)+a|0],(0|t)!=(0|(a=a+1|0)););}Q0(f+32|0,64),Q0(f,32)}return BA=f+112|0,0},function(e,t,n,o,a,f,E,s){e|=0,t|=0,a|=0,f|=0,E|=0,s|=0;var y,_=0,w=0;if(BA=y=BA-112|0,(n|=0)|(o|=0)){for(_=u[s+28|0]|u[s+29|0]<<8|u[s+30|0]<<16|u[s+31|0]<<24,r[y+24>>2]=u[s+24|0]|u[s+25|0]<<8|u[s+26|0]<<16|u[s+27|0]<<24,r[y+28>>2]=_,_=u[s+20|0]|u[s+21|0]<<8|u[s+22|0]<<16|u[s+23|0]<<24,r[y+16>>2]=u[s+16|0]|u[s+17|0]<<8|u[s+18|0]<<16|u[s+19|0]<<24,r[y+20>>2]=_,_=u[s+4|0]|u[s+5|0]<<8|u[s+6|0]<<16|u[s+7|0]<<24,r[y>>2]=u[0|s]|u[s+1|0]<<8|u[s+2|0]<<16|u[s+3|0]<<24,r[y+4>>2]=_,_=8,w=u[s+12|0]|u[s+13|0]<<8|u[s+14|0]<<16|u[s+15|0]<<24,r[y+8>>2]=u[s+8|0]|u[s+9|0]<<8|u[s+10|0]<<16|u[s+11|0]<<24,r[y+12>>2]=w,s=u[a+4|0]|u[a+5|0]<<8|u[a+6|0]<<16|u[a+7|0]<<24,r[y+96>>2]=u[0|a]|u[a+1|0]<<8|u[a+2|0]<<16|u[a+3|0]<<24,r[y+100>>2]=s;p[(y+96|0)+_|0]=f,f=(255&E)<<24|f>>>8,E=E>>>8|0,(0|(_=_+1|0))!=16;);if(!o&n>>>0>63|o)for(;;){for(_=0,_r(y+32|0,y+96|0,y);p[e+_|0]=u[(y+32|0)+_|0]^u[t+_|0],s=1,(0|(_=_+1|0))!=64;);for(_=8;a=u[0|(f=(y+96|0)+_|0)]+s|0,p[0|f]=a,s=a>>>8|0,(0|(_=_+1|0))!=16;);if(t=t- -64|0,e=e- -64|0,o=o-1|0,!(!(o=(n=n+-64|0)>>>0<4294967232?o+1|0:o)&n>>>0>63|o))break}if(n|o)for(_=0,_r(y+32|0,y+96|0,y);p[e+_|0]=u[(y+32|0)+_|0]^u[t+_|0],(0|n)!=(0|(_=_+1|0)););Q0(y+32|0,64),Q0(y,32)}return BA=y+112|0,0},function(e,t,n,o,a){var f;return e|=0,o|=0,BA=f=BA+-64|0,(t|=0)|(n|=0)&&(ar(f,a|=0),Ya(f,o,0),tr(f,e=L0(e,0,t),e,t,n),Q0(f,64)),BA=f- -64|0,0},function(e,t,n,o,a){var f;return e|=0,o|=0,BA=f=BA+-64|0,(t|=0)|(n|=0)&&(ar(f,a|=0),Ra(f,o,0),tr(f,e=L0(e,0,t),e,t,n),Q0(f,64)),BA=f- -64|0,0},function(e,t,n,o,a,f,E,s){var y;return e|=0,t|=0,a|=0,E|=0,s|=0,BA=y=BA-80|0,(n|=0)|(o|=0)&&(y0(y+8|0,f|=0),y0(y+12|0,E),ar(y+16|0,s),Ya(y+16|0,a,y+8|0),tr(y+16|0,t,e,n,o),Q0(y+16|0,64)),BA=y+80|0,0},function(e,t,n,o,a,f,E){var s;return e|=0,t|=0,a|=0,E|=0,BA=s=BA-80|0,(n|=0)|(o|=0)&&(y0(s+12|0,f|=0),ar(s+16|0,E),Ra(s+16|0,a,s+12|0),tr(s+16|0,t,e,n,o),Q0(s+16|0,64)),BA=s+80|0,0}]).grow=function(e){var t=this.length;return this.length=this.length+e,t},dr.set=function(e,t){this[e]=t},dr.get=function(e){return this[e]},dr);function In(){return nA.byteLength/65536|0}return{h:Ct,i:function(){},j:function(e,t,n,o,a,f,E,s,y,_,w,D){return 0|Ua(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,w|=0,D|=0)},k:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){if(!H&U>>>0<4294967280)return Ua(D,D+U|0,0,Y,U,H,i,c,N,l,F),v&&(H=(D=U+16|0)>>>0<16?H+1|0:H,r[v>>2]=D,r[v+4>>2]=H),0;z0(),s0()}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,_|=0,w|=0)},l:function(e,t,n,o,a,f,E,s,y,_,w,D){return 0|Ga(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,w|=0,D|=0)},m:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){if(!H&U>>>0<4294967280)return Ga(D,D+U|0,0,Y,U,H,i,c,N,l,F),v&&(H=(D=U+16|0)>>>0<16?H+1|0:H,r[v>>2]=D,r[v+4>>2]=H),0;z0(),s0()}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,_|=0,w|=0)},n:function(e,t,n,o,a,f,E,s,y,_,w){return 0|ba(e|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},o:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){var b=0;return b=-1,!H&U>>>0>=16|H&&(b=ba(D,Y,U-16|0,H-(U>>>0<16)|0,(Y+U|0)-16|0,i,c,N,l,F)),v&&(r[v>>2]=b?0:U-16|0,r[v+4>>2]=b?0:H-(U>>>0<16)|0),b}(e|=0,t|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},p:function(e,t,n,o,a,f,E,s,y,_,w){return 0|ka(e|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},q:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){var b=0;return b=-1,!H&U>>>0>=16|H&&(b=ka(D,Y,U-16|0,H-(U>>>0<16)|0,(Y+U|0)-16|0,i,c,N,l,F)),v&&(r[v>>2]=b?0:U-16|0,r[v+4>>2]=b?0:H-(U>>>0<16)|0),b}(e|=0,t|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},r:tt,s:function(){return 12},t:_e,u:Gt,v:ue,w:ig,x:tt,y:Qa,z:_e,A:Gt,B:ue,C:ig,D:function(e,t,n,o,a,f,E,s,y,_,w,D){return 0|Ha(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,w|=0,D|=0)},E:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){if(!H&U>>>0<4294967280)return Ha(D,D+U|0,0,Y,U,H,i,c,N,l,F),v&&(H=(D=U+16|0)>>>0<16?H+1|0:H,r[v>>2]=D,r[v+4>>2]=H),0;z0(),s0()}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,_|=0,w|=0)},F:function(e,t,n,o,a,f,E,s,y,_,w){return 0|Na(e|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},G:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F){var b=0;return b=-1,!H&U>>>0>=16|H&&(b=Na(D,Y,U-16|0,H-(U>>>0<16)|0,(Y+U|0)-16|0,i,c,N,l,F)),v&&(r[v>>2]=b?0:U-16|0,r[v+4>>2]=b?0:H-(U>>>0<16)|0),b}(e|=0,t|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},H:tt,I:lr,J:_e,K:Gt,L:ue,M:ig,N:tt,O:tt,P:function(e,t,n,o,a){return 0|en(e|=0,t|=0,n|=0,o|=0,a|=0)},Q:function(e,t,n,o,a){return 0|function(f,E,s,y,_){var w;return BA=w=BA-32|0,en(w,E,s,y,_),E=fn(f,w),s=or(w,f,32),BA=w+32|0,s|((0|f)==(0|w)?-1:E)}(e|=0,t|=0,n|=0,o|=0,a|=0)},R:ig,S:tt,T:tt,U:tt,V:tt,W:lr,X:Gt,Y:ue,Z:function(e,t,n){return 0|function(o,a,f){var E,s=0;return BA=E=BA+-64|0,he(E,f,32,0),f=r[E+28>>2],s=r[E+24>>2],p[a+24|0]=s,p[a+25|0]=s>>>8,p[a+26|0]=s>>>16,p[a+27|0]=s>>>24,p[a+28|0]=f,p[a+29|0]=f>>>8,p[a+30|0]=f>>>16,p[a+31|0]=f>>>24,f=r[E+20>>2],s=r[E+16>>2],p[a+16|0]=s,p[a+17|0]=s>>>8,p[a+18|0]=s>>>16,p[a+19|0]=s>>>24,p[a+20|0]=f,p[a+21|0]=f>>>8,p[a+22|0]=f>>>16,p[a+23|0]=f>>>24,f=r[E+12>>2],s=r[E+8>>2],p[a+8|0]=s,p[a+9|0]=s>>>8,p[a+10|0]=s>>>16,p[a+11|0]=s>>>24,p[a+12|0]=f,p[a+13|0]=f>>>8,p[a+14|0]=f>>>16,p[a+15|0]=f>>>24,f=r[E+4>>2],s=r[E>>2],p[0|a]=s,p[a+1|0]=s>>>8,p[a+2|0]=s>>>16,p[a+3|0]=s>>>24,p[a+4|0]=f,p[a+5|0]=f>>>8,p[a+6|0]=f>>>16,p[a+7|0]=f>>>24,Q0(E,64),o=oa(o,a),BA=E- -64|0,o}(e|=0,t|=0,n|=0)},_:Qn,$:ea,aa:function(e,t,n,o,a,f,E){return 0|fr(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},ba:function(e,t,n,o,a,f,E,s){return 0|Za(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0)},ca:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){return!_&y>>>0>=4294967280|_&&(z0(),s0()),fr(E+16|0,E,s,y,_,w,D)}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},da:function(e,t,n,o,a,f,E){return 0|gn(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},ea:function(e,t,n,o,a,f,E){return 0|Ir(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},fa:function(e,t,n,o,a,f,E,s){return 0|za(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0)},ga:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){return!_&y>>>0>=16|_?Ir(E,s+16|0,s,y-16|0,_-(y>>>0<16)|0,w,D):-1}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},ha:function(e,t,n,o,a,f,E){return 0|$a(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},ia:function(e,t,n,o,a){return 0|function(f,E,s,y,_){var w,D=0;return BA=w=BA-96|0,D=-1,Qn(w+32|0,w)||(tn(w- -64|0,w+32|0,_),D=gn(f+32|0,E,s,y,w- -64|0,_,w),E=r[w+60>>2],s=r[w+56>>2],p[f+24|0]=s,p[f+25|0]=s>>>8,p[f+26|0]=s>>>16,p[f+27|0]=s>>>24,p[f+28|0]=E,p[f+29|0]=E>>>8,p[f+30|0]=E>>>16,p[f+31|0]=E>>>24,E=r[w+52>>2],s=r[w+48>>2],p[f+16|0]=s,p[f+17|0]=s>>>8,p[f+18|0]=s>>>16,p[f+19|0]=s>>>24,p[f+20|0]=E,p[f+21|0]=E>>>8,p[f+22|0]=E>>>16,p[f+23|0]=E>>>24,E=r[w+44>>2],s=r[w+40>>2],p[f+8|0]=s,p[f+9|0]=s>>>8,p[f+10|0]=s>>>16,p[f+11|0]=s>>>24,p[f+12|0]=E,p[f+13|0]=E>>>8,p[f+14|0]=E>>>16,p[f+15|0]=E>>>24,E=r[w+36>>2],s=r[w+32>>2],p[0|f]=s,p[f+1|0]=s>>>8,p[f+2|0]=s>>>16,p[f+3|0]=s>>>24,p[f+4|0]=E,p[f+5|0]=E>>>8,p[f+6|0]=E>>>16,p[f+7|0]=E>>>24,Q0(w,32),Q0(w+32|0,32),Q0(w- -64|0,24)),BA=w+96|0,D}(e|=0,t|=0,n|=0,o|=0,a|=0)},ja:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){var v,Y=0;return BA=v=BA-32|0,Y=-1,!_&y>>>0>=48|_&&(tn(v,s,w),Y=$a(E,s+32|0,y-32|0,_-(y>>>0<32)|0,v,s,D)),BA=v+32|0,Y}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},ka:function(){return 48},la:Gt,ma:qg,na:tt,oa:Gt,pa:qg,qa:tt,ra:function(){return 384},sa:function(e,t,n,o,a,f,E){return 0|sn(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},ta:cr,ua:function(e,t,n,o){return 0|zt(e|=0,t|=0,n|=0,o|=0)},va:hr,wa:ig,xa:qg,ya:function(e,t,n,o){return 0|he(e|=0,t|=0,n|=0,o|=0)},za:Gt,Aa:qg,Ba:Qa,Ca:tt,Da:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){var v,Y;return BA=v=BA-32|0,Y=u[0|w]|u[w+1|0]<<8|u[w+2|0]<<16|u[w+3|0]<<24,w=u[w+4|0]|u[w+5|0]<<8|u[w+6|0]<<16|u[w+7|0]<<24,r[v+24>>2]=0,r[v+28>>2]=0,r[v+16>>2]=Y,r[v+20>>2]=w,q0(v,y,_),r[v+8>>2]=0,r[v+12>>2]=0,s-16>>>0>=49?(r[8960]=28,E=-1):(y=v+16|0,E=s-1>>>0>63?-1:function(U,H,i,c,N){var l,F=0;if(l=F=BA,BA=F=F-384&-64,!(!H|!U|(i-1&255)>>>0>=64))return function(b,V,W,O,z){var tA;if(BA=tA=BA-192|0,!(!W|(V-1&255)>>>0>=64))return lA[tA+130>>1]=257,p[tA+129|0]=32,p[tA+128|0]=V,ga(tA+128|4),q0(tA+128|8,0,0),r[tA+152>>2]=0,r[tA+156>>2]=0,r[tA+144>>2]=0,r[tA+148>>2]=0,O?function(AA,gA){var aA,iA=0;iA=u[gA+4|0]|u[gA+5|0]<<8|u[gA+6|0]<<16|u[gA+7|0]<<24,aA=u[0|gA]|u[gA+1|0]<<8|u[gA+2|0]<<16|u[gA+3|0]<<24,p[AA+32|0]=aA,p[AA+33|0]=aA>>>8,p[AA+34|0]=aA>>>16,p[AA+35|0]=aA>>>24,p[AA+36|0]=iA,p[AA+37|0]=iA>>>8,p[AA+38|0]=iA>>>16,p[AA+39|0]=iA>>>24,iA=u[gA+12|0]|u[gA+13|0]<<8|u[gA+14|0]<<16|u[gA+15|0]<<24,gA=u[gA+8|0]|u[gA+9|0]<<8|u[gA+10|0]<<16|u[gA+11|0]<<24,p[AA+40|0]=gA,p[AA+41|0]=gA>>>8,p[AA+42|0]=gA>>>16,p[AA+43|0]=gA>>>24,p[AA+44|0]=iA,p[AA+45|0]=iA>>>8,p[AA+46|0]=iA>>>16,p[AA+47|0]=iA>>>24}(tA+128|0,O):(r[tA+168>>2]=0,r[tA+172>>2]=0,r[tA+160>>2]=0,r[tA+164>>2]=0),z?function(AA,gA){var aA,iA=0;iA=u[gA+4|0]|u[gA+5|0]<<8|u[gA+6|0]<<16|u[gA+7|0]<<24,aA=u[0|gA]|u[gA+1|0]<<8|u[gA+2|0]<<16|u[gA+3|0]<<24,p[AA+48|0]=aA,p[AA+49|0]=aA>>>8,p[AA+50|0]=aA>>>16,p[AA+51|0]=aA>>>24,p[AA+52|0]=iA,p[AA+53|0]=iA>>>8,p[AA+54|0]=iA>>>16,p[AA+55|0]=iA>>>24,iA=u[gA+12|0]|u[gA+13|0]<<8|u[gA+14|0]<<16|u[gA+15|0]<<24,gA=u[gA+8|0]|u[gA+9|0]<<8|u[gA+10|0]<<16|u[gA+11|0]<<24,p[AA+56|0]=gA,p[AA+57|0]=gA>>>8,p[AA+58|0]=gA>>>16,p[AA+59|0]=gA>>>24,p[AA+60|0]=iA,p[AA+61|0]=iA>>>8,p[AA+62|0]=iA>>>16,p[AA+63|0]=iA>>>24}(tA+128|0,z):(r[tA+184>>2]=0,r[tA+188>>2]=0,r[tA+176>>2]=0,r[tA+180>>2]=0),XB(b,tA+128|0),L0(tA+32|0,0,96),Ee(V=b,b=V0(tA,W,32),128,0),Q0(b,128),void(BA=b+192|0);z0(),s0()}(F,i,H,c,N),Ee(F,0,0,0),UB(F,U,i),BA=l,0;z0(),s0()}(E,D,255&s,v,y)),BA=v+32|0,E}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},Ea:ig,Fa:function(e,t,n){return e|=0,sn(t|=0,32,n|=0,32,0,0,0),0|na(e,t)},Ga:function(e,t){return e|=0,vt(t|=0,32),0|na(e,t)},Ha:function(e,t,n,o,a){t|=0,n|=0,a|=0;var f,E,s=0;if(E=s=BA,BA=s=s-512&-64,f=(e|=0)||t){if(e=-1,!ra(s+96|0,o|=0,a)){for(t=t||f,e=0,cr(s+128|0,0,0,64),zt(s+128|0,s+96|0,32,0),Q0(s+96|0,32),zt(s+128|0,n,32,0),zt(s+128|0,a,32,0),hr(s+128|0,s+32|0,64),Q0(s+128|0,384);n=(s+32|0)+e|0,p[e+f|0]=u[0|n],p[e+t|0]=u[n+32|0],(0|(e=e+1|0))!=32;);Q0(s+32|0,64),e=0}return BA=E,0|e}z0(),s0()},Ia:function(e,t,n,o,a){t|=0,n|=0,a|=0;var f,E,s=0;if(E=s=BA,BA=s=s-512&-64,f=(e|=0)||t){if(e=-1,!ra(s+96|0,o|=0,a)){for(t=t||f,e=0,cr(s+128|0,0,0,64),zt(s+128|0,s+96|0,32,0),Q0(s+96|0,32),zt(s+128|0,a,32,0),zt(s+128|0,n,32,0),hr(s+128|0,s+32|0,64),Q0(s+128|0,384);n=(s+32|0)+e|0,p[e+t|0]=u[0|n],p[e+f|0]=u[n+32|0],(0|(e=e+1|0))!=32;);Q0(s+32|0,64),e=0}return BA=E,0|e}z0(),s0()},Ja:tt,Ka:tt,La:tt,Ma:tt,Na:wr,Oa:Dr,Pa:Dr,Qa:Gt,Ra:Ea,Sa:_e,Ta:Ea,Ua:Gt,Va:function(){return 128},Wa:function(){return 35681},Xa:wr,Ya:Ea,Za:function(){return 8192},_a:function(){return-2147483648},$a:Dr,ab:function(){return 67108864},bb:sa,cb:function(){return 268435456},db:function(){return 4},eb:function(){return 1073741824},fb:function(e,t,n,o,a,f,E,s,y,_,w){return 0|function(D,v,Y,U,H,i,c,N,l,F,b){switch(b-1|0){case 0:return function(V,W,O,z,tA,AA,gA,aA,iA,hA){var yA,fA;fA=W,yA=L0(V,0,W),V=22;A:if(!O){if(!(!O&W>>>0<16)){if(AA|iA|hA>>>0>2147483648)break A;if(!(!iA&aA>>>0<3|hA>>>0<8192)){if(V=28,(0|z)==(0|yA))break A;return se(aA,hA>>>10|0,1,z,tA,gA,16,yA,fA,0,0,1)?-1:0}}V=28}return r[8960]=V,-1}(D,v,Y,U,H,i,c,N,l,F);case 1:return function(V,W,O,z,tA,AA,gA,aA,iA,hA){var yA,fA;fA=W,yA=L0(V,0,W),V=22;A:if(!O){if(!(!O&W>>>0<16)){if(AA|iA|hA>>>0>2147483648)break A;if(!(!(aA|iA)|hA>>>0<8192)){if(V=28,(0|z)==(0|yA))break A;return se(aA,hA>>>10|0,1,z,tA,gA,16,yA,fA,0,0,2)?-1:0}}V=28}return r[8960]=V,-1}(D,v,Y,U,H,i,c,N,l,F)}return r[8960]=28,-1}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0,w|=0)},gb:function(e,t,n,o,a,f,E){return 0|La(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0)},hb:function(e,t,n,o,a,f,E,s){return 0|function(y,_,w,D,v,Y,U,H){switch(H-1|0){case 1:return La(y,_,w,D,v,Y,U);default:z0(),s0();case 0:}return function(i,c,N,l,F,b,V){var W;return BA=W=BA-16|0,i=L0(i,0,128),V>>>0<2147483649&&!(l|b)?V>>>0>8191&&!b&F>>>0>=3|(0|b)!=0?(vt(W,16),i=se(F,V>>>10|0,1,c,N,W,16,0,32,i,128,1)?-1:0):(r[8960]=28,i=-1):(r[8960]=22,i=-1),BA=W+16|0,i}(y,_,w,D,v,Y,U)}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0)},ib:function(e,t,n,o){return 0|function(a,f,E,s){return Mt(a,35681,10)?Mt(a,35692,9)?(r[8960]=28,-1):function(y,_,w,D){A:{if((0|D)==1|D>>>0>1)r[8960]=22;else{if(!(y=da(y,_,w,1)))break A;(0|y)==-35&&(r[8960]=28)}y=-1}return y}(a,f,E,s):function(y,_,w,D){A:{if((0|D)==1|D>>>0>1)r[8960]=22;else{if(!(y=da(y,_,w,2)))break A;(0|y)==-35&&(r[8960]=28)}y=-1}return y}(a,f,E,s)}(e|=0,t|=0,n|=0,o|=0)},jb:function(e,t,n,o){return 0|function(a,f,E,s){return Mt(a,35681,10)?Mt(a,35692,9)?(r[8960]=28,-1):ma(a,f,E,s,1):ma(a,f,E,s,2)}(e|=0,t|=0,n|=0,o|=0)},kb:na,lb:ra,mb:tt,nb:tt,ob:tt,pb:lr,qb:Gt,rb:ue,sb:ig,tb:fr,ub:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){return!_&y>>>0>=4294967280|_&&(z0(),s0()),la(E+16|0,E,s,y,_,w,D),0}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},vb:Ir,wb:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){return!_&y>>>0>=16|_?wa(E,s+16|0,s,y-16|0,_-(y>>>0<16)|0,w,D):-1}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},xb:ig,yb:function(e,t,n){return e|=0,n|=0,vt(t|=0,24),gr(e,t,n),ta(e),n=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,t=u[t+20|0]|u[t+21|0]<<8|u[t+22|0]<<16|u[t+23|0]<<24,p[e+44|0]=0,p[e+45|0]=0,p[e+46|0]=0,p[e+47|0]=0,p[e+48|0]=0,p[e+49|0]=0,p[e+50|0]=0,p[e+51|0]=0,p[e+36|0]=n,p[e+37|0]=n>>>8,p[e+38|0]=n>>>16,p[e+39|0]=n>>>24,p[e+40|0]=t,p[e+41|0]=t>>>8,p[e+42|0]=t>>>16,p[e+43|0]=t>>>24,0},zb:function(e,t,n){return gr(e|=0,t|=0,n|=0),ta(e),n=u[t+16|0]|u[t+17|0]<<8|u[t+18|0]<<16|u[t+19|0]<<24,t=u[t+20|0]|u[t+21|0]<<8|u[t+22|0]<<16|u[t+23|0]<<24,p[e+44|0]=0,p[e+45|0]=0,p[e+46|0]=0,p[e+47|0]=0,p[e+48|0]=0,p[e+49|0]=0,p[e+50|0]=0,p[e+51|0]=0,p[e+36|0]=n,p[e+37|0]=n>>>8,p[e+38|0]=n>>>16,p[e+39|0]=n>>>24,p[e+40|0]=t,p[e+41|0]=t>>>8,p[e+42|0]=t>>>16,p[e+43|0]=t>>>24,0},Ab:RB,Bb:function(e,t,n,o,a,f,E,s,y,_){return 0|function(w,D,v,Y,U,H,i,c,N,l){var F,b=0;if(BA=F=BA-336|0,v&&(r[v>>2]=0,r[v+4>>2]=0),!H&U>>>0<4294967279)return fe(F+16|0,64,b=w+32|0,w),$t(F+80|0,F+16|0),Q0(F+16|0,64),m0(F+80|0,i,c,N),m0(F+80|0,35712,0-c&15,0),L0(F+16|0,0,64),p[F+16|0]=l,Pg(F+16|0,F+16|0,64,0,b,1,w),m0(F+80|0,F+16|0,64,0),p[0|D]=u[F+16|0],Pg(i=D+1|0,Y,U,H,b,2,w),m0(F+80|0,i,U,H),m0(F+80|0,35712,15&U,0),q0(F+8|0,c,N),m0(F+80|0,F+8|0,8,0),q0(F+8|0,U- -64|0,H-((U>>>0<4294967232)-1|0)|0),m0(F+80|0,F+8|0,8,0),Ag(F+80|0,D=U+i|0),Q0(F+80|0,256),An(w+36|0,D),ja(b),(2&l||jB(b,4))&&RB(w),v&&(H=(w=U+17|0)>>>0<17?H+1|0:H,r[v>>2]=w,r[v+4>>2]=H),BA=F+336|0,0;z0(),s0()}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0)},Cb:function(e,t,n,o,a,f,E,s,y,_){return 0|function(w,D,v,Y,U,H,i,c,N,l){var F,b=0,V=0,W=0,O=0,z=0;BA=F=BA-352|0,v&&(r[v>>2]=0,r[v+4>>2]=0),Y&&(p[0|Y]=255),O=-1;A:{if(!(!i&H>>>0<17)){if(!(b=i-(H>>>0<17)|0)&(V=H-17|0)>>>0>=4294967279|b)break A;fe(F+32|0,64,W=w+32|0,w),$t(F+96|0,F+32|0),Q0(F+32|0,64),m0(F+96|0,c,N,l),m0(F+96|0,35712,0-N&15,0),L0(F+32|0,0,64),p[F+32|0]=u[0|U],Pg(F+32|0,F+32|0,64,0,W,1,w),z=u[F+32|0],p[F+32|0]=u[0|U],m0(F+96|0,F+32|0,64,0),m0(F+96|0,c=U+1|0,V,b),m0(F+96|0,35712,H-1&15,0),q0(F+24|0,N,l),m0(F+96|0,F+24|0,8,0),q0(F+24|0,U=H+47|0,i=U>>>0<47?i+1|0:i),m0(F+96|0,F+24|0,8,0),Ag(F+96|0,F),Q0(F+96|0,256),or(F,c+V|0,16)?Q0(F,16):(Pg(D,c,V,b,W,2,w),An(w+36|0,F),ja(W),(2&z||jB(W,4))&&RB(w),v&&(r[v>>2]=V,r[v+4>>2]=b),O=0,Y&&(p[0|Y]=z))}return BA=F+352|0,O}z0(),s0()}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0,E|=0,s|=0,y|=0,_|=0)},Db:function(){return 52},Eb:function(){return 17},Fb:lr,Gb:tt,Hb:function(){return-18},Ib:_e,Jb:wr,Kb:Dr,Lb:sa,Mb:Qa,Nb:Gt,Ob:function(e,t,n,o,a){return 0|function(f,E,s,y){var _=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0,N=0,l=0,F=0,b=0,V=0,W=0,O=0;if(_=1886610805^(D=u[0|y]|u[y+1|0]<<8|u[y+2|0]<<16|u[y+3|0]<<24),v=1936682341^(w=u[y+4|0]|u[y+5|0]<<8|u[y+6|0]<<16|u[y+7|0]<<24),Y=1852142177^D,H=1819895653^w,D=1852075885^(c=u[y+8|0]|u[y+9|0]<<8|u[y+10|0]<<16|u[y+11|0]<<24),w=1685025377^(y=u[y+12|0]|u[y+13|0]<<8|u[y+14|0]<<16|u[y+15|0]<<24),c^=2037671283,U=1952801890^y,(0|(y=(E+s|0)-(F=7&s)|0))!=(0|E)){for(;i=u[0|E]|u[E+1|0]<<8|u[E+2|0]<<16|u[E+3|0]<<24,N=u[E+4|0]|u[E+5|0]<<8|u[E+6|0]<<16|u[E+7|0]<<24,l=v0(D,w,13),b=h,V=1+(w=w+v|0)|0,v=w,W=v0(w=_+D|0,v=w>>>0<_>>>0?V:v,32),V=h,U=_=U^N,D=v0(c^=i,_,16),_=Y+c|0,Y=H+U|0,c=H=(Y=_>>>0>>0?Y+1|0:Y)^h,H=v0(D^=_,H,21),U=h,l=v0(w^=l,v^=b,17),O=h,v=Y+v|0,Y=_,v=v0(_=_+w|0,w=Y>>>0>_>>>0?v+1|0:v,32),Y=h,b=v0(l^=_,w^=O,13),O=h,V=1+(_=c+V|0)|0,c=_,D=(_=D+W|0)>>>0>>0?V:c,l=c=_+l|0,w=D+w|0,w=v0(c,W=_>>>0>c>>>0?w+1|0:w,32),c=h,H=v0(_^=H,D^=U,16),D=Y+D|0,D=(_=_+v|0)>>>0>>0?D+1|0:D,v=w+(Y=_^H)|0,w=(U=c)+(c=D^h)|0,c=v0(Y,c,21)^v,U=(V=v>>>0>>0?w+1|0:w)^h,Y=w=W^O,w=v0(H=l^b,w,17),D=D+Y|0,H=(Y=_+H|0)>>>0<_>>>0?D+1|0:D,D=w^Y,w=H^h,_=v^i,v=N^V,Y=v0(Y,H,32),H=h,(0|y)!=(0|(E=E+8|0)););E=y}switch(y=s<<24,s=0,F-1|0){case 6:y|=u[E+6|0]<<16;case 5:y|=u[E+5|0]<<8;case 4:y|=u[E+4|0];case 3:i=(s=u[E+3|0])>>>8|0,s<<=24,y|=i;case 2:s|=(i=u[E+2|0])<<16,y|=N=i>>>16|0;case 1:s|=(i=u[E+1|0])<<8,y|=N=i>>>24|0;case 0:s=u[0|E]|s}return i=v0(D,w,13),N=h,E=w+v|0,F=v0(D=_+D|0,w=D>>>0<_>>>0?E+1|0:E,32),l=h,v=_=y^U,_=v0(E=s^c,_,16),v=v+H|0,H=Y=(v=(U=E)>>>0>(E=E+Y|0)>>>0?v+1|0:v)^h,Y=v0(_^=E,Y,21),c=h,i=v0(D^=i,w^=N,17),N=h,w=v+w|0,U=E,w=v0(E=E+D|0,D=U>>>0>E>>>0?w+1|0:w,32),v=h,i=v0(U=E^i,D^=N,13),N=h,b=1+(E=H+l|0)|0,H=E,D=(_=(E=_+F|0)>>>0<_>>>0?b:H)+D|0,D=v0(U=H=E+U|0,H=E>>>0>H>>>0?D+1|0:D,32),F=h,Y=v0(E^=Y,_^=c,16),_=v+_|0,_=(E=E+w|0)>>>0>>0?_+1|0:_,w=E^Y,Y=v=_^h,v=v0(w,v,21),c=h,N=H^=N,H=v0(U^=i,H,17),i=h,_=_+N|0,b=E,U=v0(E=E+U|0,_=b>>>0>E>>>0?_+1|0:_,32),N=h,i=v0(E^=H,H=_^i,13),l=h,b=E,Y=1+(E=Y+F|0)|0,_=E,y=H+(y^(_=(E=D+w|0)>>>0>>0?Y:_))|0,s=v0(w=D=b+(s^=E)|0,D=s>>>0>D>>>0?y+1|0:y,32),Y=h,v=v0(E^=v,y=_^c,16),y=y+N|0,y=(_=E)>>>0>(E=E+(255^U)|0)>>>0?y+1|0:y,_=E^v,H=v=y^h,v=v0(_,v,21),c=h,U=D^=l,D=v0(w^=i,D,17),i=h,y=y+U|0,U=E,w=v0(E=E+w|0,y=U>>>0>E>>>0?y+1|0:y,32),U=h,N=v0(D^=E,i^=y,13),F=h,H=1+(E=Y+H|0)|0,y=E,_=(y=(E=s+_|0)>>>0>>0?H:y)+i|0,Y=_=E>>>0>(s=E+D|0)>>>0?_+1|0:_,_=v0(s,_,32),H=h,v=v0(E^=v,y^=c,16),y=y+U|0,U=E,D=(E=E+w|0)^v,v=w=(y=U>>>0>E>>>0?y+1|0:y)^h,w=v0(D,w,21),c=h,U=Y^=F,Y=v0(s^=N,Y,17),i=h,y=y+U|0,U=E,U=v0(E=E+s|0,s=U>>>0>E>>>0?y+1|0:y,32),N=h,F=v0(Y^=E,i^=s,13),l=h,y=1+(E=v+H|0)|0,s=E,_=(y=(E=_+D|0)>>>0<_>>>0?y:s)+i|0,v=_=E>>>0>(s=E+Y|0)>>>0?_+1|0:_,_=v0(s,_,32),Y=h,w=v0(E^=w,y^=c,16),y=y+N|0,H=E,D=(E=E+U|0)^w,H=w=(y=H>>>0>E>>>0?y+1|0:y)^h,w=v0(D,w,21),c=h,U=v^=l,v=v0(s^=F,v,17),i=h,y=y+U|0,U=E,y=v0(E=E+s|0,s=U>>>0>E>>>0?y+1|0:y,32),U=h,i=s^=i,N=v0(v^=E,s,13),F=h,H=1+(E=Y+H|0)|0,s=E,Y=D=c^(_=(E=_+D|0)>>>0<_>>>0?H:s),D=v0(s=E^w,D,16),w=Y+U|0,U=s,D=v0((s=s+y|0)^D,(y=U>>>0>s>>>0?w+1|0:w)^h,21),w=h,_=_+i|0,H=1+(y=y+(_=((U=E)>>>0>(E=E+v|0)>>>0?_+1|0:_)^F)|0)|0,U=y,s=(E=s+(y=E^N)|0)>>>0>>0?H:U,y=v0(y,_,17)^E^D,_=h^s^w,q0(f,v0(E,s,32)^y,h^_),0}(e|=0,t|=0,n|=0,a|=0)},Pb:function(e){vt(e|=0,16)},Qb:function(){return 208},Rb:qg,Sb:tt,Tb:tt,Ub:qg,Vb:function(){return-65},Wb:function(e,t,n){return 0|ha(e|=0,t|=0,n|=0)},Xb:function(e,t){return 0|function(n,o){var a;return BA=a=BA-32|0,vt(a,32),ha(n,o,a),Q0(a,32),BA=a+32|0,0}(e|=0,t|=0)},Yb:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){var v,Y;return BA=v=BA-16|0,Y=y,y=_,En(E,v+8|0,Br(E- -64|0,Y,_),_,w,D),r[v+8>>2]!=64|r[v+12>>2]?(s&&(r[s>>2]=0,r[s+4>>2]=0),L0(E,0,y- -64|0),E=-1):(E=0,s&&(r[s>>2]=_- -64,r[s+4>>2]=w-((_>>>0<4294967232)-1|0))),BA=v+16|0,E}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},Zb:function(e,t,n,o,a,f){return 0|function(E,s,y,_,w,D){var v=0;A:{t:{if(!(!w&_>>>0<64||(w=w-1|0,!(w=(_=_+-64|0)>>>0<4294967232?w+1|0:w)&_>>>0>4294967231|w))){if(!cn(y,v=y- -64|0,_,w,D))break t;E&&L0(E,0,_)}if(y=-1,!s)break A;return r[s>>2]=0,r[s+4>>2]=0,-1}s&&(r[s>>2]=_,r[s+4>>2]=w),y=0,E&&Br(E,v,_)}return y}(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},_b:function(e,t,n,o,a,f){return 0|En(e|=0,t|=0,n|=0,o|=0,a|=0,f|=0)},$b:function(e,t,n,o,a){return 0|cn(e|=0,t|=0,n|=0,o|=0,a|=0)},ac:function(e){return ye(e|=0),0},bc:function(e,t,n,o){return 0|wt(e|=0,t|=0,n|=0,o|=0)},cc:function(e,t,n,o){return 0|function(a,f,E,s){var y;return BA=y=BA+-64|0,ag(a,y),a=fa(f,E,y,64,0,s,1),BA=y- -64|0,a}(e|=0,t|=0,n|=0,o|=0)},dc:function(e,t,n){return 0|function(o,a,f){var E;return BA=E=BA+-64|0,ag(o,E),o=va(a,E,64,0,f,1),BA=E- -64|0,o}(e|=0,t|=0,n|=0)},ec:function(e,t){e|=0;var n,o=0;return BA=n=BA-256|0,o=-1,VB(t|=0)||Fa(n+96|0,t)||function(a){var f;return BA=f=BA-160|0,function(E,s){var y,_=0;for(BA=y=BA-1760|0,yt(y+480|0,s),sr(y+320|0,s),Z0(y,y+320|0),ht(y+320|0,y,y+480|0),Z0(y+160|0,y+320|0),yt(s=y+640|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(s=y+800|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(s=y+960|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(s=y+1120|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(s=y+1280|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(s=y+1440|0,y+160|0),ht(y+320|0,y,s),Z0(y+160|0,y+320|0),yt(y+1600|0,y+160|0),on(E),s=252;sr(y+320|0,E),_=s,(0|(s=p[s+34208|0]))>=1?(Z0(y+160|0,y+320|0),ht(y+320|0,y+160|0,(y+480|0)+xA((254&s)>>>1|0,160)|0)):(0|s)>-1||(Z0(y+160|0,y+320|0),xa(y+320|0,y+160|0,(y+480|0)+xA((0-s&254)>>>1|0,160)|0)),Z0(E,y+320|0),s=_-1|0,_;);BA=y+1760|0}(f,a),a=Aa(f),BA=f+160|0,a}(n+96|0)&&(kt(n),$0(n,n,t=n+136|0),kt(n+48|0),O0(n+48|0,n+48|0,t),er(n,n),_0(n+48|0,n+48|0,n),Jg(e,n+48|0),o=0),BA=n+256|0,0|o},fc:function(e,t){e|=0;var n,o=0;return BA=n=BA+-64|0,he(n,t|=0,32,0),p[0|n]=248&u[0|n],p[n+31|0]=63&u[n+31|0]|64,t=r[n+20>>2],o=r[n+16>>2],p[e+16|0]=o,p[e+17|0]=o>>>8,p[e+18|0]=o>>>16,p[e+19|0]=o>>>24,p[e+20|0]=t,p[e+21|0]=t>>>8,p[e+22|0]=t>>>16,p[e+23|0]=t>>>24,t=r[n+12>>2],o=r[n+8>>2],p[e+8|0]=o,p[e+9|0]=o>>>8,p[e+10|0]=o>>>16,p[e+11|0]=o>>>24,p[e+12|0]=t,p[e+13|0]=t>>>8,p[e+14|0]=t>>>16,p[e+15|0]=t>>>24,t=r[n+4>>2],o=r[n>>2],p[0|e]=o,p[e+1|0]=o>>>8,p[e+2|0]=o>>>16,p[e+3|0]=o>>>24,p[e+4|0]=t,p[e+5|0]=t>>>8,p[e+6|0]=t>>>16,p[e+7|0]=t>>>24,t=r[n+28>>2],o=r[n+24>>2],p[e+24|0]=o,p[e+25|0]=o>>>8,p[e+26|0]=o>>>16,p[e+27|0]=o>>>24,p[e+28|0]=t,p[e+29|0]=t>>>8,p[e+30|0]=t>>>16,p[e+31|0]=t>>>24,Q0(n,64),BA=n- -64|0,0},gc:zB,hc:Bn,ic:function(e){var t=0,n=0;if((e|=0)>>>0>=2){for(n=(0-e>>>0)%(e>>>0)|0;(t=zB())>>>0>>0;);e=(t>>>0)%(e>>>0)|0}else e=0;return 0|e},jc:vt,kc:function(e,t,n){fe(e|=0,t|=0,1784,n|=0)},lc:tt,mc:function(){var e=0,t=0;return(e=r[9097])&&(e=r[e+20>>2])&&(t=0|Ct[0|e]()),0|t},nc:function(e,t,n){(function(o,a,f){(0|f)==1|f>>>0>1&&(D0(1796,1816,197,1842),s0()),vt(o,a)})(e|=0,t|=0,n|=0)},oc:function(e,t,n,o){e|=0,n|=0;var a=0,f=0,E=0;if(!((o|=0)>>>0>2147483646|o<<1>>>0>=(t|=0)>>>0)){if(t=0,o){for(;a=t<<1,f=(E=u[t+n|0])>>>4|0,p[a+e|0]=87+(f+(f+65526>>>8&217)|0),f=(1|a)+e|0,a=15&E,p[0|f]=22272+((a<<8)+(a+65526&55552)|0)>>>8,(0|o)!=(0|(t=t+1|0)););t=o<<1}else t=0;return p[t+e|0]=0,0|e}z0(),s0()},pc:function(e,t,n,o,a,f,E){e|=0,t|=0,n|=0,a|=0,f|=0,E|=0;var s=0,y=0,_=0,w=0,D=0,v=0,Y=0,U=0,H=0,i=0,c=0;A:if(o|=0){t:{g:{r:for(;;){for(y=s;;){e:{if(!(255&((H=(65526+(Y=(223&(v=u[n+y|0]))-55&255)^Y+65520)>>>8|0)|(_=65526+(i=48^v)>>>8|0)))){if(_=1,!a|255&D)break g;if(yr(a,v))break e;s=y;break A}if(t>>>0<=w>>>0){r[8960]=68,_=0;break g}if(s=Y&H|_&i,255&D?(p[e+w|0]=s|c,w=w+1|0):c=s<<4,D^=-1,_=1,(s=y+1|0)>>>0>>0)continue r;break t}if(D=0,!((y=y+1|0)>>>0>>0))break}break}s=(e=s+1|0)>>>0>>0?o:e;break A}s=y}255&D?(r[8960]=28,U=-1,s=s-1|0,w=0):_||(w=0,U=-1)}return E?r[E>>2]=n+s:(0|o)!=(0|s)&&(r[8960]=28,U=-1),f&&(r[f>>2]=w),0|U},qc:function(e,t){var n;return e|=0,Ca(t|=0),e=xA(n=(e>>>0)/3|0,-3)+e|0,xA(4-(3-e&0-(t>>>1&1))|0,1&(e|e>>>1))+(n<<2|1)|0},rc:JB,sc:xB,tc:function(){var e=0;return r[9104]?e=1:(r[9086]=0,function(){var t;BA=t=BA-16|0,nn(t),r[t>>2]&&(nn(t),L0(36348,0,40)),BA=t+16|0}(),r[9085]=1,Bn(),function(){var t=0;(0|(t=0|ct(30)))>=1?r[8944]=t:t=r[8944],t>>>0<=15&&(z0(),s0()),vt(36400,16)}(),r[9104]=1,e=0),0|e},uc:function(e,t,n,o,a){e|=0,t|=0,n|=0,a|=0;var f,E=0,s=0,y=0;BA=f=BA-16|0;A:{if(o|=0){if(y=-1,(E=(E=o-1|0)-(s=E&o?(n>>>0)%(o>>>0)|0:n&E)|0)>>>0>=(-1^n)>>>0)break A;if(!((n=n+E|0)>>>0>=a>>>0))for(e&&(r[e>>2]=n+1),e=t+n|0,y=0,p[f+15|0]=0,t=o>>>0>1?o:1,o=0;a=n=e-o|0,s=u[0|n]&u[f+15|0],n=(o^E)-1>>>24|0,p[0|a]=s|128&n,p[f+15|0]=n|u[f+15|0],(0|t)!=(0|(o=o+1|0)););}else y=-1;return BA=f+16|0,0|y}z0(),s0()},vc:function(e,t,n,o){e|=0,t|=0,n|=0,o|=0;var a,f=0,E=0,s=0,y=0,_=0;if(r[12+(a=BA-16|0)>>2]=0,o-1>>>0>>0){for(_=(f=n-1|0)+t|0,n=0,t=0;y=((128^(E=u[_-n|0]))-1&r[a+12>>2]-1&s-1)>>>8&1,r[a+12>>2]=r[a+12>>2]|0-y&n,t|=y,s|=E,(0|o)!=(0|(n=n+1|0)););r[e>>2]=f-r[a+12>>2],e=t-1|0}else e=-1;return 0|e},wc:function(){return 35762},xc:function(){return 10},yc:sa,zc:wr,Ac:function(){return 35840},Bc:Nt,Cc:ot}}(S)}(Ze)},instantiate:function(UA,d){return{then:function(S){var G=new Yt.Module(UA);S({instance:new Yt.Instance(G)})}}},RuntimeError:Error};function eB(UA,d,S,G){switch((S=S||"i8").charAt(S.length-1)==="*"&&(S="i32"),S){case"i1":case"i8":re[UA>>0]=d;break;case"i16":Be[UA>>1]=d;break;case"i32":Wt[UA>>2]=d;break;case"i64":oe=[d>>>0,(Bg=d,+Math.abs(Bg)>=1?Bg>0?(0|Math.min(+Math.floor(Bg/4294967296),4294967295))>>>0:~~+Math.ceil((Bg-+(~~Bg>>>0))/4294967296)>>>0:0)],Wt[UA>>2]=oe[0],Wt[UA+4>>2]=oe[1];break;case"float":ae[UA>>2]=d;break;case"double":Ng[UA>>3]=d;break;default:Ht("invalid type for setValue: "+S)}}function rB(UA,d,S){switch((d=d||"i8").charAt(d.length-1)==="*"&&(d="i32"),d){case"i1":case"i8":return re[UA>>0];case"i16":return Be[UA>>1];case"i32":case"i64":return Wt[UA>>2];case"float":return ae[UA>>2];case"double":return Ng[UA>>3];default:Ht("invalid type for getValue: "+d)}return null}rg=[],typeof Yt!="object"&&Ht("no native wasm support detected");var Re=!1;function Le(UA,d){UA||Ht("Assertion failed: "+d)}var pg,re,lg,Be,Wt,ae,Ng,xe=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function BB(UA,d,S){for(var G=d+S,m=d;UA[m]&&!(m>=G);)++m;if(m-d>16&&UA.subarray&&xe)return xe.decode(UA.subarray(d,m));for(var M="";d>10,56320|1023&nA)}}else M+=String.fromCharCode((31&T)<<6|q)}else M+=String.fromCharCode(T)}return M}function Ug(UA,d){return UA?BB(lg,UA,d):""}function aB(UA,d){return UA%d>0&&(UA+=d-UA%d),UA}function Je(UA){pg=UA,L.HEAP8=re=new Int8Array(UA),L.HEAP16=Be=new Int16Array(UA),L.HEAP32=Wt=new Int32Array(UA),L.HEAPU8=lg=new Uint8Array(UA),L.HEAPU16=new Uint16Array(UA),L.HEAPU32=new Uint32Array(UA),L.HEAPF32=ae=new Float32Array(UA),L.HEAPF64=Ng=new Float64Array(UA)}var ne,Pe=L.INITIAL_MEMORY||16777216;(_g=L.wasmMemory?L.wasmMemory:new Yt.Memory({initial:Pe/65536,maximum:32768}))&&(pg=_g.buffer),Pe=pg.byteLength,Je(pg);var Ke=[],qe=[],nB=[],Te=[];function iB(){if(L.preRun)for(typeof L.preRun=="function"&&(L.preRun=[L.preRun]);L.preRun.length;)EB(L.preRun.shift());Mg(Ke)}function oB(){Mg(qe)}function CB(){Mg(nB)}function QB(){if(L.postRun)for(typeof L.postRun=="function"&&(L.postRun=[L.postRun]);L.postRun.length;)sB(L.postRun.shift());Mg(Te)}function EB(UA){Ke.unshift(UA)}function sB(UA){Te.unshift(UA)}qe.push({func:function(){ze()}});var Ot=0,wg=null;function cB(UA){Ot++,L.monitorRunDependencies&&L.monitorRunDependencies(Ot)}function hB(UA){if(Ot--,L.monitorRunDependencies&&L.monitorRunDependencies(Ot),Ot==0&&wg){var d=wg;wg=null,d()}}function Ht(UA){throw L.onAbort&&L.onAbort(UA),ug(UA+=""),Re=!0,UA="abort("+UA+"). Build with -s ASSERTIONS=1 for more info.",new Yt.RuntimeError(UA)}function Ve(UA,d){return String.prototype.startsWith?UA.startsWith(d):UA.indexOf(d)===0}L.preloadedImages={},L.preloadedAudios={};var Xe="data:application/octet-stream;base64,";function ie(UA){return Ve(UA,Xe)}var yB="file://";function We(UA){return Ve(UA,yB)}var Bg,oe,_t="<<< WASM_BINARY_FILE >>>";function Oe(UA){try{if(UA==_t&&rg)return new Uint8Array(rg);var d=jt(UA);if(d)return d;if(Ig)return Ig(UA);throw"both async and sync fetching of the wasm failed"}catch(S){Ht(S)}}function fB(){if(!rg&&(K0||J0)){if(typeof fetch=="function"&&!We(_t))return fetch(_t,{credentials:"same-origin"}).then(function(UA){if(!UA.ok)throw"failed to load wasm binary file at '"+_t+"'";return UA.arrayBuffer()}).catch(function(){return Oe(_t)});if(te)return new Promise(function(UA,d){te(_t,function(S){UA(new Uint8Array(S))},d)})}return Promise.resolve().then(function(){return Oe(_t)})}function IB(){var UA={a:Ze};function d(m,M){var T=m.exports;L.asm=T,ne=L.asm.h,hB()}function S(m){d(m.instance)}function G(m){return fB().then(function(M){return Yt.instantiate(M,UA)}).then(m,function(M){ug("failed to asynchronously prepare wasm: "+M),Ht(M)})}if(cB(),L.instantiateWasm)try{return L.instantiateWasm(UA,d)}catch(m){return ug("Module.instantiateWasm callback failed with error: "+m),!1}return rg||typeof Yt.instantiateStreaming!="function"||ie(_t)||We(_t)||typeof fetch!="function"?G(S):fetch(_t,{credentials:"same-origin"}).then(function(m){return Yt.instantiateStreaming(m,UA).then(S,function(M){return ug("wasm streaming compile failed: "+M),ug("falling back to ArrayBuffer instantiation"),G(S)})}),{}}ie(_t)||(_t=gB(_t));var uB={1024:function(){return L.getRandomValue()},1062:function(){if(L.getRandomValue===void 0)try{var UA=typeof window=="object"?window:self,d=UA.crypto!==void 0?UA.crypto:UA.msCrypto,S=function(){var M=new Uint32Array(1);return d.getRandomValues(M),M[0]>>>0};S(),L.getRandomValue=S}catch{try{var G=require("crypto"),m=function(){var T=G.randomBytes(4);return(T[0]<<24|T[1]<<16|T[2]<<8|T[3])>>>0};m(),L.getRandomValue=m}catch{throw"No secure random number generator found"}}}};function Mg(UA){for(;UA.length>0;){var d=UA.shift();if(typeof d!="function"){var S=d.func;typeof S=="number"?d.arg===void 0?ne.get(S)():ne.get(S)(d.arg):S(d.arg===void 0?null:d.arg)}else d(L)}}function _B(UA,d,S,G){Ht("Assertion failed: "+Ug(UA)+", at: "+[d?Ug(d):"unknown filename",S,G?Ug(G):"unknown function"])}function pB(){Ht()}function lB(UA,d,S){var G=kB(d,S);return uB[UA].apply(null,G)}function wB(UA,d,S){lg.copyWithin(UA,d,d+S)}function DB(){return lg.length}function dB(UA){try{return _g.grow(UA-pg.byteLength+65535>>>16),Je(_g.buffer),1}catch{}}function FB(UA){UA>>>=0;var d=DB(),S=2147483648;if(UA>S)return!1;for(var G=1;G<=4;G*=2){var m=d*(1+.2/G);if(m=Math.min(m,UA+100663296),dB(Math.min(S,aB(Math.max(16777216,UA,m),65536))))return!0}return!1}function mB(UA){return Wt[$e()>>2]=UA,UA}function vB(UA){switch(UA){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return mB(28),-1}var Ce=[];function kB(UA,d){var S;for(Ce.length=0,d>>=2;S=lg[UA++];){var G=S<105;G&&1&d&&d++,Ce.push(G?Ng[d++>>1]:Wt[d]),++d}return Ce}function je(UA){for(var d=[],S=0;S255&&(G&=255),d.push(String.fromCharCode(G))}return d.join("")}var GB=typeof atob=="function"?atob:function(UA){var d,S,G,m,M,T,q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Z="",nA=0;UA=UA.replace(/[^A-Za-z0-9\+\/\=]/g,"");do d=q.indexOf(UA.charAt(nA++))<<2|(m=q.indexOf(UA.charAt(nA++)))>>4,S=(15&m)<<4|(M=q.indexOf(UA.charAt(nA++)))>>2,G=(3&M)<<6|(T=q.indexOf(UA.charAt(nA++))),Z+=String.fromCharCode(d),M!==64&&(Z+=String.fromCharCode(S)),T!==64&&(Z+=String.fromCharCode(G));while(nA0||(iB(),Ot>0||(L.setStatus?(L.setStatus("Running..."),setTimeout(function(){setTimeout(function(){L.setStatus("")},1),d()},1)):d()))}if(L._malloc=function(){return(L._malloc=L.asm.Bc).apply(null,arguments)},L._free=function(){return(L._free=L.asm.Cc).apply(null,arguments)},L.setValue=eB,L.getValue=rB,L.UTF8ToString=Ug,wg=function UA(){Rg||Qe(),Rg||(wg=UA)},L.run=Qe,L.preInit)for(typeof L.preInit=="function"&&(L.preInit=[L.preInit]);L.preInit.length>0;)L.preInit.pop()();Qe()})};var e0,R=R!==void 0?R:{},i0={};for(e0 in R)R.hasOwnProperty(e0)&&(i0[e0]=R[e0]);var $A=!1,pA=!1,u0=!1,kA=!1;$A=typeof window=="object",pA=typeof importScripts=="function",u0=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",kA=!$A&&!u0&&!pA;var dA,QA,F0,FA,KA,IA="";function l0(MA){return R.locateFile?R.locateFile(MA,IA):IA+MA}u0?(IA=pA?require$$0.dirname(IA)+"/":__dirname+"/",dA=function(MA,WA){var c0=Xt(MA);return c0?WA?c0:c0.toString():(FA||(FA=require$$0),KA||(KA=require$$0),MA=KA.normalize(MA),FA.readFileSync(MA,WA?null:"utf8"))},F0=function(MA){var WA=dA(MA,!0);return WA.buffer||(WA=new Uint8Array(WA)),De(WA.buffer),WA},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),oA.exports=R,R.inspect=function(){return"[Emscripten Module object]"}):kA?(typeof read!="undefined"&&(dA=function(MA){var WA=Xt(MA);return WA?Ne(WA):read(MA)}),F0=function(MA){var WA;return(WA=Xt(MA))?WA:typeof readbuffer=="function"?new Uint8Array(readbuffer(MA)):(De(typeof(WA=read(MA,"binary"))=="object"),WA)},typeof scriptArgs!="undefined"&&scriptArgs,typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):($A||pA)&&(pA?IA=self.location.href:typeof document!="undefined"&&document.currentScript&&(IA=document.currentScript.src),IA=IA.indexOf("blob:")!==0?IA.substr(0,IA.lastIndexOf("/")+1):"",dA=function(MA){try{var WA=new XMLHttpRequest;return WA.open("GET",MA,!1),WA.send(null),WA.responseText}catch(L){var c0=Xt(MA);if(c0)return Ne(c0);throw L}},pA&&(F0=function(MA){try{var WA=new XMLHttpRequest;return WA.open("GET",MA,!1),WA.responseType="arraybuffer",WA.send(null),new Uint8Array(WA.response)}catch(L){var c0=Xt(MA);if(c0)return c0;throw L}}),QA=function(MA,WA,c0){var L=new XMLHttpRequest;L.open("GET",MA,!0),L.responseType="arraybuffer",L.onload=function(){if(L.status==200||L.status==0&&L.response)WA(L.response);else{var b0=Xt(MA);b0?WA(b0.buffer):c0()}},L.onerror=c0,L.send(null)}),R.print;var EA,At,j0=R.printErr||void 0;for(e0 in i0)i0.hasOwnProperty(e0)&&(R[e0]=i0[e0]);function Pt(MA,WA,c0,L){switch((c0=c0||"i8").charAt(c0.length-1)==="*"&&(c0="i32"),c0){case"i1":case"i8":Xg[MA>>0]=WA;break;case"i16":Wg[MA>>1]=WA;break;case"i32":Tt[MA>>2]=WA;break;case"i64":zg=[WA>>>0,(eg=WA,+Math.abs(eg)>=1?eg>0?(0|Math.min(+Math.floor(eg/4294967296),4294967295))>>>0:~~+Math.ceil((eg-+(~~eg>>>0))/4294967296)>>>0:0)],Tt[MA>>2]=zg[0],Tt[MA+4>>2]=zg[1];break;case"float":Og[MA>>2]=WA;break;case"double":bg[MA>>3]=WA;break;default:St("invalid type for setValue: "+c0)}}function Kt(MA,WA,c0){switch((WA=WA||"i8").charAt(WA.length-1)==="*"&&(WA="i32"),WA){case"i1":case"i8":return Xg[MA>>0];case"i16":return Wg[MA>>1];case"i32":case"i64":return Tt[MA>>2];case"float":return Og[MA>>2];case"double":return bg[MA>>3];default:St("invalid type for getValue: "+WA)}return null}i0=null,R.arguments&&R.arguments,R.thisProgram&&R.thisProgram,R.quit&&R.quit,R.wasmBinary&&(EA=R.wasmBinary),R.noExitRuntime&&R.noExitRuntime,typeof WebAssembly!="object"&&St("no native wasm support detected");var qt=!1;function De(MA,WA){MA||St("Assertion failed: "+WA)}var de,Xg,yg,Wg,Tt,Og,bg,Fe=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function vr(MA,WA,c0){for(var L=WA+c0,b0=WA;MA[b0]&&!(b0>=L);)++b0;if(b0-WA>16&&MA.subarray&&Fe)return Fe.decode(MA.subarray(WA,b0));for(var K0="";WA>10,56320|1023&ut)}}else K0+=String.fromCharCode((31&J0)<<6|st)}else K0+=String.fromCharCode(J0)}return K0}function Sg(MA,WA){return MA?vr(yg,MA,WA):""}function kr(MA,WA){return MA%WA>0&&(MA+=WA-MA%WA),MA}function me(MA){de=MA,R.HEAP8=Xg=new Int8Array(MA),R.HEAP16=Wg=new Int16Array(MA),R.HEAP32=Tt=new Int32Array(MA),R.HEAPU8=yg=new Uint8Array(MA),R.HEAPU16=new Uint16Array(MA),R.HEAPU32=new Uint32Array(MA),R.HEAPF32=Og=new Float32Array(MA),R.HEAPF64=bg=new Float64Array(MA)}R.INITIAL_MEMORY;var jg,ve=[],ke=[],Gr=[],Ge=[];function br(){if(R.preRun)for(typeof R.preRun=="function"&&(R.preRun=[R.preRun]);R.preRun.length;)Nr(R.preRun.shift());Yg(ve)}function Sr(){Yg(ke)}function Yr(){Yg(Gr)}function Hr(){if(R.postRun)for(typeof R.postRun=="function"&&(R.postRun=[R.postRun]);R.postRun.length;)Ur(R.postRun.shift());Yg(Ge)}function Nr(MA){ve.unshift(MA)}function Ur(MA){Ge.unshift(MA)}ke.push({func:function(){Ue()}});var Vt=0,fg=null;function Mr(MA){Vt++,R.monitorRunDependencies&&R.monitorRunDependencies(Vt)}function Rr(MA){if(Vt--,R.monitorRunDependencies&&R.monitorRunDependencies(Vt),Vt==0&&fg){var WA=fg;fg=null,WA()}}function St(MA){throw R.onAbort&&R.onAbort(MA),j0(MA+=""),qt=!0,MA="abort("+MA+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(MA)}function be(MA,WA){return String.prototype.startsWith?MA.startsWith(WA):MA.indexOf(WA)===0}R.preloadedImages={},R.preloadedAudios={};var Se="data:application/octet-stream;base64,";function Zg(MA){return be(MA,Se)}var Lr="file://";function Ye(MA){return be(MA,Lr)}var eg,zg,It="data:application/octet-stream;base64,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CiASfnwgCSALfnwiEUKAgIAQfCIUQhqHfCIiQoCAgAh8IiNCGYd8IhkgGUKAgIAQfCIZQoCAgOAPg30+AgggACASIBh+IA0gDn58IAkgEH58IAwgHH58IAsgF358IBNCGod8IhMgE0KAgIAIfCITQoCAgPAPg30+AhwgACAMIBp+IAkgFX58IBAgFn58IAogD358IAsgDX58IBlCGod8IgogCkKAgIAIfCIKQoCAgPAPg30+AgwgACAQIBJ+IA0gDX58IA4gD358IAkgG358IAwgF358IAsgA6wiDX58IBNCGYd8IgsgC0KAgIAQfCILQoCAgOAPg30+AiAgACAgICFCgICA8A+DfSAeIB9CgICAYIN9IApCGYd8IgpCgICAEHwiD0IaiHw+AhQgACAKIA9CgICA4A+DfT4CECAAIA4gEH4gGCAdfnwgEiAcfnwgCSAXfnwgDCANfnwgC0Iah3wiCSAJQoCAgAh8IglCgICA8A+DfT4CJCAAICIgI0KAgIDwD4N9IBEgFEKAgIBgg30gCUIZh0ITfnwiCUKAgIAQfCIMQhqIfD4CBCAAIAkgDEKAgIDgD4N9PgIACxAAIAAzAAAgADEAAkIQhoQL8wICAn8BfgJAIAJFDQAgACACaiIDQQFrIAE6AAAgACABOgAAIAJBA0kNACADQQJrIAE6AAAgACABOgABIANBA2sgAToAACAAIAE6AAIgAkEHSQ0AIANBBGsgAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkEgayICQR9LDQALCyAACwkAIAAgATcAAAuCBAEDfyACQYAETwRAIAAgASACEAQaIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAkEBSARAIAAhAgwBCyAAQQNxRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADTw0BIAJBA3ENAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAvsAQESfyACKAIEIQMgASgCBCEEIAIoAgghBSABKAIIIQYgAigCDCEHIAEoAgwhCCACKAIQIQkgASgCECEKIAIoAhQhCyABKAIUIQwgAigCGCENIAEoAhghDiACKAIcIQ8gASgCHCEQIAIoAiAhESABKAIgIRIgAigCJCETIAEoAiQhFCAAIAIoAgAgASgCAGo2AgAgACATIBRqNgIkIAAgESASajYCICAAIA8gEGo2AhwgACANIA5qNgIYIAAgCyAMajYCFCAAIAkgCmo2AhAgACAHIAhqNgIMIAAgBSAGajYCCCAAIAMgBGo2AgQLGAEBf0HEnAIoAgAiAARAIAARDgALEAIAC0ABA38gACABIAFB+ABqIgIQCyAAQShqIAFBKGoiAyABQdAAaiIEEAsgAEHQAGogBCACEAsgAEH4AGogASADEAsL7AEBEn8gAigCBCEDIAEoAgQhBCACKAIIIQUgASgCCCEGIAIoAgwhByABKAIMIQggAigCECEJIAEoAhAhCiACKAIUIQsgASgCFCEMIAIoAhghDSABKAIYIQ4gAigCHCEPIAEoAhwhECACKAIgIREg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czYCFCABIAUgEHM2AhAgASAEIA9zNgIMIAEgAyANczYCCCABIAAgC3M2AgQgASAWIBdzNgIACykBAX8jAEGAAWsiAiQAIAJBCGogARDoAiAAIAJBCGoQOSACQYABaiQACzIBAX8gACABIAFB+ABqIgIQCyAAQShqIAFBKGogAUHQAGoiARALIABB0ABqIAEgAhALC68CARN/IAEoAgQhDCAAKAIEIQMgASgCCCENIAAoAgghBCABKAIMIQ4gACgCDCEFIAEoAhAhDyAAKAIQIQYgASgCFCEQIAAoAhQhByABKAIYIREgACgCGCEIIAEoAhwhEiAAKAIcIQkgASgCICETIAAoAiAhCiABKAIkIRQgACgCJCELIABBACACayICIAAoAgAiFSABKAIAc3EgFXM2AgAgACALIAsgFHMgAnFzNgIkIAAgCiAKIBNzIAJxczYCICAAIAkgCSAScyACcXM2AhwgACAIIAggEXMgAnFzNgIYIAAgByAHIBBzIAJxczYCFCAAIAYgBiAPcyACcXM2AhAgACAFIAUgDnMgAnFzNgIMIAAgBCAEIA1zIAJxczYCCCAAIAMgAyAMcyACcXM2AgQLJAEBfyMAQSBrIgEkACABIAAQLSABQSAQZSEAIAFBIGokACAAC6YEAgp/Dn4gACgCJCEEIAAoAiAhBSAAKAIcIQYgACgCGCEHIAAoAhQhAyACQhBaBEAgAC0AUEVBGHQhCCAAKAIEIglBBWytIRkgACgCCCIKQQVsrSEXIAAoAgwiC0EFbK0hFSAAKAIQIgxBBWytIRMgDK0hGiALrSEYIAqtIRYgCa0hFCAANQIAIRIDQCABKAADQQJ2Qf///x9xIAdqrSINIBh+IAEoAABB////H3EgA2qtIg4gGn58IAEoAAZBBHZB////H3EgBmqtIg8gFn58IAEoAAlBBnYgBWqtIhAgFH58IAQgCGogASgADEEIdmqtIhEgEn58IA0gFn4gDiAYfnwgDyAUfnwgECASfnwgESATfnwgDSAUfiAOIBZ+fCAPIBJ+fCAQIBN+fCARIBV+fCANIBJ+IA4gFH58IA8gE358IBAgFX58IBEgF358IA0gE34gDiASfnwgDyAVfnwgECAXfnwgESAZfnwiDUIaiEL/////D4N8Ig5CGohC/////w+DfCIPQhqIQv////8Pg3wiEEIaiEL/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aiAFIAYQDCAJQQhqIAYQESAJQdAAaiAJQQhqQggQDCAAIAMgBCAHIAgQogEgCUHQAGogACAEEAwgCUEIaiAEEBEgCUHQAGogCUEIakIIEAwgCUHQAGogARAjIAlB0ABqQYACEAkgAgRAIAJCEDcDAAsgCUHQAmokAEEACygAIAJCgICAgBBaBEAQFAALIAAgASACIANCASAEQfCXAigCABEVABoLFgAgAELAACABIAJB6JcCKAIAEREAGgsyACAAIAIEfyACKAAABUEACzYCMCAAIAEoAAA2AjQgACABKAAENgI4IAAgASgACDYCPAs9ACAAAn8gAgRAIAAgAigAADYCMCACKAAEDAELIABBADYCMEEACzYCNCAAIAEoAAA2AjggACABKAAENgI8CxkAIAAgASACIANCASAEQeSXAigCABEVABoLKAEBfyMAQRBrIgAkACAAQQA6AA9BpgggAEEPakEAEAEaIABBEGokAAtqAQN/IwBBEGsiAyQAIANBADoAD0F/IQUgACABIAJB2JcCKAIAEQMARQRAA0AgAyAAIARqLQAAIAMtAA9yOgAPIARBAWoiBEEgRw0AC0EAIAMtAA9BAWtBCHZBAXFrIQULIANBEGokACAFCxMAIAAgAUHAB2xBoBtqIAIQ5gILEAAgAEIANwIAIABCADcCCAsdACAAEDggAEEoahAdIABB0ABqEB0gAEH4AGoQOAuAAgEIfwNAIAAgAmogASACQQN2ai0AACACQQdxdkEBcToAACACQQFqIgJBgAJHDQALA0AgBCIBQQFqIQQCQCAAIAFqIgYtAABFDQAgBCECQQEhBSABQf4BSw0AA0ACQCAAIAJqIgMsAAAiB0UNACAHIAV0IgcgBiwAACIIaiIJQQ9MBEAgBiAJOgAAIANBADoAAAwBCyAIIAdrIgNBcUgNAiAGIAM6AAADQCAAIAJqIgMtAABFBEAgA0EBOgAADAILIANBADoAACACQf8BSSEDIAJBAWohAiADDQALCyAFQQVLDQEgBUEBaiIFIAFqIgJBgAJJDQALCyAEQYACRw0ACwuVAQEEfyMAQTBrIgUkACAAIAFBKGoiAyABEBMgAEEoaiIEIAMgARAWIABB0ABqIgMgACACQShqEAsgBCAEIAIQCyAAQfgAaiIGIAJB+ABqIAFB+ABqEAsgACABQdAAaiACQdAA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CSACQYAIaiQAC/ADAQJ/IwAiAyEEIANBwANrQUBxIgMkACAARSABRXJFBEAgA0FAa0EAQQBBwAAQPhogA0E8aiABKAIwEAogA0FAayADQTxqQgQQGBogA0E8aiABKAIEEAogA0FAayADQTxqQgQQGBogA0E8aiABKAIsEAogA0FAayADQTxqQgQQGBogA0E8aiABKAIoEAogA0FAayADQTxqQgQQGBogA0E8akETEAogA0FAayADQTxqQgQQGBogA0E8aiACEAogA0FAayADQTxqQgQQGBogA0E8aiABKAIMEAogA0FAayADQTxqQgQQGBoCQCABKAIIIgJFDQAgA0FAayACIAE1AgwQGBogAS0AOEEBcUUNACABKAIIIAEoAgwQCSABQQA2AgwLIANBPGogASgCFBAKIANBQGsgA0E8akIEEBgaIAEoAhAiAgRAIANBQGsgAiABNQIUEBgaCyADQTxqIAEoAhwQCiADQUBrIANBPGpCBBAYGgJAIAEoAhgiAkUNACADQUBrIAIgATUCHBAYGiABLQA4QQJxRQ0AIAEoAhggASgCHBAJIAFBADYCHAsgA0E8aiABKAIkEAogA0FAayADQTxqQgQQGBogASgCICICBEAgA0FAayACIAE1AiQQGBoLIANBQGsgAEHAABA9GgsgBCQAC68BAQN/IwBBEGsiAiQAQWohAwJAIABFIAFFcg0AIAFBCnQiBCABbkGACEcNACAAQQwQICIBNgIAIAFFDQAgAUIANwIAQYCYAiACQQxqIAQQsgEiATYCAAJAAkAgAQRAIAJBADYCDAwBCyACKAIMIgENAQsgACgCABAZIABBADYCAAwBCyAAKAIAIAE2AgAgACgCACABNgIEIAAoAgAgBDYCCEEAIQMLIAJBEGokACADC4cBAQJ/IwBB0ABrIgMkAEFnIQICQCAARSABRXINACAAIAAoAhRBA3QQICICNgIEIAJFBEBBaiECDAELIAAgACgCEBC8ASICBEAgACABKAI4EIMBDAELIAMgASAAKAIkELsBIANBQGtBCBAJIAMgABC6ASADQcgAEAlBACECCyADQdAAaiQAIAILkwEBBH8jAEEgayICJAACQCAARQ0AIAAoAhxFDQAgAiABNgIQQQEhBANAIAIgAzoAGEEAIQFBACEFIAQEQANAIAJBADYCHCACIAIpAxg3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ACAAIAEgAiADrSAErUIghoQgBSAGEGoLFwAgACABIAKtIAOtQiCGhCAEIAUQuwILFgAgACABKQAANwAwIAAgASkACDcAOAsYACAAIAEgAiADrSAErUIghoQgBSAGEGsLEwAgACABrSACrUIghoQgAxCSAgsTACAAIAEgAq0gA61CIIaEEJMCCyEAIAAgASACrSADrUIghoQgBK0gBa1CIIaEIAYgBxCUAgsfACAAIAEgAq0gA61CIIaEIAStIAWtQiCGhCAGEIwBCy0AIAAgAa0gAq1CIIaEIAMgBK0gBa1CIIaEIAYgB60gCK1CIIaEIAkgChCVAgsXACAAIAEgAq0gA61CIIaEIAQgBRCzAgsSACAAIAEgAq0gA61CIIaEEDQLEgAgACABIAKtIAOtQiCGhBAlCxkAIAAgASACIAOtIAStQiCGhCAFIAYQlAELFgAgACABKQAANwAgIAAgASkACDcAKAsXACAAIAEgAq0gA61CIIaEIAQgBRC1AgsVACAAIAEgAq0gA61CIIaEIAQQtgILGQAgACABIAKtIAOtQiCGhCAEIAUgBhCVAQsXACAAIAEgAq0gA61CIIaEIAQgBRC4AgsbACAAIAEgAiADrSAErUIghoQgBSAGIAcQlgELGAAgACABIAIgA60gBK1CIIaEIAUgBhBoCxkAIAAgASACrSADrUIghoQgBCAFIAYQlwELFwAgACABIAKtIAOtQiCGhCAEIAUQuQILGwAgACABIAIgA60gBK1CIIaEIAUgBiAHEJgBCxgAIAAgASACIAOtIAStQiCGhCAFIAYQaQsVACAAIAEgAq0gA61CIIaEIAQQwAILFQAgACABIAKtIAOtQiCGhCAEEJoBCyUAIAAgASADIAStIAWtQiCGhCAGIAetIAitQiCGhCAJIAoQyQILJQAgACACIAOtIAStQiCGhCAFIAYgB60gCK1CIIaEIAkgChCcAQslACAAIAEgAiADrSAErUIghoQgBSAGrSAHrUIghoQgCSAKEMsCCycAIAAgASACIAMgBK0gBa1CIIaEIAYgB60gCK1CIIaEIAogCxCdAQslACAAIAEgAyAErSAFrUIghoQgBiAHrSAIrUIghoQgCSAKEM8CCyUAIAAgAiADrSAErUIghoQgBSAGIAetIAitQiCGhCAJIAoQngELJQAgACABIAMgBK0gBa1CIIaEIAYgB60gCK1CIIaEIAkgChDQAgslACAAIAIgA60gBK1CIIaEIAUgBiAHrSAIrUIghoQgCSAKEJ8BCyUAIAAgASACIAOtIAStQiCGhCAFIAatIAetQiCGhCAJIAoQ0QILJwAgACABIAIgAyAErSAFrUIghoQgBiAHrSAIrUIghoQgCiALEKABCyUAIAAgASACIAOtIAStQiCGhCAFIAatIAetQiCGhCAJIAoQ0gILJwAgACABIAIgAyAErSAFrUIghoQgBiAHrSAIrUIghoQgCiALEKEBCwQAQQoLBgBBspcCCwsAIAAgASACEIICCw0AIAAgASACIAMQgwILCAAgABA1QQALCQAgACABEIgCCwsAIAAgASACEIoBCwUAQb9/CwUAQdABCywBAX8jAEFAaiIDJAAgACADECcgASADQsAAIAJBARCHASEAIANBQGskACAACy4BAX8jAEFAaiIEJAAgACAEECcgASACIARCwAAgA0EBEIkBIQAgBEFAayQAIAALewEBfwJAAkACQCADQsAAVA0AIANCQHwiA0K/////D1YNACACIAJBQGsiBSADIAQQhgFFDQEgAEUNACAAQQAgA6cQEBoLQX8hAiABRQ0BIAFCADcDAEF/DwsgAQRAIAEgAzcDAAtBACECIABFDQAgACAFIAOnEEcaCyACC3MBAX8jAEEQayIFJAAgACAFQQhqIABBQGsgAiADpyICEEcgAyAEEIgBGgJAIAUpAwhCwABSBEAgAQRAIAFCADcDAAsgAEEAIAJBQGsQEBpBfyEADAELQQAhACABRQ0AIAEgA0JAfTcDAAsgBUEQaiQAIAALbQEBfyMAQUBqIgIkACACIAFCIBA0GiACIAItAABB+AFxOgAAIAIgAi0AH0E/cUHAAHI6AB8gACACKQMQNwAQIAAgAikDCDcACCAAIAIpAwA3AAAgACACKQMYNwAYIAJBwAAQCSACQUBrJABBAAuGAQECfyMAQYACayICJABBfyEDAkAgARB1DQAgAkHgAGogARCuAQ0AIAJB4ABqEOUCRQ0AIAIQHSACIAIgAkGIAWoiARAWIAJBMGoQHSACQTBqIAJBMGogARATIAIgAhA6IAJBMGogAkEwaiACEAsgACACQTBqEC1BACEDCyACQYACaiQAIAMLLAEBfyMAQSBrIgIkACACQSAQHyAAIAEg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ASACQhB9IAMgBBBqBSAFCwslACACQvD///8PWgRAEBQACyAAQRBqIAAgASACIAMgBBBrGkEACwsAIAAgASACEL8CCy8AIAFCgICAgBBaBEBBACIAQYQOaiAAQZgOakHFASAAQbIOahAAAAsgACABpxAfCzMBAn8jAEEgayIDJABBfyEEIAMgAiABEKgBRQRAIABB4JUCIAMQbSEECyADQSBqJAAgBAtWAQF/IwBBQGoiAyQAIAMgAkIgEDQaIAEgAykDGDcAGCABIAMpAxA3ABAgASADKQMINwAIIAEgAykDADcAACADQcAAEAkgACABEHIhACADQUBrJAAgAAtAAQF/IwBBIGsiBCQAIAQgASACIAMQmgEaIAAgBBCAASEBIAQgAEEgEEUhAyAEQSBqJAAgA0F/IAEgACAERhtyC0MBAX8jAEFAaiICJAAgACACEMICIAEgAikDGDcAGCABIAIpAxA3ABAgASACKQMINwAIIAEgAikDADcAACACQUBrJAALNwEBfyMAQUBqIgIkACAAIAIQJyAAQdABaiIAIAJCwAAQHBogACABECcgAkHAABAJIAJBQGskAAvhAQEDfyMAQcABayICJAAgABA1IAJBQGtBNkGAARAQGiACIAEtAABBNnM6AEBBASEDA0AgAkFAayADaiIEIAQtAAAgASADai0AAHM6AAAgA0EBaiIDQSBHDQALIAAgAkFAa0KAARAcGiAAQdABaiIAEDUgAkFAa0HcAEGAARAQGiACIAEtAABB3ABzOgBAQQEhAwNAIAJBQGsgA2oiBCAELQAAIAEgA2otAABzOgAAIANBAWoiA0EgRw0ACyAAIAJBQGtCgAEQHBogAkFAa0GAARAJIAJBwAAQCSACQcABaiQAC2YBAX4gACkAACIBQjiGIAFCKIZCgICAgICAwP8Ag4QgAUIYhkKAgICAgOA/gyABQgiGQoCAgIDwH4OEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhAsmAQJ/AkBBpJwCKAIAIgBFDQAgACgCFCIARQ0AIAARAQAhAQsgAQtkACAAIAFCKIZCgICAgICAwP8AgyABQjiGhCABQhiGQoCAgICA4D+DIAFCCIZCgICAgPAfg4SEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4D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BiADakENEAggDXMiDSAGakESEAggBXMhBSAaQRJJIRAgGkECaiEaIBANAAsgACACQeXwwYsGahAKIABBBGogByASahAKIABBCGogCCATahAKIABBDGogESAUahAKIABBEGogCSAVahAKIABBFGogDkHuyIGZA2oQCiAAQRhqIAogG2oQCiAAQRxqIAsgHGoQCiAAQSBqIAwgHWoQCiAAQSRqIA8gHmoQCiAAQShqIAFBstqIywdqEAogAEEsaiAEIBZqEAogAEEwaiADIBdqEAogAEE0aiAGIBhqEAogAEE4aiANIBlqEAogAEE8aiAFQfTKgdkGahAKCzoBAX8jAEHgAGsiAyQAIANBMGogAiABEBMgAyACIAEQFiADIAMQOiAAIANBMGogAxALIANB4ABqJAALdgECfyMAQdABayICJAADQCAAIANqIAEgA2otAAA6AAAgA0EBaiIDQSBHDQALIAAgAC0AAEH4AXE6AAAgACAALQAfQT9xQcAAcjoAHyACQTBqIAAQdiACIAJB2ABqIAJBgAFqENwCIAAgAhAtIAJB0AFqJABBAAu9AwEMfiABNAIEIQIgATQCCCEDIAE0AgwhBCABNAIQIQUgATQCFCEGIAE0AhghByABNAIAIQsgACABNAIkQsK2B34iCCAIQoCAgAh8IghCgICA8A+DfSABNAIgQsK2B34gATQCHELCtgd+IglCgICACHwiCkIZh3wiDEKAgIAQfCINQhqIfD4CJCAAIAwgDUKAgIDgD4N9PgIgIAAgCSAKQoCAgPAPg30gB0LCtgd+IAZCwrYHfiIGQoCAgAh8IgdCGYd8IglCgICAEHwiCkIaiHw+AhwgACAJIApCgICA4A+DfT4CGCAAIAYgB0KAgIDwD4N9IAVCwrYHfiAEQsK2B34iBEKAgIAIfCIFQhmHfCIGQoCAgBB8IgdCGoh8PgIUIAAgBiAHQoCAgOAPg30+AhAgACAEIAVCgICA8A+DfSADQsK2B34gAkLCtgd+IgJCgICACHwiA0IZh3wiBEKAgIAQfCIFQhqIfD4CDCAAIAQgBUKAgIDgD4N9PgIIIAAgAiADQoCAgPAPg30gCEIZh0ITfiALQsK2B358IgJCgICAEHwiA0IaiHw+AgQgACACIANCgICA4A+DfT4CAAvcAQEFfyMAQRBrIgNBADYACyADQQA2AggDQCAAIAJqLQAAIQRBACEBA0AgA0EIaiABaiIFIAUtAAAgAUEFdEGgjQJqIAJqLQAAIARzcjoAACABQQFqIgFBB0cNAAsgAkEBaiICQR9HDQALIAAtAB9B/wBxIQJBACEAQQAhAQNAIANBCGogAWoiBCAELQAAIAIgAUEFdEG/jQJqLQAAc3I6AAAgAUEBaiIBQQdHDQALQQAhAQNAIANBCGogAGotAABBAWsgAXIhASAAQQFqIgBBB0cNAAsgAUEIdkEBcQvcBAEDfyMAQdACayIDJABBfyEEIAIQ3wJFBEBBACEEA0AgACAEaiABIARqLQAAOgAAIARBAWoiBEEgRw0ACyAAIAAtAABB+AFxOgAAIAAgAC0AH0E/cUHAAHI6AB8gA0GgAmogAhB7IANB8AFqEB0gA0HAAWoQOCADQZABaiADQaACahAsIANB4ABqEB1B/gEhAkEAIQQDQCADQfABaiADQZABaiAAIAIiBUEDdmotAAAgAkEHcXZBAXEiASAEcyIEEE4gA0HAAWogA0HgAGogBBBOIAJBAWshAiADQTBqIANBkAFqIANB4ABqEBYgAyADQfABaiADQcABahAWIANB8AFqIANB8AFqIANBwAFqEBMgA0HAAWogA0GQAWogA0HgAGoQEyADQeAAaiADQTBqIANB8AFqEAsgA0HAAWogA0HAAWogAxALIANBMGogAxAOIAMgA0HwAWoQDiADQZABaiADQeAAaiADQcABahATIANBwAFqIANB4ABqIANBwAFqEBYgA0HwAWogAyADQTBqEAsgAyADIANBMGoQFiADQcABaiADQcABahAOIANB4ABqIAMQ3gIgA0GQAWogA0GQAWoQDiADQTBqIANBMGogA0HgAGoQEyADQeAAaiADQaACaiADQcABahALIANBwAFqIAMgA0EwahALIAEhBCAFDQALIANB8AFqIANBkAFqIAEQTiADQcABaiADQeAAaiABEE4gA0HAAWogA0HAAWoQOiADQfABaiADQfABaiADQcABahALIAAgA0HwAWoQLUEAIQQLIANB0AJqJAAgBAtUAQV/QSAhAUEBIQIDQCAAIAFBAWsiAWotAAAiBCABQYAbai0AACIFa0EIdSACcSADQf8BcXIhAyAEIAVzQf//A2pBCHYgAnEhAiABDQALIANBAEcL6B4BOn4gARAPIRIg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CiAAIAtC////AIMgBEIVh3wiBkIKiDwAESAAIAZCAog8ABAgACAEQv///wCDIgdCAYYgBUIUiIQ8AA0gACAMQv///wCDIAZCFYd8IgRCDYg8ABQgACAEQgWIPAATIAAgBkL///8AgyIFQgaGIAdCD4iEPAAPIAAgDkL///8AgyAEQhWHfCIGPAAVIAAgBEIDhiAFQhKIhDwAEiAAIAZCCIg8ABYgACAPQv///wCDIAZCFYd8IgRCC4g8ABkgACAEQgOIPAAYIAAgEEL///8AgyAEQhWHfCIFQgaIPAAbIAAgBkIQiEIfgyAEQv///wCDIgRCBYaEPAAXIAAgDUL///8AgyAFQhWHfCIGQhGIPAAfIAAgBkIJiDwAHiAAIAZCAYg8AB0gACAFQv///wCDIgVCAoYgBEITiIQ8ABogACAGQgeGIAVCDoiEPAAcC1IBA38gAC0AH0F/c0H/AHEhAUEeIQIDQCABIAAgAmotAABBf3NyIQEgAkEBayIDIQIgAw0ACyABQf8BcUEBa0HsASAALQAAa3FBCHZBf3NBAXELjAQBAn8jAEHgDWsiAiQAIAJB4ANqIAEQGyACQcACaiABEE8gAiACQcACahAVIAJBwAJqIAIgAkHgA2oQGiACQaABaiACQcACahAVIAJBgAVqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJBoAZqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJBwAdqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJB4AhqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJBgApqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJBoAtqIgEgAkGgAWoQGyACQcACaiACIAEQGiACQaABaiACQcACahAVIAJBwAxqIAJBoAFqEBsgABCrAUH8ASEBA0AgAkHAAmogABBPAkAgASIDQaCLAmosAAAiAUEBTgRAIAJBoAFqIAJBwAJqEBUgAkHAAmogAkGgAWogAkHgA2ogAUH+AXFBAXZBoAFsahAaDAELIAFBf0oNACACQaABaiACQcACahAVIAJBwAJqIAJBoAFqIAJB4ANqQQAgAWtB/gFx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/////////3/t////////////////////////////////////////f+7///////////////////////////////////////9/7dP1XBpjEljWnPei3vneFABBnxsL/PABEIU7jAG98ST/+CXDAWDcNwC3TD7/w0I9ADJMpAHhpEz/TD2j/3U+HwBRkUD/dkEOAKJz1v8Gii4AfOb0/wqKjwA0GsIAuPRMAIGPKQG+9BP/e6p6/2KBRAB51ZMAVmUe/6FnmwCMWUP/7+W+AUMLtQDG8In+7kW8/+pxPP8l/zn/RbK2/oDQswB2Gn3+AwfW//EyTf9Vy8X/04f6/xkwZP+71bT+EVhpAFPRngEFc2IABK48/qs3bv/ZtRH/FLyqAJKcZv5X1q7/cnqbAeksqgB/CO8B1uzqAK8F2wAxaj3/BkLQ/wJqbv9R6hP/12vA/0OX7gATKmz/5VVxATJEh/8RagkAMmcB/1ABqAEjmB7/EKi5AThZ6P9l0vwAKfpHAMyqT/8OLu//UE3vAL3WS/8RjfkAJlBM/75VdQBW5KoAnNjQAcPPpP+WQkz/r+EQ/41QYgFM2/IAxqJyAC7amACbK/H+m6Bo/7IJ/P5kbtQADgWnAOnvo/8cl50BZZIK//6eRv5H+eQAWB4yAEQ6oP+/GGgBgUKB/8AyVf8Is4r/JvrJAHNQoACD5nEAfViTAFpExwD9TJ4AHP92AHH6/gBCSy4A5torAOV4ugGURCsAiHzuAbtrxf9UNfb/M3T+/zO7pQACEa8AQlSgAfc6HgAjQTX+Rey/AC2G9QGje90AIG4U/zQXpQC61kcA6bBgAPLvNgE5WYoAUwBU/4igZABcjnj+aHy+ALWxPv/6KVUAmIIqAWD89gCXlz/+74U+ACA4nAAtp73/joWzAYNW0wC7s5b++qoO/0RxFf/eujv/QgfxAUUGSABWnGz+N6dZAG002/4NsBf/xCxq/++VR/+kjH3/n60BADMp5wCRPiEAim9dAblTRQCQcy4AYZcQ/xjkGgAx2eIAcUvq/sGZDP+2MGD/Dg0aAIDD+f5FwTsAhCVR/n1qPADW8KkBpONCANKjTgAlNJcAY00aAO6c1f/VwNEBSS5UABRBKQE2zk8AyYOS/qpvGP+xITL+qybL/073dADR3ZkAhYCyATosGQDJJzsBvRP8ADHl0gF1u3UAtbO4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ANW7ff/oLjz/vnQq/peyE/8zPu3+zOzBAMLoPACsIp3/vRC4/mcDX/+N6ST+KRkL/xXDpgB29S0AQ9WV/58MEv+7pOMBoBkFAAxOwwErxeEAMI4p/sSbPP/fxxIBkYicAPx1qf6R4u4A7xdrAG21vP/mcDH+Sart/+e34/9Q3BQAwmt/AX/NZQAuNMUB0qsk/1gDWv84l40AYLv//ypOyAD+RkYB9H2oAMxEigF810YAZkLI/hE05AB13I/+y/h7ADgSrv+6l6T/M+jQAaDkK//5HRkBRL4/AA0AAAAA/wAAAAD1AAAAAAAA+wAAAAAAAP0AAAAA8wAAAAAHAAAAAAADAAAAAPMAAAAABQAAAAAAAAAACwAAAAAACwAAAADzAAAAAAAA/QAAAAAA/wAAAAADAAAAAPUAAAAAAAAADwAAAAAA/wAAAAD/AAAAAAcAAAAABQBBnI0CCwEBAEHAjQILAQEAQeCNAgugAeDrenw7QbiuFlbj+vGfxGraCY3rnDKx/YZiBRZfSbgAX5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVfs////////////////////////////////////////f+3///////////////////////////////////////9/7v///////////////////////////////////////38AQaCPAgvBBQjJvPNn5glqO6fKhIWuZ7sr+JT+cvNuPPE2HV869U+l0YLmrX9SDlEfbD4rjGgFm2u9Qfur2YMfeSF+ExnN4FsirijXmC+KQs1l7yORRDdxLztN7M/7wLW824mBpdu16Ti1SPNbwlY5GdAFtvER8VmbTxmvpII/khiBbdrVXhyrQgIDo5iqB9i+b3BFAVuDEoyy5E6+hTEk4rT/1cN9DFVviXvydF2+crGWFjv+sd6ANRLHJacG3JuUJmnPdPGbwdJK8Z7BaZvk4yVPOIZHvu+11YyLxp3BD2WcrHfMoQwkdQIrWW8s6S2D5KZuqoR0StT7Qb3cqbBctVMRg9qI+Xar32buUlE+mBAytC1txjGoPyH7mMgnA7DkDu++x39Zv8KPqD3zC+DGJacKk0eRp9VvggPgUWPKBnBuDgpnKSkU/C/SRoUKtycmySZcOCEbLu0qxFr8bSxN37OVnRMNOFPeY6+LVHMKZaiydzy7Cmp25q7tRy7JwoE7NYIUhSxykmQD8Uyh6L+iATBCvEtmGqiRl/jQcItLwjC+VAajUWzHGFLv1hnoktEQqWVVJAaZ1iogcVeFNQ70uNG7MnCgahDI0NK4FsGkGVOrQVEIbDcemeuO30x3SCeoSJvhtbywNGNaycWzDBw5y4pB40qq2E5z42N3T8qcW6O4stbzby5o/LLvXe6Cj3RgLxdDb2OleHKr8KEUeMiE7DlkGggCx4woHmMj+v++kOm9gt7rbFCkFXnGsvej+b4rU3Lj8nhxxpxhJurOPifKB8LAIce4htEe6+DN1n3a6njRbu5/T331um8Xcqpn8AammMiixX1jCq4N+b4EmD8RG0ccEzULcRuEfQQj9XfbKJMkx0B7q8oyvL7JFQq+njxMDRCcxGcdQ7ZCPsu+1MVMKn5l/Jwpf1ns+tY6q2/LXxdYR0qMGURsgABB8JUCC4UBYjY0X3BvcyA8PSBiNjRfbGVuAHNvZGl1bS9jb2RlY3MuYwBzb2RpdW1fYmluMmJhc2U2NAAkYXJnb24yaWQAJGFyZ29uMmkAJHY9ACRtPQAsdD0ALHA9ACRhcmdvbjJpZCR2PQAkYXJnb24yaSR2PQAkYXJnb24yaWQkACRhcmdvbjJpJABBkJcCCyhTaWdFZDI1NTE5IG5vIEVkMjU1MTkgY29sbGlzaW9ucwEAMS4wLjE4AEG8lwILOVCOUAAAQAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQ==";function He(MA){try{if(MA==It&&EA)return new Uint8Array(EA);var WA=Xt(MA);if(WA)return WA;if(F0)return F0(MA);throw"both async and sync fetching of the wasm failed"}catch(c0){St(c0)}}function xr(){if(!EA&&($A||pA)){if(typeof fetch=="function"&&!Ye(It))return fetch(It,{credentials:"same-origin"}).then(function(MA){if(!MA.ok)throw"failed to load wasm binary file at '"+It+"'";return MA.arrayBuffer()}).catch(function(){return He(It)});if(QA)return new Promise(function(MA,WA){QA(It,function(c0){MA(new Uint8Array(c0))},WA)})}return Promise.resolve().then(function(){return He(It)})}function Jr(){var MA={a:tB};function WA(b0,K0){var J0=b0.exports;R.asm=J0,me((At=R.asm.g).buffer),jg=R.asm.h,Rr()}function c0(b0){WA(b0.instance)}function L(b0){return xr().then(function(K0){return WebAssembly.instantiate(K0,MA)}).then(b0,function(K0){j0("failed to asynchronously prepare wasm: "+K0),St(K0)})}if(Mr(),R.instantiateWasm)try{return R.instantiateWasm(MA,WA)}catch(b0){return j0("Module.instantiateWasm callback failed with error: "+b0),!1}return EA||typeof WebAssembly.instantiateStreaming!="function"||Zg(It)||Ye(It)||typeof fetch!="function"?L(c0):fetch(It,{credentials:"same-origin"}).then(function(b0){return WebAssembly.instantiateStreaming(b0,MA).then(c0,function(K0){return j0("wasm streaming compile failed: "+K0),j0("falling back to ArrayBuffer instantiation"),L(c0)})}),{}}Zg(It)||(It=l0(It));var Pr={1024:function(){return R.getRandomValue()},1062:function(){if(R.getRandomValue===void 0)try{var MA=typeof window=="object"?window:self,WA=MA.crypto!==void 0?MA.crypto:MA.msCrypto,c0=function(){var K0=new Uint32Array(1);return WA.getRandomValues(K0),K0[0]>>>0};c0(),R.getRandomValue=c0}catch{try{var L=require("crypto"),b0=function(){var J0=L.randomBytes(4);return(J0[0]<<24|J0[1]<<16|J0[2]<<8|J0[3])>>>0};b0(),R.getRandomValue=b0}catch{throw"No secure random number generator found"}}}};function Yg(MA){for(;MA.length>0;){var WA=MA.shift();if(typeof WA!="function"){var c0=WA.func;typeof c0=="number"?WA.arg===void 0?jg.get(c0)():jg.get(c0)(WA.arg):c0(WA.arg===void 0?null:WA.arg)}else WA(R)}}function Kr(MA,WA,c0,L){St("Assertion failed: "+Sg(MA)+", at: "+[WA?Sg(WA):"unknown filename",c0,L?Sg(L):"unknown function"])}function qr(){St()}function Tr(MA,WA,c0){var L=zr(WA,c0);return Pr[MA].apply(null,L)}function Vr(MA,WA,c0){yg.copyWithin(MA,WA,WA+c0)}function Xr(){return yg.length}function Wr(MA){try{return At.grow(MA-de.byteLength+65535>>>16),me(At.buffer),1}catch{}}function Or(MA){MA>>>=0;var WA=Xr(),c0=2147483648;if(MA>c0)return!1;for(var L=1;L<=4;L*=2){var b0=WA*(1+.2/L);if(b0=Math.min(b0,MA+100663296),Wr(Math.min(c0,kr(Math.max(16777216,MA,b0),65536))))return!0}return!1}function jr(MA){return Tt[Me()>>2]=MA,MA}function Zr(MA){switch(MA){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return jr(28),-1}var $g=[];function zr(MA,WA){var c0;for($g.length=0,WA>>=2;c0=yg[MA++];){var L=c0<105;L&&1&WA&&WA++,$g.push(L?bg[WA++>>1]:Tt[WA]),++WA}return $g}function Ne(MA){for(var WA=[],c0=0;c0255&&(L&=255),WA.push(String.fromCharCode(L))}return WA.join("")}var $r=typeof atob=="function"?atob:function(MA){var WA,c0,L,b0,K0,J0,st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Ft="",ut=0;MA=MA.replace(/[^A-Za-z0-9\+\/\=]/g,"");do WA=st.indexOf(MA.charAt(ut++))<<2|(b0=st.indexOf(MA.charAt(ut++)))>>4,c0=(15&b0)<<4|(K0=st.indexOf(MA.charAt(ut++)))>>2,L=(3&K0)<<6|(J0=st.indexOf(MA.charAt(ut++))),Ft+=String.fromCharCode(WA),K0!==64&&(Ft+=String.fromCharCode(c0)),J0!==64&&(Ft+=String.fromCharCode(L));while(ut0||(br(),Vt>0||(R.setStatus?(R.setStatus("Running..."),setTimeout(function(){setTimeout(function(){R.setStatus("")},1),WA()},1)):WA()))}if(R._malloc=function(){return(R._malloc=R.asm.Bc).apply(null,arguments)},R._free=function(){return(R._free=R.asm.Cc).apply(null,arguments)},R.setValue=Pt,R.getValue=Kt,R.UTF8ToString=Sg,fg=function MA(){Hg||Ae(),Hg||(fg=MA)},R.run=Ae,R.preInit)for(typeof R.preInit=="function"&&(R.preInit=[R.preInit]);R.preInit.length>0;)R.preInit.pop()();Ae()}).catch(function(){return PA.useBackupModule()}),vA}typeof J.nodeName!="string"?GA(J):sA.libsodium=GA(sA.libsodium_mod||(sA.commonJsStrict={}))})(commonjsGlobal)})(libsodium,libsodium.exports);(function(oA){(function(J){function sA(uA,vA){var P,PA=vA.ready.then(function(){function d(){if(P._sodium_init()!==0)throw new Error("libsodium was not correctly initialized.");for(var q=["crypto_aead_chacha20poly1305_decrypt","crypto_aead_chacha20poly1305_decrypt_detached","crypto_aead_chacha20poly1305_encrypt","crypto_aead_chacha20poly1305_encrypt_detached","crypto_aead_chacha20poly1305_ietf_decrypt","crypto_aead_chacha20poly1305_ietf_decrypt_detached","crypto_aead_chacha20poly1305_ietf_encrypt","crypto_aead_chacha20poly1305_ietf_encrypt_detached","crypto_aead_chacha20poly1305_ietf_keygen","crypto_aead_chacha20poly1305_keygen","crypto_aead_xchacha20poly1305_ietf_decrypt","crypto_aead_xchacha20poly1305_ietf_decrypt_detached","crypto_aead_xchacha20poly1305_ietf_encrypt","crypto_aead_xchacha20poly1305_ietf_encrypt_detached","crypto_aead_xchacha20poly1305_ietf_keygen","crypto_auth","crypto_auth_hmacsha256","crypto_auth_hmacsha256_keygen","crypto_auth_hmacsha256_verify","crypto_auth_hmacsha512","crypto_auth_hmacsha512_keygen","crypto_auth_hmacsha512_verify","crypto_auth_keygen","crypto_auth_verify","crypto_box_beforenm","crypto_box_curve25519xchacha20poly1305_keypair","crypto_box_curve25519xchacha20poly1305_seal","crypto_box_curve25519xchacha20poly1305_seal_open","crypto_box_detached","crypto_box_easy","crypto_box_easy_afternm","crypto_box_keypair","crypto_box_open_detached","crypto_box_open_easy","crypto_box_open_easy_afternm","crypto_box_seal","crypto_box_seal_open","crypto_box_seed_keypair","crypto_core_ed25519_add","crypto_core_ed25519_from_hash","crypto_core_ed25519_from_uniform","crypto_core_ed25519_is_valid_point","crypto_core_ed25519_random","crypto_core_ed25519_scalar_add","crypto_core_ed25519_scalar_complement","crypto_core_ed25519_scalar_invert","crypto_core_ed25519_scalar_mul","crypto_core_ed25519_scalar_negate","crypto_core_ed25519_scalar_random","crypto_core_ed25519_scalar_reduce","crypto_core_ed25519_scalar_sub","crypto_core_ed25519_sub","crypto_core_ristretto255_add","crypto_core_ristretto255_from_hash","crypto_core_ristretto255_is_valid_point","crypto_core_ristretto255_random","crypto_core_ristretto255_scalar_add","crypto_core_ristretto255_scalar_complement","crypto_core_ristretto255_scalar_invert","crypto_core_ristretto255_scalar_mul","crypto_core_ristretto255_scalar_negate","crypto_core_ristretto255_scalar_random","crypto_core_ristretto255_scalar_reduce","crypto_core_ristretto255_scalar_sub","crypto_core_ristretto255_sub","crypto_generichash","crypto_generichash_blake2b_salt_personal","crypto_generichash_final","crypto_generichash_init","crypto_generichash_keygen","crypto_generichash_update","crypto_hash","crypto_hash_sha256","crypto_hash_sha256_final","crypto_hash_sha256_init","crypto_hash_sha256_update","crypto_hash_sha512","crypto_hash_sha512_final","crypto_hash_sha512_init","crypto_hash_sha512_update","crypto_kdf_derive_from_key","crypto_kdf_keygen","crypto_kx_client_session_keys","crypto_kx_keypair","crypto_kx_seed_keypair","crypto_kx_server_session_keys","crypto_onetimeauth","crypto_onetimeauth_final","crypto_onetimeauth_init","crypto_onetimeauth_keygen","crypto_onetimeauth_update","crypto_onetimeauth_verify","crypto_pwhash","crypto_pwhash_scryptsalsa208sha256","crypto_pwhash_scryptsalsa208sha256_ll","crypto_pwhash_scryptsalsa208sha256_str","crypto_pwhash_scryptsalsa208sha256_str_verify","crypto_pwhash_str","crypto_pwhash_str_needs_rehash","crypto_pwhash_str_verify","crypto_scalarmult","crypto_scalarmult_base","crypto_scalarmult_ed25519","crypto_scalarmult_ed25519_base","crypto_scalarmult_ed25519_base_noclamp","crypto_scalarmult_ed25519_noclamp","crypto_scalarmult_ristretto255","crypto_scalarmult_ristretto255_base","crypto_secretbox_detached","crypto_secretbox_easy","crypto_secretbox_keygen","crypto_secretbox_open_detached","crypto_secretbox_open_easy","crypto_secretstream_xchacha20poly1305_init_pull","crypto_secretstream_xchacha20poly1305_init_push","crypto_secretstream_xchacha20poly1305_keygen","crypto_secretstream_xchacha20poly1305_pull","crypto_secretstream_xchacha20poly1305_push","crypto_secretstream_xchacha20poly1305_rekey","crypto_shorthash","crypto_shorthash_keygen","crypto_shorthash_siphashx24","crypto_sign","crypto_sign_detached","crypto_sign_ed25519_pk_to_curve25519","crypto_sign_ed25519_sk_to_curve25519","crypto_sign_ed25519_sk_to_pk","crypto_sign_ed25519_sk_to_seed","crypto_sign_final_create","crypto_sign_final_verify","crypto_sign_init","crypto_sign_keypair","crypto_sign_open","crypto_sign_seed_keypair","crypto_sign_update","crypto_sign_verify_detached","crypto_stream_chacha20","crypto_stream_chacha20_ietf_xor","crypto_stream_chacha20_ietf_xor_ic","crypto_stream_chacha20_keygen","crypto_stream_chacha20_xor","crypto_stream_chacha20_xor_ic","crypto_stream_keygen","crypto_stream_xchacha20_keygen","crypto_stream_xchacha20_xor","crypto_stream_xchacha20_xor_ic","randombytes_buf","randombytes_buf_deterministic","randombytes_close","randombytes_random","randombytes_set_implementation","randombytes_stir","randombytes_uniform","sodium_version_string"],Z=[At,j0,Pt,Kt,qt,De,de,Xg,yg,Wg,Tt,Og,bg,Fe,vr,Sg,kr,me,jg,ve,ke,Gr,Ge,br,Sr,Yr,Hr,Nr,Ur,Vt,fg,Mr,Rr,St,be,Se,Zg,Lr,Ye,eg,zg,It,He,xr,Jr,Pr,Yg,Kr,qr,Tr,Vr,Xr,Wr,Or,jr,Zr,$g,zr,Ne,$r,AB,Xt,Hg,tB,Ue,Me,Ae,MA,WA,c0,L,b0,K0,J0,st,Ft,ut,te,Ig,ge,ee,mt,gB,rg,ug,_g,Yt,eB,rB,Re,Le,pg,re,lg,Be,Wt,ae,Ng,xe,BB,Ug,aB,Je,ne,Pe,Ke,qe,nB,Te,iB,oB,CB,QB,EB,sB,Ot,wg,cB,hB,Ht,Ve,Xe,ie,yB,We,Bg,oe,_t,Oe,fB,IB,uB,Mg,_B,pB,lB,wB,DB,dB,FB,mB,vB,Ce,kB,je,GB,bB,jt,Rg,Ze,ze,$e,Qe,UA],nA=0;nA=240?(p=4,Z=!0):lA>=224?(p=3,Z=!0):lA>=192?(p=2,Z=!0):lA<128&&(p=1,Z=!0)}while(!Z);for(var r=p-(q.length-nA),u=0;u>8&-39)<<8|87+(S=d[T]>>>4)+(S-10>>8&-39),M+=String.fromCharCode(255&m)+String.fromCharCode(m>>>8);return M}var R={ORIGINAL:1,ORIGINAL_NO_PADDING:3,URLSAFE:5,URLSAFE_NO_PADDING:7};function i0(d){if(d==null)return R.URLSAFE_NO_PADDING;if(d!==R.ORIGINAL&&d!==R.ORIGINAL_NO_PADDING&&d!==R.URLSAFE&&d!=R.URLSAFE_NO_PADDING)throw new Error("unsupported base64 variant");return d}function $A(d,S){S=i0(S),d=EA(m,d,"input");var G,m=[],M=0|Math.floor(d.length/3),T=d.length-3*M,q=4*M+(T!==0?(2&S)==0?4:2+(T>>>1):0),Z=new dA(q+1),nA=QA(d);return m.push(nA),m.push(Z.address),P._sodium_bin2base64(Z.address,Z.length,nA,d.length,S)===0&&KA(m,"conversion failed"),Z.length=q,G=LA(Z.to_Uint8Array()),FA(m),G}function pA(d,S){var G=S||"uint8array";if(!u0(G))throw new Error(G+" output format is not available");if(d instanceof dA){if(G==="uint8array")return d.to_Uint8Array();if(G==="text")return LA(d.to_Uint8Array());if(G==="hex")return e0(d.to_Uint8Array());if(G==="base64")return $A(d.to_Uint8Array(),R.URLSAFE_NO_PADDING);throw new Error('What is output format "'+G+'"?')}if(typeof d=="object"){for(var m=Object.keys(d),M={},T=0;T>>24>>>8,q,nA);var u=pA(lA,M);return FA(T),u}function mt(d){var S=[];kA(d);var G=new dA(0|P._crypto_kdf_keybytes()),m=G.address;S.push(m),P._crypto_kdf_keygen(m);var M=pA(G,d);return FA(S),M}function gB(d,S,G,m){var M=[];kA(m),d=EA(M,d,"clientPublicKey");var T,q=0|P._crypto_kx_publickeybytes();d.length!==q&&IA(M,"invalid clientPublicKey length"),T=QA(d),M.push(T),S=EA(M,S,"clientSecretKey");var Z,nA=0|P._crypto_kx_secretkeybytes();S.length!==nA&&IA(M,"invalid clientSecretKey length"),Z=QA(S),M.push(Z),G=EA(M,G,"serverPublicKey");var p,lA=0|P._crypto_kx_publickeybytes();G.length!==lA&&IA(M,"invalid serverPublicKey length"),p=QA(G),M.push(p);var r=new dA(0|P._crypto_kx_sessionkeybytes()),u=r.address;M.push(u);var OA=new dA(0|P._crypto_kx_sessionkeybytes()),xA=OA.address;if(M.push(xA),(0|P._crypto_kx_client_session_keys(u,xA,T,Z,p))==0){var p0=pA({sharedRx:r,sharedTx:OA},m);return FA(M),p0}KA(M,"invalid usage")}function rg(d){var S=[];kA(d);var G=new dA(0|P._crypto_kx_publickeybytes()),m=G.address;S.push(m);var M=new dA(0|P._crypto_kx_secretkeybytes()),T=M.address;if(S.push(T),(0|P._crypto_kx_keypair(m,T))==0){var q={publicKey:pA(G,d),privateKey:pA(M,d),keyType:"x25519"};return FA(S),q}KA(S,"internal error")}function ug(d,S){var G=[];kA(S),d=EA(G,d,"seed");var m,M=0|P._crypto_kx_seedbytes();d.length!==M&&IA(G,"invalid seed length"),m=QA(d),G.push(m);var T=new dA(0|P._crypto_kx_publickeybytes()),q=T.address;G.push(q);var Z=new dA(0|P._crypto_kx_secretkeybytes()),nA=Z.address;if(G.push(nA),(0|P._crypto_kx_seed_keypair(q,nA,m))==0){var p={publicKey:pA(T,S),privateKey:pA(Z,S),keyType:"x25519"};return FA(G),p}KA(G,"internal error")}function _g(d,S,G,m){var M=[];kA(m),d=EA(M,d,"serverPublicKey");var T,q=0|P._crypto_kx_publickeybytes();d.length!==q&&IA(M,"invalid serverPublicKey length"),T=QA(d),M.push(T),S=EA(M,S,"serverSecretKey");var Z,nA=0|P._crypto_kx_secretkeybytes();S.length!==nA&&IA(M,"invalid serverSecretKey length"),Z=QA(S),M.push(Z),G=EA(M,G,"clientPublicKey");var p,lA=0|P._crypto_kx_publickeybytes();G.length!==lA&&IA(M,"invalid clientPublicKey length"),p=QA(G),M.push(p);var r=new dA(0|P._crypto_kx_sessionkeybytes()),u=r.address;M.push(u);var OA=new dA(0|P._crypto_kx_sessionkeybytes()),xA=OA.address;if(M.push(xA),(0|P._crypto_kx_server_session_keys(u,xA,T,Z,p))==0){var p0=pA({sharedRx:r,sharedTx:OA},m);return FA(M),p0}KA(M,"invalid usage")}function Yt(d,S,G){var m=[];kA(G);var M=QA(d=EA(m,d,"message")),T=d.length;m.push(M),S=EA(m,S,"key");var q,Z=0|P._crypto_onetimeauth_keybytes();S.length!==Z&&IA(m,"invalid key length"),q=QA(S),m.push(q);var nA=new dA(0|P._crypto_onetimeauth_bytes()),p=nA.address;if(m.push(p),(0|P._crypto_onetimeauth(p,M,T,0,q))==0){var lA=pA(nA,G);return FA(m),lA}KA(m,"invalid usage")}function eB(d,S){var G=[];kA(S),l0(G,d,"state_address");var m=new dA(0|P._crypto_onetimeauth_bytes()),M=m.address;if(G.push(M),(0|P._crypto_onetimeauth_final(d,M))==0){var T=(P._free(d),pA(m,S));return FA(G),T}KA(G,"invalid usage")}function rB(d,S){var G=[];kA(S);var m=null;d!=null&&(m=QA(d=EA(G,d,"key")),d.length,G.push(m));var M=new dA(144).address;if((0|P._crypto_onetimeauth_init(M,m))==0){var T=M;return FA(G),T}KA(G,"invalid usage")}function Re(d){var S=[];kA(d);var G=new dA(0|P._crypto_onetimeauth_keybytes()),m=G.address;S.push(m),P._crypto_onetimeauth_keygen(m);var M=pA(G,d);return FA(S),M}function Le(d,S,G){var m=[];kA(G),l0(m,d,"state_address");var M=QA(S=EA(m,S,"message_chunk")),T=S.length;m.push(M),(0|P._crypto_onetimeauth_update(d,M,T))!=0&&KA(m,"invalid usage"),FA(m)}function pg(d,S,G){var m=[];d=EA(m,d,"hash");var M,T=0|P._crypto_onetimeauth_bytes();d.length!==T&&IA(m,"invalid hash length"),M=QA(d),m.push(M);var q=QA(S=EA(m,S,"message")),Z=S.length;m.push(q),G=EA(m,G,"key");var nA,p=0|P._crypto_onetimeauth_keybytes();G.length!==p&&IA(m,"invalid key length"),nA=QA(G),m.push(nA);var lA=(0|P._crypto_onetimeauth_verify(M,q,Z,0,nA))==0;return FA(m),lA}function re(d,S,G,m,M,T,q){var Z=[];kA(q),l0(Z,d,"keyLength"),(typeof d!="number"||(0|d)!==d||d<0)&&IA(Z,"keyLength must be an unsigned integer");var nA=QA(S=EA(Z,S,"password")),p=S.length;Z.push(nA),G=EA(Z,G,"salt");var lA,r=0|P._crypto_pwhash_saltbytes();G.length!==r&&IA(Z,"invalid salt length"),lA=QA(G),Z.push(lA),l0(Z,m,"opsLimit"),(typeof m!="number"||(0|m)!==m||m<0)&&IA(Z,"opsLimit must be an unsigned integer"),l0(Z,M,"memLimit"),(typeof M!="number"||(0|M)!==M||M<0)&&IA(Z,"memLimit must be an unsigned integer"),l0(Z,T,"algorithm"),(typeof T!="number"||(0|T)!==T||T<0)&&IA(Z,"algorithm must be an unsigned integer");var u=new dA(0|d),OA=u.address;if(Z.push(OA),(0|P._crypto_pwhash(OA,d,0,nA,p,0,lA,m,0,M,T))==0){var xA=pA(u,q);return FA(Z),xA}KA(Z,"invalid usage")}function lg(d,S,G,m,M,T){var q=[];kA(T),l0(q,d,"keyLength"),(typeof d!="number"||(0|d)!==d||d<0)&&IA(q,"keyLength must be an unsigned integer");var Z=QA(S=EA(q,S,"password")),nA=S.length;q.push(Z),G=EA(q,G,"salt");var p,lA=0|P._crypto_pwhash_scryptsalsa208sha256_saltbytes();G.length!==lA&&IA(q,"invalid salt length"),p=QA(G),q.push(p),l0(q,m,"opsLimit"),(typeof m!="number"||(0|m)!==m||m<0)&&IA(q,"opsLimit must be an unsigned integer"),l0(q,M,"memLimit"),(typeof M!="number"||(0|M)!==M||M<0)&&IA(q,"memLimit must be an unsigned integer");var r=new dA(0|d),u=r.address;if(q.push(u),(0|P._crypto_pwhash_scryptsalsa208sha256(u,d,0,Z,nA,0,p,m,0,M))==0){var OA=pA(r,T);return FA(q),OA}KA(q,"invalid usage")}function Be(d,S,G,m,M,T,q){var Z=[];kA(q);var nA=QA(d=EA(Z,d,"password")),p=d.length;Z.push(nA);var lA=QA(S=EA(Z,S,"salt")),r=S.length;Z.push(lA),l0(Z,G,"opsLimit"),(typeof G!="number"||(0|G)!==G||G<0)&&IA(Z,"opsLimit must be an unsigned integer"),l0(Z,m,"r"),(typeof m!="number"||(0|m)!==m||m<0)&&IA(Z,"r must be an unsigned integer"),l0(Z,M,"p"),(typeof M!="number"||(0|M)!==M||M<0)&&IA(Z,"p must be an unsigned integer"),l0(Z,T,"keyLength"),(typeof T!="number"||(0|T)!==T||T<0)&&IA(Z,"keyLength must be an unsigned integer");var u=new dA(0|T),OA=u.address;if(Z.push(OA),(0|P._crypto_pwhash_scryptsalsa208sha256_ll(nA,p,lA,r,G,0,m,M,OA,T))==0){var xA=pA(u,q);return FA(Z),xA}KA(Z,"invalid usage")}function Wt(d,S,G,m){var M=[];kA(m);var T=QA(d=EA(M,d,"password")),q=d.length;M.push(T),l0(M,S,"opsLimit"),(typeof S!="number"||(0|S)!==S||S<0)&&IA(M,"opsLimit must be an unsigned integer"),l0(M,G,"memLimit"),(typeof G!="number"||(0|G)!==G||G<0)&&IA(M,"memLimit must be an unsigned integer");var Z=new dA(0|P._crypto_pwhash_scryptsalsa208sha256_strbytes()).address;if(M.push(Z),(0|P._crypto_pwhash_scryptsalsa208sha256_str(Z,T,q,0,S,0,G))==0){var nA=P.UTF8ToString(Z);return FA(M),nA}KA(M,"invalid usage")}function ae(d,S,G){var m=[];kA(G),typeof d!="string"&&IA(m,"hashed_password must be a string"),d=JA(d+"\0"),T!=null&&d.length-1!==T&&IA(m,"invalid hashed_password length");var M=QA(d),T=d.length-1;m.push(M);var q=QA(S=EA(m,S,"password")),Z=S.length;m.push(q);var nA=(0|P._crypto_pwhash_scryptsalsa208sha256_str_verify(M,q,Z,0))==0;return FA(m),nA}function Ng(d,S,G,m){var M=[];kA(m);var T=QA(d=EA(M,d,"password")),q=d.length;M.push(T),l0(M,S,"opsLimit"),(typeof S!="number"||(0|S)!==S||S<0)&&IA(M,"opsLimit must be an unsigned integer"),l0(M,G,"memLimit"),(typeof G!="number"||(0|G)!==G||G<0)&&IA(M,"memLimit must be an unsigned integer");var Z=new dA(0|P._crypto_pwhash_strbytes()).address;if(M.push(Z),(0|P._crypto_pwhash_str(Z,T,q,0,S,0,G))==0){var nA=P.UTF8ToString(Z);return FA(M),nA}KA(M,"invalid usage")}function xe(d,S,G,m){var M=[];kA(m),typeof d!="string"&&IA(M,"hashed_password must be a string"),d=JA(d+"\0"),q!=null&&d.length-1!==q&&IA(M,"invalid hashed_password length");var T=QA(d),q=d.length-1;M.push(T),l0(M,S,"opsLimit"),(typeof S!="number"||(0|S)!==S||S<0)&&IA(M,"opsLimit must be an unsigned integer"),l0(M,G,"memLimit"),(typeof G!="number"||(0|G)!==G||G<0)&&IA(M,"memLimit must be an unsigned integer");var Z=(0|P._crypto_pwhash_str_needs_rehash(T,S,0,G))!=0;return FA(M),Z}function BB(d,S,G){var m=[];kA(G),typeof d!="string"&&IA(m,"hashed_password must be a string"),d=JA(d+"\0"),T!=null&&d.length-1!==T&&IA(m,"invalid hashed_password length");var M=QA(d),T=d.length-1;m.push(M);var q=QA(S=EA(m,S,"password")),Z=S.length;m.push(q);var nA=(0|P._crypto_pwhash_str_verify(M,q,Z,0))==0;return FA(m),nA}function Ug(d,S,G){var m=[];kA(G),d=EA(m,d,"privateKey");var M,T=0|P._crypto_scalarmult_scalarbytes();d.length!==T&&IA(m,"invalid privateKey length"),M=QA(d),m.push(M),S=EA(m,S,"publicKey");var q,Z=0|P._crypto_scalarmult_bytes();S.length!==Z&&IA(m,"invalid publicKey length"),q=QA(S),m.push(q);var nA=new dA(0|P._crypto_scalarmult_bytes()),p=nA.address;if(m.push(p),(0|P._crypto_scalarmult(p,M,q))==0){var lA=pA(nA,G);return FA(m),lA}KA(m,"weak public key")}function aB(d,S){var G=[];kA(S),d=EA(G,d,"privateKey");var m,M=0|P._crypto_scalarmult_scalarbytes();d.length!==M&&IA(G,"invalid privateKey length"),m=QA(d),G.push(m);var T=new dA(0|P._crypto_scalarmult_bytes()),q=T.address;if(G.push(q),(0|P._crypto_scalarmult_base(q,m))==0){var Z=pA(T,S);return FA(G),Z}KA(G,"unknown error")}function Je(d,S,G){var m=[];kA(G),d=EA(m,d,"n");var M,T=0|P._crypto_scalarmult_ed25519_scalarbytes();d.length!==T&&IA(m,"invalid n length"),M=QA(d),m.push(M),S=EA(m,S,"p");var q,Z=0|P._crypto_scalarmult_ed25519_bytes();S.length!==Z&&IA(m,"invalid p length"),q=QA(S),m.push(q);var nA=new dA(0|P._crypto_scalarmult_ed25519_bytes()),p=nA.address;if(m.push(p),(0|P._crypto_scalarmult_ed25519(p,M,q))==0){var lA=pA(nA,G);return FA(m),lA}KA(m,"invalid point or scalar is 0")}function ne(d,S){var G=[];kA(S),d=EA(G,d,"scalar");var m,M=0|P._crypto_scalarmult_ed25519_scalarbytes();d.length!==M&&IA(G,"invalid scalar length"),m=QA(d),G.push(m);var T=new dA(0|P._crypto_scalarmult_ed25519_bytes()),q=T.address;if(G.push(q),(0|P._crypto_scalarmult_ed25519_base(q,m))==0){var Z=pA(T,S);return FA(G),Z}KA(G,"scalar is 0")}function Pe(d,S){var G=[];kA(S),d=EA(G,d,"scalar");var m,M=0|P._crypto_scalarmult_ed25519_scalarbytes();d.length!==M&&IA(G,"invalid scalar length"),m=QA(d),G.push(m);var T=new dA(0|P._crypto_scalarmult_ed25519_bytes()),q=T.address;if(G.push(q),(0|P._crypto_scalarmult_ed25519_base_noclamp(q,m))==0){var Z=pA(T,S);return FA(G),Z}KA(G,"scalar is 0")}function Ke(d,S,G){var m=[];kA(G),d=EA(m,d,"n");var M,T=0|P._crypto_scalarmult_ed25519_scalarbytes();d.length!==T&&IA(m,"invalid n length"),M=QA(d),m.push(M),S=EA(m,S,"p");var q,Z=0|P._crypto_scalarmult_ed25519_bytes();S.length!==Z&&IA(m,"invalid p length"),q=QA(S),m.push(q);var nA=new dA(0|P._crypto_scalarmult_ed25519_bytes()),p=nA.address;if(m.push(p),(0|P._crypto_scalarmult_ed25519_noclamp(p,M,q))==0){var lA=pA(nA,G);return FA(m),lA}KA(m,"invalid point or scalar is 0")}function qe(d,S,G){var m=[];kA(G),d=EA(m,d,"scalar");var M,T=0|P._crypto_scalarmult_ristretto255_scalarbytes();d.length!==T&&IA(m,"invalid scalar length"),M=QA(d),m.push(M),S=EA(m,S,"element");var q,Z=0|P._crypto_scalarmult_ristretto255_bytes();S.length!==Z&&IA(m,"invalid element length"),q=QA(S),m.push(q);var nA=new dA(0|P._crypto_scalarmult_ristretto255_bytes()),p=nA.address;if(m.push(p),(0|P._crypto_scalarmult_ristretto255(p,M,q))==0){var lA=pA(nA,G);return FA(m),lA}KA(m,"result is identity element")}function nB(d,S){var G=[];kA(S),d=EA(G,d,"scalar");var m,M=0|P._crypto_core_ristretto255_scalarbytes();d.length!==M&&IA(G,"invalid scalar length"),m=QA(d),G.push(m);var T=new dA(0|P._crypto_core_ristretto255_bytes()),q=T.address;if(G.push(q),(0|P._crypto_scalarmult_ristretto255_base(q,m))==0){var Z=pA(T,S);return FA(G),Z}KA(G,"scalar is 0")}function Te(d,S,G,m){var M=[];kA(m);var T=QA(d=EA(M,d,"message")),q=d.length;M.push(T),S=EA(M,S,"nonce");var Z,nA=0|P._crypto_secretbox_noncebytes();S.length!==nA&&IA(M,"invalid nonce length"),Z=QA(S),M.push(Z),G=EA(M,G,"key");var p,lA=0|P._crypto_secretbox_keybytes();G.length!==lA&&IA(M,"invalid key length"),p=QA(G),M.push(p);var r=new dA(0|q),u=r.address;M.push(u);var OA=new dA(0|P._crypto_secretbox_macbytes()),xA=OA.address;if(M.push(xA),(0|P._crypto_secretbox_detached(u,xA,T,q,0,Z,p))==0){var p0=pA({mac:OA,cipher:r},m);return FA(M),p0}KA(M,"invalid usage")}function iB(d,S,G,m){var M=[];kA(m);var T=QA(d=EA(M,d,"message")),q=d.length;M.push(T),S=EA(M,S,"nonce");var Z,nA=0|P._crypto_secretbox_noncebytes();S.length!==nA&&IA(M,"invalid nonce length"),Z=QA(S),M.push(Z),G=EA(M,G,"key");var p,lA=0|P._crypto_secretbox_keybytes();G.length!==lA&&IA(M,"invalid key length"),p=QA(G),M.push(p);var r=new dA(q+P._crypto_secretbox_macbytes()|0),u=r.address;if(M.push(u),(0|P._crypto_secretbox_easy(u,T,q,0,Z,p))==0){var OA=pA(r,m);return FA(M),OA}KA(M,"invalid usage")}function oB(d){var S=[];kA(d);var G=new dA(0|P._crypto_secretbox_keybytes()),m=G.address;S.push(m),P._crypto_secretbox_keygen(m);var M=pA(G,d);return FA(S),M}function CB(d,S,G,m,M){var T=[];kA(M);var q=QA(d=EA(T,d,"ciphertext")),Z=d.length;T.push(q),S=EA(T,S,"mac");var nA,p=0|P._crypto_secretbox_macbytes();S.length!==p&&IA(T,"invalid mac length"),nA=QA(S),T.push(nA),G=EA(T,G,"nonce");var lA,r=0|P._crypto_secretbox_noncebytes();G.length!==r&&IA(T,"invalid nonce length"),lA=QA(G),T.push(lA),m=EA(T,m,"key");var u,OA=0|P._crypto_secretbox_keybytes();m.length!==OA&&IA(T,"invalid key length"),u=QA(m),T.push(u);var xA=new dA(0|Z),p0=xA.address;if(T.push(p0),(0|P._crypto_secretbox_open_detached(p0,q,nA,Z,0,lA,u))==0){var s0=pA(xA,M);return FA(T),s0}KA(T,"wrong secret key for the given ciphertext")}function QB(d,S,G,m){var M=[];kA(m),d=EA(M,d,"ciphertext");var T,q=P._crypto_secretbox_macbytes(),Z=d.length;Z>>0;return FA([]),S}function ze(d,S){var G=[];kA(S);for(var m=P._malloc(24),M=0;M<6;M++)P.setValue(m+4*M,P.Runtime.addFunction(d[["implementation_name","random","stir","uniform","buf","close"][M]]),"i32");(0|P._randombytes_set_implementation(m))!=0&&KA(G,"unsupported implementation"),FA(G)}function $e(d){kA(d),P._randombytes_stir()}function Qe(d,S){var G=[];kA(S),l0(G,d,"upper_bound"),(typeof d!="number"||(0|d)!==d||d<0)&&IA(G,"upper_bound must be an unsigned integer");var m=P._randombytes_uniform(d)>>>0;return FA(G),m}function UA(){var d=P._sodium_version_string(),S=P.UTF8ToString(d);return FA([]),S}return dA.prototype.to_Uint8Array=function(){var d=new Uint8Array(this.length);return d.set(P.HEAPU8.subarray(this.address,this.address+this.length)),d},uA.add=function(d,S){if(!(d instanceof Uint8Array&&S instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can added");var G=d.length,m=0,M=0;if(S.length!=d.length)throw new TypeError("Arguments must have the same length");for(M=0;M>=8,m+=d[M]+S[M],d[M]=255&m},uA.base64_variants=R,uA.compare=function(d,S){if(!(d instanceof Uint8Array&&S instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be compared");if(d.length!==S.length)throw new TypeError("Only instances of identical length can be compared");for(var G=0,m=1,M=d.length;M-- >0;)G|=S[M]-d[M]>>8&m,m&=(S[M]^d[M])-1>>8;return G+G+m-1},uA.from_base64=function(d,S){S=i0(S);var G,m=[],M=new dA(3*(d=EA(m,d,"input")).length/4),T=QA(d),q=F0(4),Z=F0(4);return m.push(T),m.push(M.address),m.push(M.result_bin_len_p),m.push(M.b64_end_p),P._sodium_base642bin(M.address,M.length,T,d.length,0,q,Z,S)!==0&&KA(m,"invalid input"),P.getValue(Z,"i32")-T!==d.length&&KA(m,"incomplete input"),M.length=P.getValue(q,"i32"),G=M.to_Uint8Array(),FA(m),G},uA.from_hex=function(d){var S,G=[],m=new dA((d=EA(G,d,"input")).length/2),M=QA(d),T=F0(4);return G.push(M),G.push(m.address),G.push(m.hex_end_p),P._sodium_hex2bin(m.address,m.length,M,d.length,0,0,T)!==0&&KA(G,"invalid input"),P.getValue(T,"i32")-M!==d.length&&KA(G,"incomplete input"),S=m.to_Uint8Array(),FA(G),S},uA.from_string=JA,uA.increment=function(d){if(!(d instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be incremented");for(var S=256,G=0,m=d.length;G>=8,S+=d[G],d[G]=255&S},uA.is_zero=function(d){if(!(d instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be checked");for(var S=0,G=0,m=d.length;G 0");var G,m=[],M=F0(4),T=1,q=0,Z=0|d.length,nA=new dA(Z+S);m.push(M),m.push(nA.address);for(var p=nA.address,lA=nA.address+Z+S;p>>48|Z>>>32|Z>>>16|Z))-1>>16);return P._sodium_pad(M,nA.address,d.length,S,nA.length)!==0&&KA(m,"internal error"),nA.length=P.getValue(M,"i32"),G=nA.to_Uint8Array(),FA(m),G},uA.unpad=function(d,S){if(!(d instanceof Uint8Array))throw new TypeError("buffer must be a Uint8Array");if((S|=0)<=0)throw new Error("block size must be > 0");var G=[],m=QA(d),M=F0(4);return G.push(m),G.push(M),P._sodium_unpad(M,m,d.length,S)!==0&&KA(G,"unsupported/invalid padding"),d=(d=new Uint8Array(d)).subarray(0,P.getValue(M,"i32")),FA(G),d},uA.ready=PA,uA.symbols=function(){return Object.keys(uA).sort()},uA.to_base64=$A,uA.to_hex=e0,uA.to_string=LA,uA}var GA=typeof J.sodium=="object"&&typeof J.sodium.onload=="function"?J.sodium.onload:null;typeof oA.nodeName!="string"?sA(oA,libsodium.exports):J.sodium=sA(J.commonJsStrict={},J.libsodium),GA&&J.sodium.ready.then(function(){GA(J.sodium)})})(commonjsGlobal)})(libsodiumWrappers);var dist={exports:{}};(function(oA,J){(function(sA,GA){oA.exports=GA()})(commonjsGlobal,function(){class sA{constructor(uA){this.init(uA)}init(uA){const vA={inputCodec:"Int16",channels:1,sampleRate:8e3,flushTime:1e3};this.option=Object.assign({},vA,uA),this.samples=new Float32Array,this.interval=setInterval(this.flush.bind(this),this.option.flushTime),this.convertValue=this.getConvertValue(),this.typedArray=this.getTypedArray(),this.initAudioContext()}getConvertValue(){const uA={Int8:128,Int16:32768,Int32:2147483648,Float32:1};if(!uA[this.option.inputCodec])throw new Error("wrong codec.please input one of these codecs:Int8,Int16,Int32,Float32");return uA[this.option.inputCodec]}getTypedArray(){const uA={Int8:Int8Array,Int16:Int16Array,Int32:Int32Array,Float32:Float32Array};if(!uA[this.option.inputCodec])throw new Error("wrong codec.please input one of these codecs:Int8,Int16,Int32,Float32");return uA[this.option.inputCodec]}initAudioContext(){this.audioCtx=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioCtx.createGain(),this.gainNode.gain.value=10,this.gainNode.connect(this.audioCtx.destination),this.startTime=this.audioCtx.currentTime}static isTypedArray(uA){return uA.byteLength&&uA.buffer&&uA.buffer.constructor==ArrayBuffer||uA.constructor==ArrayBuffer}isSupported(uA){if(!sA.isTypedArray(uA))throw new Error("\u8BF7\u4F20\u5165ArrayBuffer\u6216\u8005\u4EFB\u610FTypedArray");return!0}feed(uA){this.isSupported(uA),uA=this.getFormatedValue(uA);const vA=new Float32Array(this.samples.length+uA.length);vA.set(this.samples,0),vA.set(uA,this.samples.length),this.samples=vA}getFormatedValue(uA){uA.constructor==ArrayBuffer?uA=new this.typedArray(uA):uA=new this.typedArray(uA.buffer);let vA=new Float32Array(uA.length);for(let P=0;P=vA-51&&(JA[R]=JA[R]*e0--/50),LA+=this.option.channels}this.startTime diff --git a/flutter/web/icons/Icon-192.png b/flutter/web/icons/Icon-192.png new file mode 100644 index 000000000..db3e76713 Binary files /dev/null and b/flutter/web/icons/Icon-192.png differ diff --git a/flutter/web/icons/Icon-512.png b/flutter/web/icons/Icon-512.png new file mode 100644 index 000000000..6910947a3 Binary files /dev/null and b/flutter/web/icons/Icon-512.png differ diff --git a/flutter/web/icons/Icon-maskable-192.png b/flutter/web/icons/Icon-maskable-192.png new file mode 100644 index 000000000..36597c1bc Binary files /dev/null and b/flutter/web/icons/Icon-maskable-192.png differ diff --git a/flutter/web/icons/Icon-maskable-512.png b/flutter/web/icons/Icon-maskable-512.png new file mode 100644 index 000000000..f2f79e64b Binary files /dev/null and b/flutter/web/icons/Icon-maskable-512.png differ diff --git a/flutter/web/index.html b/flutter/web/index.html new file mode 100644 index 000000000..32301db20 --- /dev/null +++ b/flutter/web/index.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + RustDesk + + + + + + + + + + +
+
+
+ + + + + + + + diff --git a/flutter/web/js/.gitattributes b/flutter/web/js/.gitattributes new file mode 100644 index 000000000..176a458f9 --- /dev/null +++ b/flutter/web/js/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/flutter/web/js/.gitignore b/flutter/web/js/.gitignore new file mode 100644 index 000000000..620c5689f --- /dev/null +++ b/flutter/web/js/.gitignore @@ -0,0 +1,8 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +*log +ogvjs +.vscode diff --git a/flutter/web/js/gen_js_from_hbb.py b/flutter/web/js/gen_js_from_hbb.py new file mode 100755 index 000000000..7e9d78cbe --- /dev/null +++ b/flutter/web/js/gen_js_from_hbb.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +import re +import os +import glob +from tabnanny import check + +def main(): + print('export const LANGS = {') + for fn in glob.glob('../hbb/src/lang/*'): + lang = os.path.basename(fn)[:-3] + if lang == 'template': continue + print(' %s: {'%lang) + for ln in open(fn): + ln = ln.strip() + if ln.startswith('("'): + toks = ln.split('", "') + assert(len(toks) == 2) + a = toks[0][2:] + b = toks[1][:-3] + print(' "%s": "%s",'%(a, b)) + print(' },') + print('}') + check_if_retry = ['', False] + KEY_MAP = ['', False] + for ln in open('../hbb/src/client.rs'): + ln = ln.strip() + if 'check_if_retry' in ln: + check_if_retry[1] = True + continue + if ln.startswith('}') and check_if_retry[1]: + check_if_retry[1] = False + continue + if check_if_retry[1]: + ln = removeComment(ln) + check_if_retry[0] += ln + '\n' + if 'KEY_MAP' in ln: + KEY_MAP[1] = True + continue + if '.collect' in ln and KEY_MAP[1]: + KEY_MAP[1] = False + continue + if KEY_MAP[1] and ln.startswith('('): + ln = removeComment(ln) + toks = ln.split('", Key::') + assert(len(toks) == 2) + a = toks[0][2:] + b = toks[1].replace('ControlKey(ControlKey::', '').replace("Chr('", '').replace("' as _)),", '').replace(')),', '') + KEY_MAP[0] += ' "%s": "%s",\n'%(a, b) + print() + print('export function checkIfRetry(msgtype: string, title: string, text: string) {') + print(' return %s'%check_if_retry[0].replace('to_lowercase', 'toLowerCase').replace('contains', 'indexOf').replace('!', '').replace('")', '") < 0')) + print(';}') + print() + print('export const KEY_MAP: any = {') + print(KEY_MAP[0]) + print('}') + for ln in open('../hbb/Cargo.toml'): + if ln.startswith('version ='): + print('export const ' + ln) + + +def removeComment(ln): + return re.sub('\s+\/\/.*$', '', ln) + +main() diff --git a/flutter/web/js/index.html b/flutter/web/js/index.html new file mode 100644 index 000000000..0ae0a2410 --- /dev/null +++ b/flutter/web/js/index.html @@ -0,0 +1,15 @@ + + + + + + + + + Vite App + + +
+ + + diff --git a/flutter/web/js/package.json b/flutter/web/js/package.json new file mode 100644 index 000000000..15e0e75b8 --- /dev/null +++ b/flutter/web/js/package.json @@ -0,0 +1,22 @@ +{ + "name": "web_hbb", + "version": "1.0.0", + "scripts": { + "dev": "vite", + "build": "./gen_js_from_hbb.py > src/gen_js_from_hbb.ts && ./ts_proto.py && tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^4.4.4", + "vite": "^2.7.2" + }, + "dependencies": { + "fast-sha256": "^1.3.0", + "libsodium": "^0.7.9", + "libsodium-wrappers": "^0.7.9", + "pcm-player": "^0.0.11", + "ts-proto": "^1.101.0", + "wasm-feature-detect": "^1.2.11", + "zstddec": "^0.0.2" + } +} diff --git a/flutter/web/js/src/codec.js b/flutter/web/js/src/codec.js new file mode 100644 index 000000000..dc579b5f3 --- /dev/null +++ b/flutter/web/js/src/codec.js @@ -0,0 +1,43 @@ +// example: https://github.com/rgov/js-theora-decoder/blob/main/index.html +// https://github.com/brion/ogv.js/releases, yarn add has no simd +// dev: copy decoder files from node/ogv/dist/* to project dir +// dist: .... to dist +/* + OGVDemuxerOggW: 'ogv-demuxer-ogg-wasm.js', + OGVDemuxerWebMW: 'ogv-demuxer-webm-wasm.js', + OGVDecoderAudioOpusW: 'ogv-decoder-audio-opus-wasm.js', + OGVDecoderAudioVorbisW: 'ogv-decoder-audio-vorbis-wasm.js', + OGVDecoderVideoTheoraW: 'ogv-decoder-video-theora-wasm.js', + OGVDecoderVideoVP8W: 'ogv-decoder-video-vp8-wasm.js', + OGVDecoderVideoVP8MTW: 'ogv-decoder-video-vp8-mt-wasm.js', + OGVDecoderVideoVP9W: 'ogv-decoder-video-vp9-wasm.js', + OGVDecoderVideoVP9SIMDW: 'ogv-decoder-video-vp9-simd-wasm.js', + OGVDecoderVideoVP9MTW: 'ogv-decoder-video-vp9-mt-wasm.js', + OGVDecoderVideoVP9SIMDMTW: 'ogv-decoder-video-vp9-simd-mt-wasm.js', + OGVDecoderVideoAV1W: 'ogv-decoder-video-av1-wasm.js', + OGVDecoderVideoAV1SIMDW: 'ogv-decoder-video-av1-simd-wasm.js', + OGVDecoderVideoAV1MTW: 'ogv-decoder-video-av1-mt-wasm.js', + OGVDecoderVideoAV1SIMDMTW: 'ogv-decoder-video-av1-simd-mt-wasm.js', +*/ +import { simd } from "wasm-feature-detect"; + +export async function loadVp9(callback) { + // Multithreading is used only if `options.threading` is true. + // This requires browser support for the new `SharedArrayBuffer` and `Atomics` APIs, + // currently available in Firefox and Chrome with experimental flags enabled. + // 所有主流浏览器均默认于2018年1月5日禁用SharedArrayBuffer + const isSIMD = await simd(); + console.log('isSIMD: ' + isSIMD); + window.OGVLoader.loadClass( + isSIMD ? "OGVDecoderVideoVP9SIMDW" : "OGVDecoderVideoVP9W", + (videoCodecClass) => { + window.videoCodecClass = videoCodecClass; + videoCodecClass({ videoFormat: {} }).then((decoder) => { + decoder.init(() => { + callback(decoder); + }) + }) + }, + { worker: true, threading: true } + ); +} \ No newline at end of file diff --git a/flutter/web/js/src/common.ts b/flutter/web/js/src/common.ts new file mode 100644 index 000000000..8da049a4d --- /dev/null +++ b/flutter/web/js/src/common.ts @@ -0,0 +1,77 @@ +import * as zstd from "zstddec"; +import { KeyEvent, controlKeyFromJSON, ControlKey } from "./message"; +import { KEY_MAP, LANGS } from "./gen_js_from_hbb"; + +let decompressor: zstd.ZSTDDecoder; + +export async function initZstd() { + const tmp = new zstd.ZSTDDecoder(); + await tmp.init(); + console.log("zstd ready"); + decompressor = tmp; +} + +export async function decompress(compressedArray: Uint8Array) { + const MAX = 1024 * 1024 * 64; + const MIN = 1024 * 1024; + let n = 30 * compressedArray.length; + if (n > MAX) { + n = MAX; + } + if (n < MIN) { + n = MIN; + } + try { + if (!decompressor) { + await initZstd(); + } + return decompressor.decode(compressedArray, n); + } catch (e) { + console.error("decompress failed: " + e); + return undefined; + } +} + +const LANG = getLang(); + +export function translate(locale: string, text: string): string { + const lang = LANG || locale.substring(locale.length - 2).toLowerCase(); + let en = LANGS.en as any; + let dict = (LANGS as any)[lang]; + if (!dict) dict = en; + let res = dict[text]; + if (!res && lang != "en") res = en[text]; + return res || text; +} + +const zCode = "z".charCodeAt(0); +const aCode = "a".charCodeAt(0); + +export function mapKey(name: string, isDesktop: Boolean) { + const tmp = KEY_MAP[name] || name; + if (tmp.length == 1) { + const chr = tmp.charCodeAt(0); + if (!isDesktop && (chr > zCode || chr < aCode)) + return KeyEvent.fromPartial({ unicode: chr }); + else return KeyEvent.fromPartial({ chr }); + } + const control_key = controlKeyFromJSON(tmp); + if (control_key == ControlKey.UNRECOGNIZED) { + console.error("Unknown control key " + tmp); + } + return KeyEvent.fromPartial({ control_key }); +} + +export async function sleep(ms: number) { + await new Promise((r) => setTimeout(r, ms)); +} + +function getLang(): string { + try { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + return urlParams.get("lang") || ""; + } catch (e) { + return ""; + } +} diff --git a/flutter/web/js/src/connection.ts b/flutter/web/js/src/connection.ts new file mode 100644 index 000000000..2846d9078 --- /dev/null +++ b/flutter/web/js/src/connection.ts @@ -0,0 +1,773 @@ +import Websock from "./websock"; +import * as message from "./message.js"; +import * as rendezvous from "./rendezvous.js"; +import { loadVp9 } from "./codec"; +import * as sha256 from "fast-sha256"; +import * as globals from "./globals"; +import { decompress, mapKey, sleep } from "./common"; + +const PORT = 21116; +const HOSTS = [ + "rs-sg.rustdesk.com", + "rs-cn.rustdesk.com", + "rs-us.rustdesk.com", +]; +let HOST = localStorage.getItem("rendezvous-server") || HOSTS[0]; +const SCHEMA = "ws://"; + +type MsgboxCallback = (type: string, title: string, text: string) => void; +type DrawCallback = (data: Uint8Array) => void; +//const cursorCanvas = document.createElement("canvas"); + +export default class Connection { + _msgs: any[]; + _ws: Websock | undefined; + _interval: any; + _id: string; + _hash: message.Hash | undefined; + _msgbox: MsgboxCallback; + _draw: DrawCallback; + _peerInfo: message.PeerInfo | undefined; + _firstFrame: Boolean | undefined; + _videoDecoder: any; + _password: Uint8Array | undefined; + _options: any; + _videoTestSpeed: number[]; + //_cursors: { [name: number]: any }; + + constructor() { + this._msgbox = globals.msgbox; + this._draw = globals.draw; + this._msgs = []; + this._id = ""; + this._videoTestSpeed = [0, 0]; + //this._cursors = {}; + } + + async start(id: string) { + try { + await this._start(id); + } catch (e: any) { + this.msgbox( + "error", + "Connection Error", + e.type == "close" ? "Reset by the peer" : String(e) + ); + } + } + + async _start(id: string) { + if (!this._options) { + this._options = globals.getPeers()[id] || {}; + } + if (!this._password) { + const p = this.getOption("password"); + if (p) { + try { + this._password = Uint8Array.from(JSON.parse("[" + p + "]")); + } catch (e) { + console.error(e); + } + } + } + this._interval = setInterval(() => { + while (this._msgs.length) { + this._ws?.sendMessage(this._msgs[0]); + this._msgs.splice(0, 1); + } + }, 1); + this.loadVideoDecoder(); + const uri = getDefaultUri(); + const ws = new Websock(uri, true); + this._ws = ws; + this._id = id; + console.log( + new Date() + ": Conntecting to rendezvoous server: " + uri + ", for " + id + ); + await ws.open(); + console.log(new Date() + ": Connected to rendezvoous server"); + const conn_type = rendezvous.ConnType.DEFAULT_CONN; + const nat_type = rendezvous.NatType.SYMMETRIC; + const punch_hole_request = rendezvous.PunchHoleRequest.fromPartial({ + id, + licence_key: localStorage.getItem("key") || undefined, + conn_type, + nat_type, + token: localStorage.getItem("access_token") || undefined, + }); + ws.sendRendezvous({ punch_hole_request }); + const msg = (await ws.next()) as rendezvous.RendezvousMessage; + ws.close(); + console.log(new Date() + ": Got relay response"); + const phr = msg.punch_hole_response; + const rr = msg.relay_response; + if (phr) { + if (phr?.other_failure) { + this.msgbox("error", "Error", phr?.other_failure); + return; + } + if (phr.failure != rendezvous.PunchHoleResponse_Failure.UNRECOGNIZED) { + switch (phr?.failure) { + case rendezvous.PunchHoleResponse_Failure.ID_NOT_EXIST: + this.msgbox("error", "Error", "ID does not exist"); + break; + case rendezvous.PunchHoleResponse_Failure.OFFLINE: + this.msgbox("error", "Error", "Remote desktop is offline"); + break; + case rendezvous.PunchHoleResponse_Failure.LICENSE_MISMATCH: + this.msgbox("error", "Error", "Key mismatch"); + break; + case rendezvous.PunchHoleResponse_Failure.LICENSE_OVERUSE: + this.msgbox("error", "Error", "Key overuse"); + break; + } + } + } else if (rr) { + if (!rr.version) { + this.msgbox("error", "Error", "Remote version is low, not support web"); + return; + } + await this.connectRelay(rr); + } + } + + async connectRelay(rr: rendezvous.RelayResponse) { + const pk = rr.pk; + let uri = rr.relay_server; + if (uri) { + uri = getrUriFromRs(uri, true, 2); + } else { + uri = getDefaultUri(true); + } + const uuid = rr.uuid; + console.log(new Date() + ": Connecting to relay server: " + uri); + const ws = new Websock(uri, false); + await ws.open(); + console.log(new Date() + ": Connected to relay server"); + this._ws = ws; + const request_relay = rendezvous.RequestRelay.fromPartial({ + licence_key: localStorage.getItem("key") || undefined, + uuid, + }); + ws.sendRendezvous({ request_relay }); + const secure = (await this.secure(pk)) || false; + globals.pushEvent("connection_ready", { secure, direct: false }); + await this.msgLoop(); + } + + async secure(pk: Uint8Array | undefined) { + if (pk) { + const RS_PK = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw="; + try { + pk = await globals.verify(pk, localStorage.getItem("key") || RS_PK); + if (pk) { + const idpk = message.IdPk.decode(pk); + if (idpk.id == this._id) { + pk = idpk.pk; + } + } + if (pk?.length != 32) { + pk = undefined; + } + } catch (e) { + console.error(e); + pk = undefined; + } + if (!pk) + console.error( + "Handshake failed: invalid public key from rendezvous server" + ); + } + if (!pk) { + // send an empty message out in case server is setting up secure and waiting for first message + const public_key = message.PublicKey.fromPartial({}); + this._ws?.sendMessage({ public_key }); + return; + } + const msg = (await this._ws?.next()) as message.Message; + let signedId: any = msg?.signed_id; + if (!signedId) { + console.error("Handshake failed: invalid message type"); + const public_key = message.PublicKey.fromPartial({}); + this._ws?.sendMessage({ public_key }); + return; + } + try { + signedId = await globals.verify(signedId.id, Uint8Array.from(pk!)); + } catch (e) { + console.error(e); + // fall back to non-secure connection in case pk mismatch + console.error("pk mismatch, fall back to non-secure"); + const public_key = message.PublicKey.fromPartial({}); + this._ws?.sendMessage({ public_key }); + return; + } + const idpk = message.IdPk.decode(signedId); + const id = idpk.id; + const theirPk = idpk.pk; + if (id != this._id!) { + console.error("Handshake failed: sign failure"); + const public_key = message.PublicKey.fromPartial({}); + this._ws?.sendMessage({ public_key }); + return; + } + if (theirPk.length != 32) { + console.error( + "Handshake failed: invalid public box key length from peer" + ); + const public_key = message.PublicKey.fromPartial({}); + this._ws?.sendMessage({ public_key }); + return; + } + const [mySk, asymmetric_value] = globals.genBoxKeyPair(); + const secret_key = globals.genSecretKey(); + const symmetric_value = globals.seal(secret_key, theirPk, mySk); + const public_key = message.PublicKey.fromPartial({ + asymmetric_value, + symmetric_value, + }); + this._ws?.sendMessage({ public_key }); + this._ws?.setSecretKey(secret_key); + console.log("secured"); + return true; + } + + async msgLoop() { + while (true) { + const msg = (await this._ws?.next()) as message.Message; + if (msg?.hash) { + this._hash = msg?.hash; + if (!this._password) + this.msgbox("input-password", "Password Required", ""); + this.login(); + } else if (msg?.test_delay) { + const test_delay = msg?.test_delay; + console.log(test_delay); + if (!test_delay.from_client) { + this._ws?.sendMessage({ test_delay }); + } + } else if (msg?.login_response) { + const r = msg?.login_response; + if (r.error) { + if (r.error == "Wrong Password") { + this._password = undefined; + this.msgbox( + "re-input-password", + r.error, + "Do you want to enter again?" + ); + } else { + this.msgbox("error", "Login Error", r.error); + } + } else if (r.peer_info) { + this.handlePeerInfo(r.peer_info); + } + } else if (msg?.video_frame) { + this.handleVideoFrame(msg?.video_frame!); + } else if (msg?.clipboard) { + const cb = msg?.clipboard; + if (cb.compress) { + const c = await decompress(cb.content); + if (!c) continue; + cb.content = c; + } + try { + globals.copyToClipboard(new TextDecoder().decode(cb.content)); + } catch (e) { + console.error(e); + } + // globals.pushEvent("clipboard", cb); + } else if (msg?.cursor_data) { + const cd = msg?.cursor_data; + const c = await decompress(cd.colors); + if (!c) continue; + cd.colors = c; + globals.pushEvent("cursor_data", cd); + /* + let ctx = cursorCanvas.getContext("2d"); + cursorCanvas.width = cd.width; + cursorCanvas.height = cd.height; + let imgData = new ImageData( + new Uint8ClampedArray(c), + cd.width, + cd.height + ); + ctx?.clearRect(0, 0, cd.width, cd.height); + ctx?.putImageData(imgData, 0, 0); + let url = cursorCanvas.toDataURL(); + const img = document.createElement("img"); + img.src = url; + this._cursors[cd.id] = img; + //cursorCanvas.width /= 2.; + //cursorCanvas.height /= 2.; + //ctx?.drawImage(img, cursorCanvas.width, cursorCanvas.height); + url = cursorCanvas.toDataURL(); + document.body.style.cursor = + "url(" + url + ")" + cd.hotx + " " + cd.hoty + ", default"; + console.log(document.body.style.cursor); + */ + } else if (msg?.cursor_id) { + globals.pushEvent("cursor_id", { id: msg?.cursor_id }); + } else if (msg?.cursor_position) { + globals.pushEvent("cursor_position", msg?.cursor_position); + } else if (msg?.misc) { + if (!this.handleMisc(msg?.misc)) break; + } else if (msg?.audio_frame) { + globals.playAudio(msg?.audio_frame.data); + } + } + } + + msgbox(type_: string, title: string, text: string) { + this._msgbox?.(type_, title, text); + } + + draw(frame: any) { + this._draw?.(frame); + globals.draw(frame); + } + + close() { + this._msgs = []; + clearInterval(this._interval); + this._ws?.close(); + this._videoDecoder?.close(); + } + + refresh() { + const misc = message.Misc.fromPartial({ refresh_video: true }); + this._ws?.sendMessage({ misc }); + } + + setMsgbox(callback: MsgboxCallback) { + this._msgbox = callback; + } + + setDraw(callback: DrawCallback) { + this._draw = callback; + } + + login(password: string | undefined = undefined) { + if (password) { + const salt = this._hash?.salt; + let p = hash([password, salt!]); + this._password = p; + const challenge = this._hash?.challenge; + p = hash([p, challenge!]); + this.msgbox("connecting", "Connecting...", "Logging in..."); + this._sendLoginMessage(p); + } else { + let p = this._password; + if (p) { + const challenge = this._hash?.challenge; + p = hash([p, challenge!]); + } + this._sendLoginMessage(p); + } + } + + async reconnect() { + this.close(); + await this.start(this._id); + } + + _sendLoginMessage(password: Uint8Array | undefined = undefined) { + const login_request = message.LoginRequest.fromPartial({ + username: this._id!, + my_id: "web", // to-do + my_name: "web", // to-do + password, + option: this.getOptionMessage(), + video_ack_required: true, + }); + this._ws?.sendMessage({ login_request }); + } + + getOptionMessage(): message.OptionMessage | undefined { + let n = 0; + const msg = message.OptionMessage.fromPartial({}); + const q = this.getImageQualityEnum(this.getImageQuality(), true); + const yes = message.OptionMessage_BoolOption.Yes; + if (q != undefined) { + msg.image_quality = q; + n += 1; + } + if (this._options["show-remote-cursor"]) { + msg.show_remote_cursor = yes; + n += 1; + } + if (this._options["lock-after-session-end"]) { + msg.lock_after_session_end = yes; + n += 1; + } + if (this._options["privacy-mode"]) { + msg.privacy_mode = yes; + n += 1; + } + if (this._options["disable-audio"]) { + msg.disable_audio = yes; + n += 1; + } + if (this._options["disable-clipboard"]) { + msg.disable_clipboard = yes; + n += 1; + } + return n > 0 ? msg : undefined; + } + + sendVideoReceived() { + const misc = message.Misc.fromPartial({ video_received: true }); + this._ws?.sendMessage({ misc }); + } + + handleVideoFrame(vf: message.VideoFrame) { + if (!this._firstFrame) { + this.msgbox("", "", ""); + this._firstFrame = true; + } + if (vf.vp9s) { + const dec = this._videoDecoder; + var tm = new Date().getTime(); + var i = 0; + const n = vf.vp9s?.frames.length; + vf.vp9s.frames.forEach((f) => { + dec.processFrame(f.data.slice(0).buffer, (ok: any) => { + i++; + if (i == n) this.sendVideoReceived(); + if (ok && dec.frameBuffer && n == i) { + this.draw(dec.frameBuffer); + const now = new Date().getTime(); + var elapsed = now - tm; + this._videoTestSpeed[1] += elapsed; + this._videoTestSpeed[0] += 1; + if (this._videoTestSpeed[0] >= 30) { + console.log( + "video decoder: " + + parseInt( + "" + this._videoTestSpeed[1] / this._videoTestSpeed[0] + ) + ); + this._videoTestSpeed = [0, 0]; + } + } + }); + }); + } + } + + handlePeerInfo(pi: message.PeerInfo) { + this._peerInfo = pi; + if (pi.displays.length == 0) { + this.msgbox("error", "Remote Error", "No Display"); + return; + } + this.msgbox("success", "Successful", "Connected, waiting for image..."); + globals.pushEvent("peer_info", pi); + const p = this.shouldAutoLogin(); + if (p) this.inputOsPassword(p); + const username = this.getOption("info")?.username; + if (username && !pi.username) pi.username = username; + this.setOption("info", pi); + if (this.getRemember()) { + if (this._password?.length) { + const p = this._password.toString(); + if (p != this.getOption("password")) { + this.setOption("password", p); + console.log("remember password of " + this._id); + } + } + } else { + this.setOption("password", undefined); + } + } + + shouldAutoLogin(): string { + const l = this.getOption("lock-after-session-end"); + const a = !!this.getOption("auto-login"); + const p = this.getOption("os-password"); + if (p && l && a) { + return p; + } + return ""; + } + + handleMisc(misc: message.Misc) { + if (misc.audio_format) { + globals.initAudio( + misc.audio_format.channels, + misc.audio_format.sample_rate + ); + } else if (misc.chat_message) { + globals.pushEvent("chat", { text: misc.chat_message.text }); + } else if (misc.permission_info) { + const p = misc.permission_info; + console.info("Change permission " + p.permission + " -> " + p.enabled); + let name; + switch (p.permission) { + case message.PermissionInfo_Permission.Keyboard: + name = "keyboard"; + break; + case message.PermissionInfo_Permission.Clipboard: + name = "clipboard"; + break; + case message.PermissionInfo_Permission.Audio: + name = "audio"; + break; + default: + return; + } + globals.pushEvent("permission", { [name]: p.enabled }); + } else if (misc.switch_display) { + this.loadVideoDecoder(); + globals.pushEvent("switch_display", misc.switch_display); + } else if (misc.close_reason) { + this.msgbox("error", "Connection Error", misc.close_reason); + this.close(); + return false; + } + return true; + } + + getRemember(): Boolean { + return this._options["remember"] || false; + } + + setRemember(v: Boolean) { + this.setOption("remember", v); + } + + getOption(name: string): any { + return this._options[name]; + } + + setOption(name: string, value: any) { + if (value == undefined) { + delete this._options[name]; + } else { + this._options[name] = value; + } + this._options["tm"] = new Date().getTime(); + const peers = globals.getPeers(); + peers[this._id] = this._options; + localStorage.setItem("peers", JSON.stringify(peers)); + } + + inputKey( + name: string, + down: boolean, + press: boolean, + alt: Boolean, + ctrl: Boolean, + shift: Boolean, + command: Boolean + ) { + const key_event = mapKey(name, globals.isDesktop()); + if (!key_event) return; + if (alt && (name == "VK_MENU" || name == "RAlt")) { + alt = false; + } + if (ctrl && (name == "VK_CONTROL" || name == "RControl")) { + ctrl = false; + } + if (shift && (name == "VK_SHIFT" || name == "RShift")) { + shift = false; + } + if (command && (name == "Meta" || name == "RWin")) { + command = false; + } + key_event.down = down; + key_event.press = press; + key_event.modifiers = this.getMod(alt, ctrl, shift, command); + this._ws?.sendMessage({ key_event }); + } + + ctrlAltDel() { + const key_event = message.KeyEvent.fromPartial({ down: true }); + if (this._peerInfo?.platform == "Windows") { + key_event.control_key = message.ControlKey.CtrlAltDel; + } else { + key_event.control_key = message.ControlKey.Delete; + key_event.modifiers = this.getMod(true, true, false, false); + } + this._ws?.sendMessage({ key_event }); + } + + inputString(seq: string) { + const key_event = message.KeyEvent.fromPartial({ seq }); + this._ws?.sendMessage({ key_event }); + } + + switchDisplay(display: number) { + const switch_display = message.SwitchDisplay.fromPartial({ display }); + const misc = message.Misc.fromPartial({ switch_display }); + this._ws?.sendMessage({ misc }); + } + + async inputOsPassword(seq: string) { + this.inputMouse(); + await sleep(50); + this.inputMouse(0, 3, 3); + await sleep(50); + this.inputMouse(1 | (1 << 3)); + this.inputMouse(2 | (1 << 3)); + await sleep(1200); + const key_event = message.KeyEvent.fromPartial({ press: true, seq }); + this._ws?.sendMessage({ key_event }); + } + + lockScreen() { + const key_event = message.KeyEvent.fromPartial({ + down: true, + control_key: message.ControlKey.LockScreen, + }); + this._ws?.sendMessage({ key_event }); + } + + getMod(alt: Boolean, ctrl: Boolean, shift: Boolean, command: Boolean) { + const mod: message.ControlKey[] = []; + if (alt) mod.push(message.ControlKey.Alt); + if (ctrl) mod.push(message.ControlKey.Control); + if (shift) mod.push(message.ControlKey.Shift); + if (command) mod.push(message.ControlKey.Meta); + return mod; + } + + inputMouse( + mask: number = 0, + x: number = 0, + y: number = 0, + alt: Boolean = false, + ctrl: Boolean = false, + shift: Boolean = false, + command: Boolean = false + ) { + const mouse_event = message.MouseEvent.fromPartial({ + mask, + x, + y, + modifiers: this.getMod(alt, ctrl, shift, command), + }); + this._ws?.sendMessage({ mouse_event }); + } + + toggleOption(name: string) { + const v = !this._options[name]; + const option = message.OptionMessage.fromPartial({}); + const v2 = v + ? message.OptionMessage_BoolOption.Yes + : message.OptionMessage_BoolOption.No; + switch (name) { + case "show-remote-cursor": + option.show_remote_cursor = v2; + break; + case "disable-audio": + option.disable_audio = v2; + break; + case "disable-clipboard": + option.disable_clipboard = v2; + break; + case "lock-after-session-end": + option.lock_after_session_end = v2; + break; + case "privacy-mode": + option.privacy_mode = v2; + break; + case "block-input": + option.block_input = message.OptionMessage_BoolOption.Yes; + break; + case "unblock-input": + option.block_input = message.OptionMessage_BoolOption.No; + break; + default: + return; + } + if (name.indexOf("block-input") < 0) this.setOption(name, v); + const misc = message.Misc.fromPartial({ option }); + this._ws?.sendMessage({ misc }); + } + + getImageQuality() { + return this.getOption("image-quality"); + } + + getImageQualityEnum( + value: string, + ignoreDefault: Boolean + ): message.ImageQuality | undefined { + switch (value) { + case "low": + return message.ImageQuality.Low; + case "best": + return message.ImageQuality.Best; + case "balanced": + return ignoreDefault ? undefined : message.ImageQuality.Balanced; + default: + return undefined; + } + } + + setImageQuality(value: string) { + this.setOption("image-quality", value); + const image_quality = this.getImageQualityEnum(value, false); + if (image_quality == undefined) return; + const option = message.OptionMessage.fromPartial({ image_quality }); + const misc = message.Misc.fromPartial({ option }); + this._ws?.sendMessage({ misc }); + } + + loadVideoDecoder() { + this._videoDecoder?.close(); + loadVp9((decoder: any) => { + this._videoDecoder = decoder; + console.log("vp9 loaded"); + console.log(decoder); + }); + } +} + +function testDelay() { + var nearest = ""; + HOSTS.forEach((host) => { + const now = new Date().getTime(); + new Websock(getrUriFromRs(host), true).open().then(() => { + console.log("latency of " + host + ": " + (new Date().getTime() - now)); + if (!nearest) { + HOST = host; + localStorage.setItem("rendezvous-server", host); + } + }); + }); +} + +testDelay(); + +function getDefaultUri(isRelay: Boolean = false): string { + const host = localStorage.getItem("custom-rendezvous-server"); + return getrUriFromRs(host || HOST, isRelay); +} + +function getrUriFromRs( + uri: string, + isRelay: Boolean = false, + roffset: number = 0 +): string { + if (uri.indexOf(":") > 0) { + const tmp = uri.split(":"); + const port = parseInt(tmp[1]); + uri = tmp[0] + ":" + (port + (isRelay ? roffset || 3 : 2)); + } else { + uri += ":" + (PORT + (isRelay ? 3 : 2)); + } + return SCHEMA + uri; +} + +function hash(datas: (string | Uint8Array)[]): Uint8Array { + const hasher = new sha256.Hash(); + datas.forEach((data) => { + if (typeof data == "string") { + data = new TextEncoder().encode(data); + } + return hasher.update(data); + }); + return hasher.digest(); +} diff --git a/flutter/web/js/src/globals.js b/flutter/web/js/src/globals.js new file mode 100644 index 000000000..a9eb941a5 --- /dev/null +++ b/flutter/web/js/src/globals.js @@ -0,0 +1,404 @@ +import Connection from "./connection"; +import _sodium from "libsodium-wrappers"; +import { CursorData } from "./message"; +import { loadVp9 } from "./codec"; +import { checkIfRetry, version } from "./gen_js_from_hbb"; +import { initZstd, translate } from "./common"; +import PCMPlayer from "pcm-player"; + +var currentFrame = undefined; +var events = []; + +window.curConn = undefined; +window.getRgba = () => { + const tmp = currentFrame; + currentFrame = undefined; + return tmp || null; +} +window.isMobile = () => { + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) + || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4)); +} + +export function isDesktop() { + return !isMobile(); +} + +export function msgbox(type, title, text) { + if (!events) return; + if (!type || (type == 'error' && !text)) return; + const text2 = text.toLowerCase(); + var hasRetry = checkIfRetry(type, title, text) ? 'true' : ''; + events.push({ name: 'msgbox', type, title, text, hasRetry }); +} + +function jsonfyForDart(payload) { + var tmp = {}; + for (const [key, value] of Object.entries(payload)) { + if (!key) continue; + tmp[key] = value instanceof Uint8Array ? '[' + value.toString() + ']' : JSON.stringify(value); + } + return tmp; +} + +export function pushEvent(name, payload) { + if (!events) return; + payload = jsonfyForDart(payload); + payload.name = name; + events.push(payload); +} + +let yuvWorker; +let yuvCanvas; +let gl; +let pixels; +let flipPixels; +let oldSize; +if (YUVCanvas.WebGLFrameSink.isAvailable()) { + var canvas = document.createElement('canvas'); + yuvCanvas = YUVCanvas.attach(canvas, { webGL: true }); + gl = canvas.getContext("webgl"); +} else { + yuvWorker = new Worker("./yuv.js"); +} +let testSpeed = [0, 0]; + +export function draw(frame) { + if (yuvWorker) { + // frame's (y/u/v).bytes already detached, can not transferrable any more. + yuvWorker.postMessage(frame); + } else { + var tm0 = new Date().getTime(); + yuvCanvas.drawFrame(frame); + var width = canvas.width; + var height = canvas.height; + var size = width * height * 4; + if (size != oldSize) { + pixels = new Uint8Array(size); + flipPixels = new Uint8Array(size); + oldSize = size; + } + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + const row = width * 4; + const end = (height - 1) * row; + for (let i = 0; i < size; i += row) { + flipPixels.set(pixels.subarray(i, i + row), end - i); + } + currentFrame = flipPixels; + testSpeed[1] += new Date().getTime() - tm0; + testSpeed[0] += 1; + if (testSpeed[0] > 30) { + console.log('gl: ' + parseInt('' + testSpeed[1] / testSpeed[0])); + testSpeed = [0, 0]; + } + } + /* + var testCanvas = document.getElementById("test-yuv-decoder-canvas"); + if (testCanvas && currentFrame) { + var ctx = testCanvas.getContext("2d"); + testCanvas.width = frame.format.displayWidth; + testCanvas.height = frame.format.displayHeight; + var img = ctx.createImageData(testCanvas.width, testCanvas.height); + img.data.set(currentFrame); + ctx.putImageData(img, 0, 0); + } + */ +} + +export function sendOffCanvas(c) { + let canvas = c.transferControlToOffscreen(); + yuvWorker.postMessage({ canvas }, [canvas]); +} + +export function setConn(conn) { + window.curConn = conn; +} + +export function getConn() { + return window.curConn; +} + +export async function startConn(id) { + currentFrame = undefined; + events = []; + setByName('remote_id', id); + await curConn.start(id); +} + +export function close() { + getConn()?.close(); + setConn(undefined); + currentFrame = undefined; + events = undefined; +} + +export function newConn() { + window.curConn?.close(); + const conn = new Connection(); + setConn(conn); + return conn; +} + +let sodium; +export async function verify(signed, pk) { + if (!sodium) { + await _sodium.ready; + sodium = _sodium; + } + if (typeof pk == 'string') { + pk = decodeBase64(pk); + } + return sodium.crypto_sign_open(signed, pk); +} + +export function decodeBase64(pk) { + return sodium.from_base64(pk, sodium.base64_variants.ORIGINAL); +} + +export function genBoxKeyPair() { + const pair = sodium.crypto_box_keypair(); + const sk = pair.privateKey; + const pk = pair.publicKey; + return [sk, pk]; +} + +export function genSecretKey() { + return sodium.crypto_secretbox_keygen(); +} + +export function seal(unsigned, theirPk, ourSk) { + const nonce = Uint8Array.from(Array(24).fill(0)); + return sodium.crypto_box_easy(unsigned, nonce, theirPk, ourSk); +} + +function makeOnce(value) { + var byteArray = Array(24).fill(0); + + for (var index = 0; index < byteArray.length && value > 0; index++) { + var byte = value & 0xff; + byteArray[index] = byte; + value = (value - byte) / 256; + } + + return Uint8Array.from(byteArray); +}; + +export function encrypt(unsigned, nonce, key) { + return sodium.crypto_secretbox_easy(unsigned, makeOnce(nonce), key); +} + +export function decrypt(signed, nonce, key) { + return sodium.crypto_secretbox_open_easy(signed, makeOnce(nonce), key); +} + +window.setByName = (name, value) => { + switch (name) { + case 'remote_id': + localStorage.setItem('remote-id', value); + break; + case 'connect': + newConn(); + startConn(value); + break; + case 'login': + value = JSON.parse(value); + curConn.setRemember(value.remember == 'true'); + curConn.login(value.password); + break; + case 'close': + close(); + break; + case 'refresh': + curConn.refresh(); + break; + case 'reconnect': + curConn.reconnect(); + break; + case 'toggle_option': + curConn.toggleOption(value); + break; + case 'image_quality': + curConn.setImageQuality(value); + break; + case 'lock_screen': + curConn.lockScreen(); + break; + case 'ctrl_alt_del': + curConn.ctrlAltDel(); + break; + case 'switch_display': + curConn.switchDisplay(value); + break; + case 'remove': + const peers = getPeers(); + delete peers[value]; + localStorage.setItem('peers', JSON.stringify(peers)); + break; + case 'input_key': + value = JSON.parse(value); + curConn.inputKey(value.name, value.down == 'true', value.press == 'true', value.alt == 'true', value.ctrl == 'true', value.shift == 'true', value.command == 'true'); + break; + case 'input_string': + curConn.inputString(value); + break; + case 'send_mouse': + let mask = 0; + value = JSON.parse(value); + switch (value.type) { + case 'down': + mask = 1; + break; + case 'up': + mask = 2; + break; + case 'wheel': + mask = 3; + break; + } + switch (value.buttons) { + case 'left': + mask |= 1 << 3; + break; + case 'right': + mask |= 2 << 3; + break; + case 'wheel': + mask |= 4 << 3; + } + curConn.inputMouse(mask, parseInt(value.x || '0'), parseInt(value.y || '0'), value.alt == 'true', value.ctrl == 'true', value.shift == 'true', value.command == 'true'); + break; + case 'option': + value = JSON.parse(value); + localStorage.setItem(value.name, value.value); + break; + case 'peer_option': + value = JSON.parse(value); + curConn.setOption(value.name, value.value); + break; + case 'input_os_password': + curConn.inputOsPassword(value); + break; + default: + break; + } +} + +window.getByName = (name, arg) => { + let v = _getByName(name, arg); + if (typeof v == 'string' || v instanceof String) return v; + if (v == undefined || v == null) return ''; + return JSON.stringify(v); +} + +function getPeersForDart() { + const peers = []; + for (const [id, value] of Object.entries(getPeers())) { + if (!id) continue; + const tm = value['tm']; + const info = value['info']; + if (!tm || !info) continue; + peers.push([tm, id, info]); + } + return peers.sort().reverse().map(x => x.slice(1)); +} + +function _getByName(name, arg) { + switch (name) { + case 'peers': + return getPeersForDart(); + case 'remote_id': + return localStorage.getItem('remote-id'); + case 'remember': + return curConn.getRemember(); + case 'event': + if (events && events.length) { + const e = events[0]; + events.splice(0, 1); + return JSON.stringify(e); + } + break; + case 'toggle_option': + return curConn.getOption(arg) || false; + case 'option': + return localStorage.getItem(arg); + case 'image_quality': + return curConn.getImageQuality(); + case 'translate': + arg = JSON.parse(arg); + return translate(arg.locale, arg.text); + case 'peer_option': + return curConn.getOption(arg); + case 'test_if_valid_server': + break; + case 'version': + return version; + } + return ''; +} + +let opusWorker = new Worker("./libopus.js"); +let pcmPlayer; + +export function initAudio(channels, sampleRate) { + pcmPlayer = newAudioPlayer(channels, sampleRate); + opusWorker.postMessage({ channels, sampleRate }); +} + +export function playAudio(packet) { + opusWorker.postMessage(packet, [packet.buffer]); +} + +window.init = async () => { + if (yuvWorker) { + yuvWorker.onmessage = (e) => { + currentFrame = e.data; + } + } + opusWorker.onmessage = (e) => { + pcmPlayer.feed(e.data); + } + loadVp9(() => { }); + await initZstd(); + console.log('init done'); +} + +export function getPeers() { + try { + return JSON.parse(localStorage.getItem('peers')) || {}; + } catch (e) { + return {}; + } +} + +function newAudioPlayer(channels, sampleRate) { + return new PCMPlayer({ + channels, + sampleRate, + flushingTime: 2000 + }); +} + +export function copyToClipboard(text) { + if (window.clipboardData && window.clipboardData.setData) { + // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible. + return window.clipboardData.setData("Text", text); + + } + else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { + var textarea = document.createElement("textarea"); + textarea.textContent = text; + textarea.style.position = "fixed"; // Prevent scrolling to bottom of page in Microsoft Edge. + document.body.appendChild(textarea); + textarea.select(); + try { + return document.execCommand("copy"); // Security exception may be thrown by some browsers. + } + catch (ex) { + console.warn("Copy to clipboard failed.", ex); + // return prompt("Copy to clipboard: Ctrl+C, Enter", text); + } + finally { + document.body.removeChild(textarea); + } + } +} \ No newline at end of file diff --git a/flutter/web/js/src/main.ts b/flutter/web/js/src/main.ts new file mode 100644 index 000000000..2be877f58 --- /dev/null +++ b/flutter/web/js/src/main.ts @@ -0,0 +1,2 @@ +import "./globals"; +import "./ui"; \ No newline at end of file diff --git a/flutter/web/js/src/style.css b/flutter/web/js/src/style.css new file mode 100644 index 000000000..852de7aa2 --- /dev/null +++ b/flutter/web/js/src/style.css @@ -0,0 +1,8 @@ +#app { + font-family: Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-align: center; + color: #2c3e50; + margin-top: 60px; +} diff --git a/flutter/web/js/src/ui.js b/flutter/web/js/src/ui.js new file mode 100644 index 000000000..446334022 --- /dev/null +++ b/flutter/web/js/src/ui.js @@ -0,0 +1,108 @@ +import "./style.css"; +import "./connection"; +import * as globals from "./globals"; + +const app = document.querySelector('#app'); + +if (app) { + app.innerHTML = ` +
+ + + + +
Host:
Key:
Id:
+ + + +`; + + let player; + window.init(); + + document.body.onload = () => { + const host = document.querySelector('#host'); + host.value = localStorage.getItem('custom-rendezvous-server'); + const id = document.querySelector('#id'); + id.value = localStorage.getItem('id'); + const key = document.querySelector('#key'); + key.value = localStorage.getItem('key'); + player = YUVCanvas.attach(document.getElementById('player')); + // globals.sendOffCanvas(document.getElementById('player')); + }; + + window.connect = () => { + const host = document.querySelector('#host'); + localStorage.setItem('custom-rendezvous-server', host.value); + const id = document.querySelector('#id'); + localStorage.setItem('id', id.value); + const key = document.querySelector('#key'); + localStorage.setItem('key', key.value); + const func = async () => { + const conn = globals.newConn(); + conn.setMsgbox(msgbox); + conn.setDraw((f) => { + /* + if (!(document.getElementById('player').width > 0)) { + document.getElementById('player').width = f.format.displayWidth; + document.getElementById('player').height = f.format.displayHeight; + } + */ + globals.draw(f); + player.drawFrame(f); + }); + document.querySelector('div#status').style.display = 'block'; + document.querySelector('div#connect').style.display = 'none'; + document.querySelector('div#text').innerHTML = 'Connecting ...'; + await conn.start(id.value); + }; + func(); + } + + function msgbox(type, title, text) { + if (!globals.getConn()) return; + if (type == 'input-password') { + document.querySelector('div#status').style.display = 'none'; + document.querySelector('div#password').style.display = 'block'; + } else if (!type) { + document.querySelector('div#canvas').style.display = 'block'; + document.querySelector('div#password').style.display = 'none'; + document.querySelector('div#status').style.display = 'none'; + } else if (type == 'error') { + document.querySelector('div#status').style.display = 'block'; + document.querySelector('div#canvas').style.display = 'none'; + document.querySelector('div#text').innerHTML = '
' + text + '
'; + } else { + document.querySelector('div#password').style.display = 'none'; + document.querySelector('div#status').style.display = 'block'; + document.querySelector('div#text').innerHTML = '
' + text + '
'; + } + } + + window.cancel = () => { + globals.close(); + document.querySelector('div#connect').style.display = 'block'; + document.querySelector('div#password').style.display = 'none'; + document.querySelector('div#status').style.display = 'none'; + document.querySelector('div#canvas').style.display = 'none'; + } + + window.confirm = () => { + const password = document.querySelector('input#password').value; + if (password) { + document.querySelector('div#password').style.display = 'none'; + globals.getConn().login(password); + } + } +} \ No newline at end of file diff --git a/flutter/web/js/src/vite-env.d.ts b/flutter/web/js/src/vite-env.d.ts new file mode 100644 index 000000000..151aa6856 --- /dev/null +++ b/flutter/web/js/src/vite-env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/flutter/web/js/src/websock.ts b/flutter/web/js/src/websock.ts new file mode 100644 index 000000000..6f05e6f6b --- /dev/null +++ b/flutter/web/js/src/websock.ts @@ -0,0 +1,183 @@ +import * as message from "./message.js"; +import * as rendezvous from "./rendezvous.js"; +import * as globals from "./globals"; + +type Keys = "message" | "open" | "close" | "error"; + +export default class Websock { + _websocket: WebSocket; + _eventHandlers: { [key in Keys]: Function }; + _buf: (rendezvous.RendezvousMessage | message.Message)[]; + _status: any; + _latency: number; + _secretKey: [Uint8Array, number, number] | undefined; + _uri: string; + _isRendezvous: boolean; + + constructor(uri: string, isRendezvous: boolean = true) { + this._eventHandlers = { + message: (_: any) => {}, + open: () => {}, + close: () => {}, + error: () => {}, + }; + this._uri = uri; + this._status = ""; + this._buf = []; + this._websocket = new WebSocket(uri); + this._websocket.onmessage = this._recv_message.bind(this); + this._websocket.binaryType = "arraybuffer"; + this._latency = new Date().getTime(); + this._isRendezvous = isRendezvous; + } + + latency(): number { + return this._latency; + } + + setSecretKey(key: Uint8Array) { + this._secretKey = [key, 0, 0]; + } + + sendMessage(json: message.DeepPartial) { + let data = message.Message.encode( + message.Message.fromPartial(json) + ).finish(); + let k = this._secretKey; + if (k) { + k[1] += 1; + data = globals.encrypt(data, k[1], k[0]); + } + this._websocket.send(data); + } + + sendRendezvous(data: rendezvous.DeepPartial) { + this._websocket.send( + rendezvous.RendezvousMessage.encode( + rendezvous.RendezvousMessage.fromPartial(data) + ).finish() + ); + } + + parseMessage(data: Uint8Array) { + return message.Message.decode(data); + } + + parseRendezvous(data: Uint8Array) { + return rendezvous.RendezvousMessage.decode(data); + } + + // Event Handlers + off(evt: Keys) { + this._eventHandlers[evt] = () => {}; + } + + on(evt: Keys, handler: Function) { + this._eventHandlers[evt] = handler; + } + + async open(timeout: number = 12000): Promise { + return new Promise((resolve, reject) => { + setTimeout(() => { + if (this._status != "open") { + reject(this._status || "Timeout"); + } + }, timeout); + this._websocket.onopen = () => { + this._latency = new Date().getTime() - this._latency; + this._status = "open"; + console.debug(">> WebSock.onopen"); + if (this._websocket?.protocol) { + console.info( + "Server choose sub-protocol: " + this._websocket.protocol + ); + } + + this._eventHandlers.open(); + console.info("WebSock.onopen"); + resolve(this); + }; + this._websocket.onclose = (e) => { + if (this._status == "open") { + // e.code 1000 means that the connection was closed normally. + // + } + this._status = e; + console.error("WebSock.onclose: "); + console.error(e); + this._eventHandlers.close(e); + reject("Reset by the peer"); + }; + this._websocket.onerror = (e: any) => { + if (!this._status) { + reject("Failed to connect to " + (this._isRendezvous ? "rendezvous" : "relay") + " server"); + return; + } + this._status = e; + console.error("WebSock.onerror: ") + console.error(e); + this._eventHandlers.error(e); + }; + }); + } + + async next( + timeout = 12000 + ): Promise { + const func = ( + resolve: (value: rendezvous.RendezvousMessage | message.Message) => void, + reject: (reason: any) => void, + tm0: number + ) => { + if (this._buf.length) { + resolve(this._buf[0]); + this._buf.splice(0, 1); + } else { + if (this._status != "open") { + reject(this._status); + return; + } + if (new Date().getTime() > tm0 + timeout) { + reject("Timeout"); + } else { + setTimeout(() => func(resolve, reject, tm0), 1); + } + } + }; + return new Promise((resolve, reject) => { + func(resolve, reject, new Date().getTime()); + }); + } + + close() { + this._status = ""; + if (this._websocket) { + if ( + this._websocket.readyState === WebSocket.OPEN || + this._websocket.readyState === WebSocket.CONNECTING + ) { + console.info("Closing WebSocket connection"); + this._websocket.close(); + } + + this._websocket.onmessage = () => {}; + } + } + + _recv_message(e: any) { + if (e.data instanceof window.ArrayBuffer) { + let bytes = new Uint8Array(e.data); + const k = this._secretKey; + if (k) { + k[2] += 1; + bytes = globals.decrypt(bytes, k[2], k[0]); + } + this._buf.push( + this._isRendezvous + ? this.parseRendezvous(bytes) + : this.parseMessage(bytes) + ); + } + this._eventHandlers.message(e.data); + } +} diff --git a/flutter/web/js/ts_proto.py b/flutter/web/js/ts_proto.py new file mode 100755 index 000000000..f917c6b37 --- /dev/null +++ b/flutter/web/js/ts_proto.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import os + +path = os.path.abspath(os.path.join(os.getcwd(), '..', 'hbb', 'libs', 'hbb_common', 'protos')) + +if os.name == 'nt': + cmd = r'protoc --ts_proto_opt=esModuleInterop=true --ts_proto_opt=snakeToCamel=false --plugin=protoc-gen-ts_proto=.\node_modules\.bin\protoc-gen-ts_proto.cmd -I "%s" --ts_proto_out=./src/ rendezvous.proto'%path + print(cmd) + os.system(cmd) + cmd = r'protoc --ts_proto_opt=esModuleInterop=true --ts_proto_opt=snakeToCamel=false --plugin=protoc-gen-ts_proto=.\node_modules\.bin\protoc-gen-ts_proto.cmd -I "%s" --ts_proto_out=./src/ message.proto'%path + print(cmd) + os.system(cmd) +else: + cmd = r'protoc --ts_proto_opt=esModuleInterop=true --ts_proto_opt=snakeToCamel=false --plugin=./node_modules/.bin/protoc-gen-ts_proto -I "%s" --ts_proto_out=./src/ rendezvous.proto'%path + print(cmd) + os.system(cmd) + cmd = r'protoc --ts_proto_opt=esModuleInterop=true --ts_proto_opt=snakeToCamel=false --plugin=./node_modules/.bin/protoc-gen-ts_proto -I "%s" --ts_proto_out=./src/ message.proto'%path + print(cmd) + os.system(cmd) diff --git a/flutter/web/js/tsconfig.json b/flutter/web/js/tsconfig.json new file mode 100644 index 000000000..ca949de6a --- /dev/null +++ b/flutter/web/js/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "allowJs": true, + "lib": [ + "ESNext", + "DOM" + ], + "moduleResolution": "Node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true + }, + "include": [ + "./src" + ] +} \ No newline at end of file diff --git a/flutter/web/js/yarn.lock b/flutter/web/js/yarn.lock new file mode 100644 index 000000000..cf4caafe5 --- /dev/null +++ b/flutter/web/js/yarn.lock @@ -0,0 +1,374 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/node@>=13.7.0": + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== + +"@types/object-hash@^1.3.0": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-1.3.4.tgz#079ba142be65833293673254831b5e3e847fe58b" + integrity sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA== + +dataloader@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" + integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== + +esbuild-android-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz#3fc3ff0bab76fe35dd237476b5d2b32bb20a3d44" + integrity sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg== + +esbuild-darwin-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz#8e9169c16baf444eacec60d09b24d11b255a8e72" + integrity sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ== + +esbuild-darwin-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz#1b07f893b632114f805e188ddfca41b2b778229a" + integrity sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ== + +esbuild-freebsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz#0b8b7eca1690c8ec94c75680c38c07269c1f4a85" + integrity sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA== + +esbuild-freebsd-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz#2e1a6c696bfdcd20a99578b76350b41db1934e52" + integrity sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ== + +esbuild-linux-32@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz#6fd39f36fc66dd45b6b5f515728c7bbebc342a69" + integrity sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g== + +esbuild-linux-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz#9cb8e4bcd7574e67946e4ee5f1f1e12386bb6dd3" + integrity sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA== + +esbuild-linux-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz#3891aa3704ec579a1b92d2a586122e5b6a2bfba1" + integrity sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA== + +esbuild-linux-arm@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz#8a00e99e6a0c6c9a6b7f334841364d8a2b4aecfe" + integrity sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA== + +esbuild-linux-mips64le@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz#36b07cc47c3d21e48db3bb1f4d9ef8f46aead4f7" + integrity sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg== + +esbuild-linux-ppc64le@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz#f7e6bba40b9a11eb9dcae5b01550ea04670edad2" + integrity sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ== + +esbuild-netbsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz#a2fedc549c2b629d580a732d840712b08d440038" + integrity sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w== + +esbuild-openbsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz#b22c0e5806d3a1fbf0325872037f885306b05cd7" + integrity sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g== + +esbuild-sunos-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz#d0b6454a88375ee8d3964daeff55c85c91c7cef4" + integrity sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw== + +esbuild-windows-32@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz#c96d0b9bbb52f3303322582ef8e4847c5ad375a7" + integrity sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw== + +esbuild-windows-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz#1f79cb9b1e1bb02fb25cd414cb90d4ea2892c294" + integrity sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ== + +esbuild-windows-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz#482173070810df22a752c686509c370c3be3b3c3" + integrity sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA== + +esbuild@^0.13.12: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.15.tgz#db56a88166ee373f87dbb2d8798ff449e0450cdf" + integrity sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw== + optionalDependencies: + esbuild-android-arm64 "0.13.15" + esbuild-darwin-64 "0.13.15" + esbuild-darwin-arm64 "0.13.15" + esbuild-freebsd-64 "0.13.15" + esbuild-freebsd-arm64 "0.13.15" + esbuild-linux-32 "0.13.15" + esbuild-linux-64 "0.13.15" + esbuild-linux-arm "0.13.15" + esbuild-linux-arm64 "0.13.15" + esbuild-linux-mips64le "0.13.15" + esbuild-linux-ppc64le "0.13.15" + esbuild-netbsd-64 "0.13.15" + esbuild-openbsd-64 "0.13.15" + esbuild-sunos-64 "0.13.15" + esbuild-windows-32 "0.13.15" + esbuild-windows-64 "0.13.15" + esbuild-windows-arm64 "0.13.15" + +fast-sha256@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6" + integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-core-module@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +libsodium-wrappers@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0, libsodium@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +nanoid@^3.1.30: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +object-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pcm-player@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pcm-player/-/pcm-player-0.0.11.tgz#1dd0e37d8e1238c10b153079939b1fc88958a9ff" + integrity sha512-+FmX62jiqZa7wDCqSRQ1g3DuU6JNgpymgOLCWhmiE/Lj/M+rOUNqgNwVQX509LdA9dtBtVD3EQQUSp9JqU6upw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +postcss@^8.4.5: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +protobufjs@^6.8.8: + version "6.11.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +resolve@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== + dependencies: + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^2.59.0: + version "2.64.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.64.0.tgz#f0f59774e21fbb56de438a37d06a2189632b207a" + integrity sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +ts-poet@^4.5.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/ts-poet/-/ts-poet-4.10.0.tgz#8732374655e87f8f833e5d110938e346713e8c66" + integrity sha512-V5xzt+LDMVtxWvK12WVwHhGHTA//CeoPdWOqka0mMjlRqq7RPKYSfWEnzJdMmhNbd34BwZuZpip4mm+nqEcbQA== + dependencies: + lodash "^4.17.15" + prettier "^2.5.1" + +ts-proto-descriptors@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/ts-proto-descriptors/-/ts-proto-descriptors-1.3.1.tgz#760ebaaa19475b03662f7b358ffea45b9c5348f5" + integrity sha512-Cybb3fqceMwA6JzHdC32dIo8eVGVmXrM6TWhdk1XQVVHT/6OQqk0ioyX1dIdu3rCIBhRmWUhUE4HsyK+olmgMw== + dependencies: + long "^4.0.0" + protobufjs "^6.8.8" + +ts-proto@^1.101.0: + version "1.101.0" + resolved "https://registry.yarnpkg.com/ts-proto/-/ts-proto-1.101.0.tgz#f8ce4523a0cb32ff224ff8a5759c2c046bf96244" + integrity sha512-XUV0WKQ3icHMToOOpUjf0RCKF9md+Lu9TV00LQlZ6ailJhbBqLh0BXQJ1PFUGxEW8YV65Wc/N8vAir152OE2Sg== + dependencies: + "@types/object-hash" "^1.3.0" + dataloader "^1.4.0" + object-hash "^1.3.1" + protobufjs "^6.8.8" + ts-poet "^4.5.0" + ts-proto-descriptors "^1.2.1" + +typescript@^4.4.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +vite@^2.7.2: + version "2.7.12" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.7.12.tgz#7784ab19e7ff98f6a192d2d7d877480a8c2b7e7d" + integrity sha512-KvPYToRQWhRfBeVkyhkZ5hASuHQkqZUUdUcE3xyYtq5oYEPIJ0h9LWiWTO6v990glmSac2cEPeYeXzpX5Z6qKQ== + dependencies: + esbuild "^0.13.12" + postcss "^8.4.5" + resolve "^1.20.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +wasm-feature-detect@^1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/wasm-feature-detect/-/wasm-feature-detect-1.2.11.tgz#e21992fd1f1d41a47490e392a5893cb39d81e29e" + integrity sha512-HUqwaodrQGaZgz1lZaNioIkog9tkeEJjrM3eq4aUL04whXOVDRc/o2EGb/8kV0QX411iAYWEqq7fMBmJ6dKS6w== + +zstddec@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/zstddec/-/zstddec-0.0.2.tgz#57e2f28dd1ff56b750e07d158a43f0611ad9eeb4" + integrity sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA== diff --git a/flutter/web/manifest.json b/flutter/web/manifest.json new file mode 100644 index 000000000..9723be242 --- /dev/null +++ b/flutter/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "rustdesk", + "short_name": "rustdesk", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "Remote Desktop.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/flutter/web/yuv.js b/flutter/web/yuv.js new file mode 100644 index 000000000..35feb485e --- /dev/null +++ b/flutter/web/yuv.js @@ -0,0 +1,73 @@ +var wasmExports; + +fetch('yuv.wasm').then(function (res) { return res.arrayBuffer(); }) + .then(function (file) { return WebAssembly.instantiate(file); }) + .then(function (wasm) { + wasmExports = wasm.instance.exports; + console.log('yuv ready'); + }); + +var yPtr, yPtrLen, uPtr, uPtrLen, vPtr, vPtrLen, outPtr, outPtrLen; +let testSpeed = [0, 0]; +function I420ToARGB(yb) { + if (!wasmExports) return; + var tm0 = new Date().getTime(); + var { malloc, free, memory } = wasmExports; + var HEAPU8 = new Uint8Array(memory.buffer); + let n = yb.y.bytes.length; + if (yPtrLen != n) { + if (yPtr) free(yPtr); + yPtrLen = n; + yPtr = malloc(n); + } + HEAPU8.set(yb.y.bytes, yPtr); + n = yb.u.bytes.length; + if (uPtrLen != n) { + if (uPtr) free(uPtr); + uPtrLen = n; + uPtr = malloc(n); + } + HEAPU8.set(yb.u.bytes, uPtr); + n = yb.v.bytes.length; + if (vPtrLen != n) { + if (vPtr) free(vPtr); + vPtrLen = n; + vPtr = malloc(n); + } + HEAPU8.set(yb.v.bytes, vPtr); + var w = yb.format.displayWidth; + var h = yb.format.displayHeight; + n = w * h * 4; + if (outPtrLen != n) { + if (outPtr) free(outPtr); + outPtrLen = n; + outPtr = malloc(n); + HEAPU8.fill(255, outPtr, outPtr + n); + } + // var res = wasmExports.I420ToARGB(yPtr, yb.y.stride, uPtr, yb.u.stride, vPtr, yb.v.stride, outPtr, w * 4, w, h); + // var res = wasmExports.AVX_YUV_to_ARGB(outPtr, yPtr, yb.y.stride, uPtr, yb.u.stride, vPtr, yb.v.stride, w, h); + var res = wasmExports.yuv420_rgb24_std(w, h, yPtr, uPtr, vPtr, yb.y.stride, yb.v.stride, outPtr, w * 4, 1); + var out = HEAPU8.slice(outPtr, outPtr + n); + testSpeed[1] += new Date().getTime() - tm0; + testSpeed[0] += 1; + if (testSpeed[0] > 30) { + console.log('yuv: ' + parseInt('' + testSpeed[1] / testSpeed[0])); + testSpeed = [0, 0]; + } + return out; +} + +var currentFrame; +self.addEventListener('message', (e) => { + currentFrame = e.data; +}); + +function run() { + if (currentFrame) { + self.postMessage(I420ToARGB(currentFrame)); + currentFrame = undefined; + } + setTimeout(run, 1); +} + +run(); \ No newline at end of file diff --git a/flutter/web/yuv.wasm b/flutter/web/yuv.wasm new file mode 100755 index 000000000..f203c685c Binary files /dev/null and b/flutter/web/yuv.wasm differ