From ed001a5f55d1cb73a951f13a441e55df77c528f1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 20 Dec 2025 12:17:27 +0000 Subject: [PATCH] refactor(canvas): host A2UI via gateway --- .../com/steipete/clawdis/node/NodeRuntime.kt | 36 ++- .../clawdis/node/bridge/BridgeSession.kt | 5 + .../clawdis/node/bridge/BridgeSessionTest.kt | 3 +- apps/ios/Sources/Bridge/BridgeSession.swift | 7 + apps/ios/Sources/Model/NodeAppModel.swift | 35 ++- .../ios/Sources/Screen/ScreenController.swift | 10 - .../macos/Sources/Clawdis/CanvasManager.swift | 13 +- .../Sources/Clawdis/CanvasSchemeHandler.swift | 39 +-- apps/macos/Sources/Clawdis/CanvasWindow.swift | 51 +++- .../Sources/Clawdis/GatewayConnection.swift | 6 + .../Clawdis/NodeMode/MacNodeRuntime.swift | 17 +- apps/macos/Sources/ClawdisIPC/IPC.swift | 4 +- .../ClawdisProtocol/GatewayModels.swift | 4 + .../Sources/ClawdisKit/BridgeFrames.swift | 4 +- .../Resources/CanvasScaffold/scaffold.html | 99 ------- .../CanvasA2UIActionTests.swift | 36 --- .../ClawdisKit/Tools/CanvasA2UI/bootstrap.js | 15 +- .../Tools/CanvasA2UI/rolldown.config.mjs | 9 +- biome.json | 5 + package.json | 2 +- scripts/canvas-a2ui-copy.ts | 19 ++ scripts/package-mac-app.sh | 4 + scripts/restart-mac.sh | 2 +- .../canvas-host/a2ui}/a2ui.bundle.js | 251 +++++++++--------- .../canvas-host/a2ui}/index.html | 2 +- src/canvas-host/server.test.ts | 32 +++ src/gateway/protocol/schema.ts | 1 + src/infra/bridge/server.ts | 28 +- 28 files changed, 385 insertions(+), 354 deletions(-) create mode 100644 scripts/canvas-a2ui-copy.ts rename {apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI => src/canvas-host/a2ui}/a2ui.bundle.js (97%) rename {apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI => src/canvas-host/a2ui}/index.html (94%) diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt b/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt index 55326385d..5c79af817 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt +++ b/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt @@ -605,9 +605,17 @@ class NodeRuntime(context: Context) { BridgeSession.InvokeResult.ok("""{"format":"${snapshotParams.format.rawValue}","base64":"$base64"}""") } ClawdisCanvasA2UICommand.Reset.rawValue -> { - val ready = ensureA2uiReady() + val a2uiUrl = resolveA2uiHostUrl() + ?: return BridgeSession.InvokeResult.error( + code = "A2UI_HOST_NOT_CONFIGURED", + message = "A2UI_HOST_NOT_CONFIGURED: gateway did not advertise canvas host", + ) + val ready = ensureA2uiReady(a2uiUrl) if (!ready) { - return BridgeSession.InvokeResult.error(code = "A2UI_NOT_READY", message = "A2UI not ready") + return BridgeSession.InvokeResult.error( + code = "A2UI_HOST_UNAVAILABLE", + message = "A2UI host not reachable", + ) } val res = canvas.eval(a2uiResetJS) BridgeSession.InvokeResult.ok(res) @@ -619,9 +627,17 @@ class NodeRuntime(context: Context) { } catch (err: Throwable) { return BridgeSession.InvokeResult.error(code = "INVALID_REQUEST", message = err.message ?: "invalid A2UI payload") } - val ready = ensureA2uiReady() + val a2uiUrl = resolveA2uiHostUrl() + ?: return BridgeSession.InvokeResult.error( + code = "A2UI_HOST_NOT_CONFIGURED", + message = "A2UI_HOST_NOT_CONFIGURED: gateway did not advertise canvas host", + ) + val ready = ensureA2uiReady(a2uiUrl) if (!ready) { - return BridgeSession.InvokeResult.error(code = "A2UI_NOT_READY", message = "A2UI not ready") + return BridgeSession.InvokeResult.error( + code = "A2UI_HOST_UNAVAILABLE", + message = "A2UI host not reachable", + ) } val js = a2uiApplyMessagesJS(messages) val res = canvas.eval(js) @@ -707,7 +723,14 @@ class NodeRuntime(context: Context) { return code to "$code: $message" } - private suspend fun ensureA2uiReady(): Boolean { + private fun resolveA2uiHostUrl(): String? { + val raw = session.currentCanvasHostUrl()?.trim().orEmpty() + if (raw.isBlank()) return null + val base = raw.trimEnd('/') + return "${base}/__clawdis__/a2ui/" + } + + private suspend fun ensureA2uiReady(a2uiUrl: String): Boolean { try { val already = canvas.eval(a2uiReadyCheckJS) if (already == "true") return true @@ -715,8 +738,7 @@ class NodeRuntime(context: Context) { // ignore } - // Ensure the default canvas scaffold is loaded; A2UI is now hosted there. - canvas.navigate("") + canvas.navigate(a2uiUrl) repeat(50) { try { val ready = canvas.eval(a2uiReadyCheckJS) diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt b/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt index 9b44a5aca..e50488d37 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt +++ b/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt @@ -61,6 +61,7 @@ class BridgeSession( private val json = Json { ignoreUnknownKeys = true } private val writeLock = Mutex() private val pending = ConcurrentHashMap>() + @Volatile private var canvasHostUrl: String? = null private var desired: Pair? = null private var job: Job? = null @@ -77,10 +78,13 @@ class BridgeSession( scope.launch(Dispatchers.IO) { job?.cancelAndJoin() job = null + canvasHostUrl = null onDisconnected("Offline") } } + fun currentCanvasHostUrl(): String? = canvasHostUrl + suspend fun sendEvent(event: String, payloadJson: String?) { val conn = currentConnection ?: return conn.sendJson( @@ -209,6 +213,7 @@ class BridgeSession( when (first["type"].asStringOrNull()) { "hello-ok" -> { val name = first["serverName"].asStringOrNull() ?: "Bridge" + canvasHostUrl = first["canvasHostUrl"].asStringOrNull()?.trim()?.ifEmpty { null } onConnected(name, conn.remoteAddress) } "error" -> { diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt b/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt index 73458b3a9..c94507398 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt +++ b/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt @@ -46,7 +46,7 @@ class BridgeSessionTest { val hello = reader.readLine() assertTrue(hello.contains("\"type\":\"hello\"")) - writer.write("""{"type":"hello-ok","serverName":"Test Bridge"}""") + writer.write("""{"type":"hello-ok","serverName":"Test Bridge","canvasHostUrl":"http://127.0.0.1:18793"}""") writer.write("\n") writer.flush() @@ -77,6 +77,7 @@ class BridgeSessionTest { ) connected.await() + assertEquals("http://127.0.0.1:18793", session.currentCanvasHostUrl()) val payload = session.request(method = "health", paramsJson = null) assertEquals("""{"value":123}""", payload) server.await() diff --git a/apps/ios/Sources/Bridge/BridgeSession.swift b/apps/ios/Sources/Bridge/BridgeSession.swift index 1540471cd..eaf490be3 100644 --- a/apps/ios/Sources/Bridge/BridgeSession.swift +++ b/apps/ios/Sources/Bridge/BridgeSession.swift @@ -25,6 +25,11 @@ actor BridgeSession { private var serverEventSubscribers: [UUID: AsyncStream.Continuation] = [:] private(set) var state: State = .idle + private var canvasHostUrl: String? + + func currentCanvasHostUrl() -> String? { + self.canvasHostUrl + } func currentRemoteAddress() -> String? { guard let endpoint = self.connection?.currentPath?.remoteEndpoint else { return nil } @@ -101,6 +106,7 @@ actor BridgeSession { if base.type == "hello-ok" { let ok = try self.decoder.decode(BridgeHelloOk.self, from: data) self.state = .connected(serverName: ok.serverName) + self.canvasHostUrl = ok.canvasHostUrl?.trimmingCharacters(in: .whitespacesAndNewlines) await onConnected?(ok.serverName) } else if base.type == "error" { let err = try self.decoder.decode(BridgeErrorFrame.self, from: data) @@ -210,6 +216,7 @@ actor BridgeSession { self.connection = nil self.queue = nil self.buffer = Data() + self.canvasHostUrl = nil let pending = self.pendingRPC.values self.pendingRPC.removeAll() diff --git a/apps/ios/Sources/Model/NodeAppModel.swift b/apps/ios/Sources/Model/NodeAppModel.swift index e93735621..f18c42623 100644 --- a/apps/ios/Sources/Model/NodeAppModel.swift +++ b/apps/ios/Sources/Model/NodeAppModel.swift @@ -143,6 +143,13 @@ final class NodeAppModel { } } + private func resolveA2UIHostURL() async -> String? { + guard let raw = await self.bridge.currentCanvasHostUrl() else { return nil } + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty, let base = URL(string: trimmed) else { return nil } + return base.appendingPathComponent("__clawdis__/a2ui/").absoluteString + } + func setScenePhase(_ phase: ScenePhase) { switch phase { case .background: @@ -436,12 +443,22 @@ final class NodeAppModel { return BridgeInvokeResponse(id: req.id, ok: true, payloadJSON: payload) case ClawdisCanvasA2UICommand.reset.rawValue: - self.screen.showDefaultCanvas() + guard let a2uiUrl = await self.resolveA2UIHostURL() else { + return BridgeInvokeResponse( + id: req.id, + ok: false, + error: ClawdisNodeError( + code: .unavailable, + message: "A2UI_HOST_NOT_CONFIGURED: gateway did not advertise canvas host")) + } + self.screen.navigate(to: a2uiUrl) if await !self.screen.waitForA2UIReady(timeoutMs: 5000) { return BridgeInvokeResponse( id: req.id, ok: false, - error: ClawdisNodeError(code: .unavailable, message: "A2UI not ready")) + error: ClawdisNodeError( + code: .unavailable, + message: "A2UI_HOST_UNAVAILABLE: A2UI host not reachable")) } let json = try await self.screen.eval(javaScript: """ @@ -468,12 +485,22 @@ final class NodeAppModel { } } - self.screen.showDefaultCanvas() + guard let a2uiUrl = await self.resolveA2UIHostURL() else { + return BridgeInvokeResponse( + id: req.id, + ok: false, + error: ClawdisNodeError( + code: .unavailable, + message: "A2UI_HOST_NOT_CONFIGURED: gateway did not advertise canvas host")) + } + self.screen.navigate(to: a2uiUrl) if await !self.screen.waitForA2UIReady(timeoutMs: 5000) { return BridgeInvokeResponse( id: req.id, ok: false, - error: ClawdisNodeError(code: .unavailable, message: "A2UI not ready")) + error: ClawdisNodeError( + code: .unavailable, + message: "A2UI_HOST_UNAVAILABLE: A2UI host not reachable")) } let messagesJSON = try ClawdisCanvasA2UIJSONL.encodeMessagesJSONArray(messages) diff --git a/apps/ios/Sources/Screen/ScreenController.swift b/apps/ios/Sources/Screen/ScreenController.swift index 5dbe696d0..e22ced7f0 100644 --- a/apps/ios/Sources/Screen/ScreenController.swift +++ b/apps/ios/Sources/Screen/ScreenController.swift @@ -199,11 +199,6 @@ final class ScreenController { name: "scaffold", ext: "html", subdirectory: "CanvasScaffold") - private static let a2uiIndexURL: URL? = ScreenController.bundledResourceURL( - name: "index", - ext: "html", - subdirectory: "CanvasA2UI") - func isTrustedCanvasUIURL(_ url: URL) -> Bool { guard url.isFileURL else { return false } let std = url.standardizedFileURL @@ -212,11 +207,6 @@ final class ScreenController { { return true } - if let expected = Self.a2uiIndexURL, - std == expected.standardizedFileURL - { - return true - } return false } diff --git a/apps/macos/Sources/Clawdis/CanvasManager.swift b/apps/macos/Sources/Clawdis/CanvasManager.swift index 68103a8c1..698df5d08 100644 --- a/apps/macos/Sources/Clawdis/CanvasManager.swift +++ b/apps/macos/Sources/Clawdis/CanvasManager.swift @@ -1,6 +1,5 @@ import AppKit import ClawdisIPC -import ClawdisKit import Foundation import OSLog @@ -192,12 +191,12 @@ final class CanvasManager { if path.hasPrefix("/") { path.removeFirst() } path = path.removingPercentEncoding ?? path - // Root special-case: built-in shell page when no index exists. + // Root special-case: built-in scaffold page when no index exists. if path.isEmpty { let a = sessionDir.appendingPathComponent("index.html", isDirectory: false) let b = sessionDir.appendingPathComponent("index.htm", isDirectory: false) if fm.fileExists(atPath: a.path) || fm.fileExists(atPath: b.path) { return .ok } - return Self.hasBundledA2UIShell() ? .a2uiShell : .welcome + return .welcome } // Direct file or directory. @@ -229,11 +228,5 @@ final class CanvasManager { return fm.fileExists(atPath: b.path) } - private static func hasBundledA2UIShell() -> Bool { - let bundle = ClawdisKitResources.bundle - if bundle.url(forResource: "index", withExtension: "html", subdirectory: "CanvasA2UI") != nil { - return true - } - return bundle.url(forResource: "index", withExtension: "html") != nil - } + // no bundled A2UI shell; scaffold fallback is purely visual } diff --git a/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift b/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift index 52b9d467d..ad4f8cfab 100644 --- a/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift +++ b/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift @@ -8,8 +8,6 @@ private let canvasLogger = Logger(subsystem: "com.steipete.clawdis", category: " final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { private let root: URL - private static let builtinPrefix = "__clawdis__/a2ui" - init(root: URL) { self.root = root } @@ -67,10 +65,6 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { if path.hasPrefix("/") { path.removeFirst() } path = path.removingPercentEncoding ?? path - if let builtin = self.builtinResponse(requestPath: path) { - return builtin - } - // Special-case: welcome page when root index is missing. if path.isEmpty { let indexA = sessionRoot.appendingPathComponent("index.html", isDirectory: false) @@ -78,7 +72,7 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { if !FileManager.default.fileExists(atPath: indexA.path), !FileManager.default.fileExists(atPath: indexB.path) { - return self.a2uiShellPage(sessionRoot: sessionRoot) + return self.scaffoldPage(sessionRoot: sessionRoot) } } @@ -204,7 +198,7 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { return self.html(body, title: "Canvas") } - private func a2uiShellPage(sessionRoot: URL) -> CanvasResponse { + private func scaffoldPage(sessionRoot: URL) -> CanvasResponse { // Default Canvas UX: when no index exists, show the built-in scaffold page. if let data = self.loadBundledResourceData(relativePath: "CanvasScaffold/scaffold.html") { return CanvasResponse(mime: "text/html", data: data) @@ -214,35 +208,6 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { return self.welcomePage(sessionRoot: sessionRoot) } - private func builtinResponse(requestPath: String) -> CanvasResponse? { - let trimmed = requestPath.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return nil } - - guard trimmed == Self.builtinPrefix - || trimmed == Self.builtinPrefix + "/" - || trimmed.hasPrefix(Self.builtinPrefix + "/") - else { return nil } - - let relative = if trimmed == Self.builtinPrefix || trimmed == Self.builtinPrefix + "/" { - "index.html" - } else { - String(trimmed.dropFirst((Self.builtinPrefix + "/").count)) - } - - if relative.isEmpty { return self.html("Not Found", title: "Canvas: 404") } - if relative.contains("..") || relative.contains("\\") { - return self.html("Forbidden", title: "Canvas: 403") - } - - guard let data = self.loadBundledResourceData(relativePath: "CanvasA2UI/\(relative)") else { - return self.html("Not Found", title: "Canvas: 404") - } - - let ext = (relative as NSString).pathExtension - let mime = CanvasScheme.mimeType(forExtension: ext) - return CanvasResponse(mime: mime, data: data) - } - private func loadBundledResourceData(relativePath: String) -> Data? { let trimmed = relativePath.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return nil } diff --git a/apps/macos/Sources/Clawdis/CanvasWindow.swift b/apps/macos/Sources/Clawdis/CanvasWindow.swift index 0a0d7882b..297bd6e1b 100644 --- a/apps/macos/Sources/Clawdis/CanvasWindow.swift +++ b/apps/macos/Sources/Clawdis/CanvasWindow.swift @@ -162,10 +162,7 @@ final class CanvasWindowController: NSWindowController, WKNavigationDelegate, NS // Only auto-reload when we are showing local canvas content. guard webView.url?.scheme == CanvasScheme.scheme else { return } - // Avoid reloading the built-in A2UI shell due to filesystem noise (it does not depend on session - // files). let path = webView.url?.path ?? "" - if path.hasPrefix("/__clawdis__/a2ui") { return } if path == "/" || path.isEmpty { let indexA = sessionDir.appendingPathComponent("index.html", isDirectory: false) let indexB = sessionDir.appendingPathComponent("index.htm", isDirectory: false) @@ -608,9 +605,14 @@ private final class CanvasA2UIActionMessageHandler: NSObject, WKScriptMessageHan guard message.name == Self.messageName else { return } // Only accept actions from local Canvas content (not arbitrary web pages). - guard let webView = message.webView, - webView.url?.scheme == CanvasScheme.scheme - else { return } + guard let webView = message.webView, let url = webView.url else { return } + if url.scheme == CanvasScheme.scheme { + // ok + } else if Self.isLocalNetworkCanvasURL(url) { + // ok + } else { + return + } let body: [String: Any] = { if let dict = message.body as? [String: Any] { return dict } @@ -693,6 +695,43 @@ private final class CanvasA2UIActionMessageHandler: NSObject, WKScriptMessageHan } } + private static func isLocalNetworkCanvasURL(_ url: URL) -> Bool { + guard let scheme = url.scheme?.lowercased(), scheme == "http" || scheme == "https" else { + return false + } + guard let host = url.host?.trimmingCharacters(in: .whitespacesAndNewlines), !host.isEmpty else { + return false + } + if host == "localhost" { return true } + if host.hasSuffix(".local") { return true } + if host.hasSuffix(".ts.net") { return true } + if host.hasSuffix(".tailscale.net") { return true } + if !host.contains("."), !host.contains(":") { return true } + if let ipv4 = Self.parseIPv4(host) { + return Self.isLocalNetworkIPv4(ipv4) + } + return false + } + + private static func parseIPv4(_ host: String) -> (UInt8, UInt8, UInt8, UInt8)? { + let parts = host.split(separator: ".", omittingEmptySubsequences: false) + guard parts.count == 4 else { return nil } + let bytes: [UInt8] = parts.compactMap { UInt8($0) } + guard bytes.count == 4 else { return nil } + return (bytes[0], bytes[1], bytes[2], bytes[3]) + } + + private static func isLocalNetworkIPv4(_ ip: (UInt8, UInt8, UInt8, UInt8)) -> Bool { + let (a, b, _, _) = ip + if a == 10 { return true } + if a == 172, (16...31).contains(Int(b)) { return true } + if a == 192, b == 168 { return true } + if a == 127 { return true } + if a == 169, b == 254 { return true } + if a == 100, (64...127).contains(Int(b)) { return true } + return false + } + // Formatting helpers live in ClawdisKit (`ClawdisCanvasA2UIAction`). } diff --git a/apps/macos/Sources/Clawdis/GatewayConnection.swift b/apps/macos/Sources/Clawdis/GatewayConnection.swift index 8e1622bfe..4a4d86282 100644 --- a/apps/macos/Sources/Clawdis/GatewayConnection.swift +++ b/apps/macos/Sources/Clawdis/GatewayConnection.swift @@ -172,6 +172,12 @@ actor GatewayConnection { self.lastSnapshot = nil } + func canvasHostUrl() async -> String? { + guard let snapshot = self.lastSnapshot else { return nil } + let trimmed = snapshot.canvashosturl?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + return trimmed.isEmpty ? nil : trimmed + } + func subscribe(bufferingNewest: Int = 100) -> AsyncStream { let id = UUID() let snapshot = self.lastSnapshot diff --git a/apps/macos/Sources/Clawdis/NodeMode/MacNodeRuntime.swift b/apps/macos/Sources/Clawdis/NodeMode/MacNodeRuntime.swift index 621f9a6b2..e69ab9091 100644 --- a/apps/macos/Sources/Clawdis/NodeMode/MacNodeRuntime.swift +++ b/apps/macos/Sources/Clawdis/NodeMode/MacNodeRuntime.swift @@ -6,7 +6,6 @@ import Foundation actor MacNodeRuntime { private let cameraCapture = CameraCaptureService() @MainActor private let screenRecorder = ScreenRecordService() - private static let a2uiShellPath = "/__clawdis__/a2ui/" // swiftlint:disable:next function_body_length func handleInvoke(_ req: BridgeInvokeRequest) async -> BridgeInvokeResponse { @@ -248,15 +247,27 @@ actor MacNodeRuntime { private func ensureA2UIHost() async throws { if await self.isA2UIReady() { return } + guard let a2uiUrl = await self.resolveA2UIHostUrl() else { + throw NSError(domain: "Canvas", code: 30, userInfo: [ + NSLocalizedDescriptionKey: "A2UI_HOST_NOT_CONFIGURED: gateway did not advertise canvas host", + ]) + } _ = try await MainActor.run { - try CanvasManager.shared.show(sessionKey: "main", path: Self.a2uiShellPath) + try CanvasManager.shared.show(sessionKey: "main", path: a2uiUrl) } if await self.isA2UIReady(poll: true) { return } throw NSError(domain: "Canvas", code: 31, userInfo: [ - NSLocalizedDescriptionKey: "A2UI not ready", + NSLocalizedDescriptionKey: "A2UI_HOST_UNAVAILABLE: A2UI host not reachable", ]) } + private func resolveA2UIHostUrl() async -> String? { + guard let raw = await GatewayConnection.shared.canvasHostUrl() else { return nil } + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty, let baseUrl = URL(string: trimmed) else { return nil } + return baseUrl.appendingPathComponent("__clawdis__/a2ui/").absoluteString + } + private func isA2UIReady(poll: Bool = false) async -> Bool { let deadline = poll ? Date().addingTimeInterval(6.0) : Date() while true { diff --git a/apps/macos/Sources/ClawdisIPC/IPC.swift b/apps/macos/Sources/ClawdisIPC/IPC.swift index 00d05536a..469d80405 100644 --- a/apps/macos/Sources/ClawdisIPC/IPC.swift +++ b/apps/macos/Sources/ClawdisIPC/IPC.swift @@ -66,9 +66,7 @@ public enum CanvasShowStatus: String, Codable, Sendable { case ok /// Local canvas target did not resolve to a file (404 page). case notFound - /// Local canvas root ("/") has no index, so the built-in A2UI shell is shown. - case a2uiShell - /// Legacy fallback when the built-in shell isn't available (dev misconfiguration). + /// Local scaffold fallback (e.g., no index.html present). case welcome } diff --git a/apps/macos/Sources/ClawdisProtocol/GatewayModels.swift b/apps/macos/Sources/ClawdisProtocol/GatewayModels.swift index cb59de0ce..04973d66b 100644 --- a/apps/macos/Sources/ClawdisProtocol/GatewayModels.swift +++ b/apps/macos/Sources/ClawdisProtocol/GatewayModels.swift @@ -53,6 +53,7 @@ public struct HelloOk: Codable { public let server: [String: AnyCodable] public let features: [String: AnyCodable] public let snapshot: Snapshot + public let canvashosturl: String? public let policy: [String: AnyCodable] public init( @@ -61,6 +62,7 @@ public struct HelloOk: Codable { server: [String: AnyCodable], features: [String: AnyCodable], snapshot: Snapshot, + canvashosturl: String?, policy: [String: AnyCodable] ) { self.type = type @@ -68,6 +70,7 @@ public struct HelloOk: Codable { self.server = server self.features = features self.snapshot = snapshot + self.canvashosturl = canvashosturl self.policy = policy } private enum CodingKeys: String, CodingKey { @@ -76,6 +79,7 @@ public struct HelloOk: Codable { case server case features case snapshot + case canvashosturl = "canvasHostUrl" case policy } } diff --git a/apps/shared/ClawdisKit/Sources/ClawdisKit/BridgeFrames.swift b/apps/shared/ClawdisKit/Sources/ClawdisKit/BridgeFrames.swift index cecea94d0..e04e7063b 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisKit/BridgeFrames.swift +++ b/apps/shared/ClawdisKit/Sources/ClawdisKit/BridgeFrames.swift @@ -99,10 +99,12 @@ public struct BridgeHello: Codable, Sendable { public struct BridgeHelloOk: Codable, Sendable { public let type: String public let serverName: String + public let canvasHostUrl: String? - public init(type: String = "hello-ok", serverName: String) { + public init(type: String = "hello-ok", serverName: String, canvasHostUrl: String? = nil) { self.type = type self.serverName = serverName + self.canvasHostUrl = canvasHostUrl } } diff --git a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasScaffold/scaffold.html b/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasScaffold/scaffold.html index ca299986e..90ad3f246 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasScaffold/scaffold.html +++ b/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasScaffold/scaffold.html @@ -85,16 +85,6 @@ pointer-events: none; z-index: 3; } - #clawdis-a2ui-wrap { - position: fixed; - inset: 0; - display: none; - z-index: 2; - } - #clawdis-a2ui-wrap clawdis-a2ui-host { - display: block; - height: 100%; - } #clawdis-status .card { text-align: center; padding: 16px 18px; @@ -126,9 +116,6 @@
Waiting for agent
-
- -
diff --git a/apps/shared/ClawdisKit/Tests/ClawdisKitTests/CanvasA2UIActionTests.swift b/apps/shared/ClawdisKit/Tests/ClawdisKitTests/CanvasA2UIActionTests.swift index d26241a9f..e69e821a2 100644 --- a/apps/shared/ClawdisKit/Tests/ClawdisKitTests/CanvasA2UIActionTests.swift +++ b/apps/shared/ClawdisKit/Tests/ClawdisKitTests/CanvasA2UIActionTests.swift @@ -28,40 +28,4 @@ import Testing #expect(msg.contains("instance=ipad16_6 ctx={\"city\":\"Vienna\"}")) #expect(msg.hasSuffix(" default=update_canvas")) } - - @Test func a2uiBundleSupportsAndroidBridgeFallback() throws { - guard let url = ClawdisKitResources.bundle.url(forResource: "a2ui.bundle", withExtension: "js") - else { - throw NSError(domain: "Tests", code: 1, userInfo: [ - NSLocalizedDescriptionKey: "Missing resource a2ui.bundle.js", - ]) - } - let js = try String(contentsOf: url, encoding: .utf8) - #expect(js.contains("clawdisCanvasA2UIAction")) - #expect(js.contains("globalThis.clawdisCanvasA2UIAction")) - } - - @Test func a2uiBundleWrapsDynamicCssValues() throws { - guard let url = ClawdisKitResources.bundle.url(forResource: "a2ui.bundle", withExtension: "js") - else { - throw NSError(domain: "Tests", code: 1, userInfo: [ - NSLocalizedDescriptionKey: "Missing resource a2ui.bundle.js", - ]) - } - let js = try String(contentsOf: url, encoding: .utf8) - #expect(js.contains("blur(${r(statusBlur)})")) - #expect(js.contains("box-shadow: ${r(statusShadow)}")) - } - - @Test func a2uiBundleStylesModalBackdrop() throws { - guard let url = ClawdisKitResources.bundle.url(forResource: "a2ui.bundle", withExtension: "js") - else { - throw NSError(domain: "Tests", code: 1, userInfo: [ - NSLocalizedDescriptionKey: "Missing resource a2ui.bundle.js", - ]) - } - let js = try String(contentsOf: url, encoding: .utf8) - #expect(js.contains("::backdrop")) - #expect(js.contains("backdrop-filter: blur(6px)")) - } } diff --git a/apps/shared/ClawdisKit/Tools/CanvasA2UI/bootstrap.js b/apps/shared/ClawdisKit/Tools/CanvasA2UI/bootstrap.js index 3a183c662..68271af7b 100644 --- a/apps/shared/ClawdisKit/Tools/CanvasA2UI/bootstrap.js +++ b/apps/shared/ClawdisKit/Tools/CanvasA2UI/bootstrap.js @@ -8,14 +8,17 @@ import { themeContext } from "@clawdis/a2ui-theme-context"; const modalStyles = css` dialog { + position: fixed; + inset: 0; + width: 100%; + height: 100%; + margin: 0; padding: 24px; border: none; - background: none; - display: flex; - align-items: center; - justify-content: center; - max-width: calc(100vw - 32px); - max-height: calc(100vh - 32px); + background: rgba(5, 8, 16, 0.65); + backdrop-filter: blur(6px); + display: grid; + place-items: center; } dialog::backdrop { diff --git a/apps/shared/ClawdisKit/Tools/CanvasA2UI/rolldown.config.mjs b/apps/shared/ClawdisKit/Tools/CanvasA2UI/rolldown.config.mjs index 96847e727..2b57ffa6b 100644 --- a/apps/shared/ClawdisKit/Tools/CanvasA2UI/rolldown.config.mjs +++ b/apps/shared/ClawdisKit/Tools/CanvasA2UI/rolldown.config.mjs @@ -5,7 +5,14 @@ import { defineConfig } from "rolldown"; const here = path.dirname(fileURLToPath(import.meta.url)); const repoRoot = path.resolve(here, "../../../../.."); const fromHere = (p) => path.resolve(here, p); -const outputFile = path.resolve(here, "../../Sources/ClawdisKit/Resources/CanvasA2UI/a2ui.bundle.js"); +const outputFile = path.resolve( + here, + "../../../../..", + "src", + "canvas-host", + "a2ui", + "a2ui.bundle.js", +); const a2uiLitDist = path.resolve(repoRoot, "vendor/a2ui/renderers/lit/dist/src"); const a2uiThemeContext = path.resolve(a2uiLitDist, "0.8/ui/context/theme.js"); diff --git a/biome.json b/biome.json index ac36d2c9d..48cb3a3a1 100644 --- a/biome.json +++ b/biome.json @@ -5,6 +5,11 @@ "indentWidth": 2, "indentStyle": "space" }, + "files": { + "includes": [ + "src/**/*.ts" + ] + }, "linter": { "enabled": true, "rules": { diff --git a/package.json b/package.json index cb0e9eb31..138c206c0 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "dev": "tsx src/index.ts", "docs:list": "tsx scripts/docs-list.ts", - "build": "tsc -p tsconfig.json", + "build": "pnpm canvas:a2ui:bundle && tsc -p tsconfig.json && tsx scripts/canvas-a2ui-copy.ts", "ui:install": "pnpm -C ui install", "ui:dev": "pnpm -C ui dev", "ui:build": "pnpm -C ui build", diff --git a/scripts/canvas-a2ui-copy.ts b/scripts/canvas-a2ui-copy.ts new file mode 100644 index 000000000..3105dbfcf --- /dev/null +++ b/scripts/canvas-a2ui-copy.ts @@ -0,0 +1,19 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const srcDir = path.join(repoRoot, "src", "canvas-host", "a2ui"); +const outDir = path.join(repoRoot, "dist", "canvas-host", "a2ui"); + +async function main() { + await fs.stat(path.join(srcDir, "index.html")); + await fs.stat(path.join(srcDir, "a2ui.bundle.js")); + await fs.mkdir(path.dirname(outDir), { recursive: true }); + await fs.cp(srcDir, outDir, { recursive: true }); +} + +main().catch((err) => { + console.error(String(err)); + process.exit(1); +}); diff --git a/scripts/package-mac-app.sh b/scripts/package-mac-app.sh index df3c2aec2..49472bf6e 100755 --- a/scripts/package-mac-app.sh +++ b/scripts/package-mac-app.sh @@ -156,6 +156,10 @@ if [[ "${SKIP_GATEWAY_PACKAGE:-0}" != "1" ]]; then --define "__CLAWDIS_VERSION__=\\\"$PKG_VERSION\\\"" chmod +x "$CLI_OUT" + echo "🎨 Copying gateway A2UI host assets" + rm -rf "$RELAY_DIR/a2ui" + cp -R "$ROOT_DIR/src/canvas-host/a2ui" "$RELAY_DIR/a2ui" + echo "📄 Writing embedded runtime package.json (Pi compatibility)" cat > "$RELAY_DIR/package.json" < Killing existing Clawdis instances" kill_all_clawdis stop_launch_agent -# Bundle built-in Canvas A2UI shell (single-file JS, shipped in the app bundle). +# Bundle Gateway-hosted Canvas A2UI assets. run_step "bundle canvas a2ui" bash -lc "cd '${ROOT_DIR}' && pnpm canvas:a2ui:bundle" # 2) Rebuild into the same path the packager consumes (.build). diff --git a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/a2ui.bundle.js b/src/canvas-host/a2ui/a2ui.bundle.js similarity index 97% rename from apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/a2ui.bundle.js rename to src/canvas-host/a2ui/a2ui.bundle.js index 1ff4005ec..5feeea305 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/a2ui.bundle.js +++ b/src/canvas-host/a2ui/a2ui.bundle.js @@ -15,7 +15,7 @@ var __export = (all, symbols) => { }; //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/css-tag.js +//#region node_modules/@lit/reactive-element/css-tag.js /** * @license * Copyright 2019 Google LLC @@ -60,7 +60,7 @@ const r = (t$7) => new n$9("string" == typeof t$7 ? t$7 : t$7 + "", void 0, s$8) })(t$7) : t$7; //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/reactive-element.js +//#region node_modules/@lit/reactive-element/reactive-element.js /** * @license * Copyright 2017 Google LLC @@ -291,7 +291,7 @@ var y = class extends HTMLElement { y.elementStyles = [], y.shadowRootOptions = { mode: "open" }, y[d$2("elementProperties")] = new Map(), y[d$2("finalized")] = new Map(), p$2?.({ ReactiveElement: y }), (a$1.reactiveElementVersions ??= []).push("2.1.1"); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/lit-html.js +//#region node_modules/lit-html/lit-html.js /** * @license * Copyright 2017 Google LLC @@ -559,7 +559,7 @@ const B = (t$7, i$10, s$9) => { }; //#endregion -//#region node_modules/.pnpm/lit-element@4.2.1/node_modules/lit-element/lit-element.js +//#region node_modules/lit-element/lit-element.js /** * @license * Copyright 2017 Google LLC @@ -599,7 +599,7 @@ const n$7 = { (s$6.litElementVersions ??= []).push("4.2.1"); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/is-server.js +//#region node_modules/lit-html/is-server.js /** * @license * Copyright 2022 Google LLC @@ -608,7 +608,7 @@ const n$7 = { const o$9 = !1; //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directive.js +//#region node_modules/lit-html/directive.js /** * @license * Copyright 2017 Google LLC @@ -642,7 +642,7 @@ var i$3 = class { }; //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directive-helpers.js +//#region node_modules/lit-html/directive-helpers.js /** * @license * Copyright 2020 Google LLC @@ -678,7 +678,7 @@ var i$3 = class { }; //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/repeat.js +//#region node_modules/lit-html/directives/repeat.js /** * @license * Copyright 2017 Google LLC @@ -739,7 +739,7 @@ const u$1 = (e$14, s$9, t$7) => { }); //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/context-request-event.js +//#region node_modules/@lit/context/lib/context-request-event.js /** * @license * Copyright 2021 Google LLC @@ -755,7 +755,7 @@ var s$2 = class extends Event { }; //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/create-context.js +//#region node_modules/@lit/context/lib/create-context.js /** * @license * Copyright 2021 Google LLC @@ -766,7 +766,7 @@ function n$3(n$11) { } //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/controllers/context-consumer.js +//#region node_modules/@lit/context/lib/controllers/context-consumer.js /** * @license * Copyright 2021 Google LLC @@ -793,7 +793,7 @@ function n$3(n$11) { }; //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/value-notifier.js +//#region node_modules/@lit/context/lib/value-notifier.js /** * @license * Copyright 2021 Google LLC @@ -832,7 +832,7 @@ var s$4 = class { }; //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/controllers/context-provider.js +//#region node_modules/@lit/context/lib/controllers/context-provider.js /** * @license * Copyright 2021 Google LLC @@ -868,7 +868,7 @@ var i$2 = class extends s$4 { }; //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/context-root.js +//#region node_modules/@lit/context/lib/context-root.js /** * @license * Copyright 2021 Google LLC @@ -908,7 +908,7 @@ var i$2 = class extends s$4 { }; //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/decorators/provide.js +//#region node_modules/@lit/context/lib/decorators/provide.js /** * @license * Copyright 2017 Google LLC @@ -963,7 +963,7 @@ var i$2 = class extends s$4 { } //#endregion -//#region node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/decorators/consume.js +//#region node_modules/@lit/context/lib/decorators/consume.js /** * @license * Copyright 2022 Google LLC @@ -2260,7 +2260,7 @@ var A2uiMessageProcessor = class A2uiMessageProcessor { }; //#endregion -//#region node_modules/.pnpm/signal-polyfill@0.2.2/node_modules/signal-polyfill/dist/index.js +//#region node_modules/signal-polyfill/dist/index.js var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, @@ -2818,7 +2818,7 @@ var Signal; })(Signal || (Signal = {})); //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/-private/util.ts.js +//#region node_modules/signal-utils/dist/-private/util.ts.js /** * equality check here is always false so that we can dirty the storage * via setting to _anything_ @@ -2845,7 +2845,7 @@ function fnCacheFor(context) { } //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/array.ts.js +//#region node_modules/signal-utils/dist/array.ts.js const ARRAY_GETTER_METHODS = new Set([ Symbol.iterator, "concat", @@ -2978,7 +2978,7 @@ function signalArray(x$1) { } //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/map.ts.js +//#region node_modules/signal-utils/dist/map.ts.js var SignalMap = class { collection = createStorage(); storages = new Map(); @@ -3056,7 +3056,7 @@ var SignalMap = class { Object.setPrototypeOf(SignalMap.prototype, Map.prototype); //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/object.ts.js +//#region node_modules/signal-utils/dist/object.ts.js /** * Implementation based of tracked-built-ins' TrackedObject * https://github.com/tracked-tools/tracked-built-ins/blob/master/addon/src/-private/object.js @@ -3145,7 +3145,7 @@ function signalObject(obj) { } //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/set.ts.js +//#region node_modules/signal-utils/dist/set.ts.js var SignalSet = class { collection = createStorage(); storages = new Map(); @@ -3968,7 +3968,7 @@ const Data = { const Schemas = { A2UIClientEventMessage: server_to_client_with_standard_catalog_default }; //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/custom-element.js +//#region node_modules/@lit/reactive-element/decorators/custom-element.js /** * @license * Copyright 2017 Google LLC @@ -3981,7 +3981,7 @@ const t = (t$7) => (e$14, o$14) => { }; //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/property.js +//#region node_modules/@lit/reactive-element/decorators/property.js /** * @license * Copyright 2017 Google LLC @@ -4024,7 +4024,7 @@ function n(t$7) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/state.js +//#region node_modules/@lit/reactive-element/decorators/state.js /** * @license * Copyright 2017 Google LLC @@ -4038,7 +4038,7 @@ function n(t$7) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/event-options.js +//#region node_modules/@lit/reactive-element/decorators/event-options.js /** * @license * Copyright 2017 Google LLC @@ -4052,7 +4052,7 @@ function t$2(t$7) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/base.js +//#region node_modules/@lit/reactive-element/decorators/base.js /** * @license * Copyright 2017 Google LLC @@ -4061,7 +4061,7 @@ function t$2(t$7) { const e$6 = (e$14, t$7, c$7) => (c$7.configurable = !0, c$7.enumerable = !0, Reflect.decorate && "object" != typeof t$7 && Object.defineProperty(e$14, t$7, c$7), c$7); //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/query.js +//#region node_modules/@lit/reactive-element/decorators/query.js /** * @license * Copyright 2017 Google LLC @@ -4093,7 +4093,7 @@ const e$6 = (e$14, t$7, c$7) => (c$7.configurable = !0, c$7.enumerable = !0, Ref } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/query-all.js +//#region node_modules/@lit/reactive-element/decorators/query-all.js /** * @license * Copyright 2017 Google LLC @@ -4107,7 +4107,7 @@ function r$6(r$11) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/query-async.js +//#region node_modules/@lit/reactive-element/decorators/query-async.js /** * @license * Copyright 2017 Google LLC @@ -4120,7 +4120,7 @@ function r$5(r$11) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/query-assigned-elements.js +//#region node_modules/@lit/reactive-element/decorators/query-assigned-elements.js /** * @license * Copyright 2021 Google LLC @@ -4136,7 +4136,7 @@ function r$5(r$11) { } //#endregion -//#region node_modules/.pnpm/@lit+reactive-element@2.1.1/node_modules/@lit/reactive-element/decorators/query-assigned-nodes.js +//#region node_modules/@lit/reactive-element/decorators/query-assigned-nodes.js /** * @license * Copyright 2017 Google LLC @@ -4152,7 +4152,7 @@ function r$5(r$11) { } //#endregion -//#region node_modules/.pnpm/@lit-labs+signals@0.1.3/node_modules/@lit-labs/signals/lib/signal-watcher.js +//#region node_modules/@lit-labs/signals/lib/signal-watcher.js /** * @license * Copyright 2023 Google LLC @@ -4215,7 +4215,7 @@ function e$5(e$14) { } //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/async-directive.js +//#region node_modules/lit-html/async-directive.js /** * @license * Copyright 2017 Google LLC @@ -4273,7 +4273,7 @@ var f = class extends i$3 { }; //#endregion -//#region node_modules/.pnpm/@lit-labs+signals@0.1.3/node_modules/@lit-labs/signals/lib/watch.js +//#region node_modules/@lit-labs/signals/lib/watch.js /** * @license * Copyright 2023 Google LLC @@ -4318,7 +4318,7 @@ var f = class extends i$3 { const o$4 = e$1(h$1); //#endregion -//#region node_modules/.pnpm/@lit-labs+signals@0.1.3/node_modules/@lit-labs/signals/lib/html-tag.js +//#region node_modules/@lit-labs/signals/lib/html-tag.js /** * @license * Copyright 2023 Google LLC @@ -4326,7 +4326,7 @@ const o$4 = e$1(h$1); */ const m = (o$14) => (t$7, ...m$3) => o$14(t$7, ...m$3.map(((o$15) => o$15 instanceof Signal.State || o$15 instanceof Signal.Computed ? o$4(o$15) : o$15))), l = m(x), r$2 = m(b); //#endregion -//#region node_modules/.pnpm/@lit-labs+signals@0.1.3/node_modules/@lit-labs/signals/index.js +//#region node_modules/@lit-labs/signals/index.js /** * @license * Copyright 2023 Google LLC @@ -4334,7 +4334,7 @@ const o$4 = e$1(h$1); */ const l$1 = Signal.State, o$5 = Signal.Computed, r$3 = (l$5, o$14) => new Signal.State(l$5, o$14), i$5 = (l$5, o$14) => new Signal.Computed(l$5, o$14); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/map.js +//#region node_modules/lit-html/directives/map.js /** * @license * Copyright 2021 Google LLC @@ -4348,7 +4348,7 @@ function* o$3(o$14, f$4) { } //#endregion -//#region node_modules/.pnpm/signal-utils@0.21.1_signal-polyfill@0.2.2/node_modules/signal-utils/dist/subtle/microtask-effect.ts.js +//#region node_modules/signal-utils/dist/subtle/microtask-effect.ts.js let pending = false; let watcher = new Signal.subtle.Watcher(() => { if (!pending) { @@ -5084,7 +5084,7 @@ let Root = (() => { })(); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/class-map.js +//#region node_modules/lit-html/directives/class-map.js /** * @license * Copyright 2018 Google LLC @@ -5113,7 +5113,7 @@ let Root = (() => { }); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/style-map.js +//#region node_modules/lit-html/directives/style-map.js /** * @license * Copyright 2018 Google LLC @@ -7160,7 +7160,7 @@ let MultipleChoice = (() => { })(); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/ref.js +//#region node_modules/lit-html/directives/ref.js /** * @license * Copyright 2020 Google LLC @@ -8585,7 +8585,7 @@ let TextField = (() => { })(); //#endregion -//#region node_modules/.pnpm/lit-html@3.3.1/node_modules/lit-html/directives/unsafe-html.js +//#region node_modules/lit-html/directives/unsafe-html.js /** * @license * Copyright 2017 Google LLC @@ -8612,7 +8612,7 @@ e$2.directiveName = "unsafeHTML", e$2.resultType = 1; const o$1 = e$1(e$2); //#endregion -//#region node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/decode.mjs +//#region node_modules/mdurl/lib/decode.mjs const decodeCache = {}; function getDecodeCache(exclude) { let cache = decodeCache[exclude]; @@ -8696,7 +8696,7 @@ decode$2.componentChars = ""; var decode_default = decode$2; //#endregion -//#region node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/encode.mjs +//#region node_modules/mdurl/lib/encode.mjs const encodeCache = {}; function getEncodeCache(exclude) { let cache = encodeCache[exclude]; @@ -8761,7 +8761,7 @@ encode$2.componentChars = "-_.!~*'()"; var encode_default = encode$2; //#endregion -//#region node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/format.mjs +//#region node_modules/mdurl/lib/format.mjs function format(url) { let result = ""; result += url.protocol || ""; @@ -8781,7 +8781,7 @@ function format(url) { ; //#endregion -//#region node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/parse.mjs +//#region node_modules/mdurl/lib/parse.mjs function Url() { this.protocol = null; this.slashes = null; @@ -8990,7 +8990,7 @@ Url.prototype.parseHost = function(host) { var parse_default = urlParse; //#endregion -//#region node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/index.mjs +//#region node_modules/mdurl/index.mjs var mdurl_exports = /* @__PURE__ */ __export({ decode: () => decode_default, encode: () => encode_default, @@ -8999,31 +8999,31 @@ var mdurl_exports = /* @__PURE__ */ __export({ }); //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/properties/Any/regex.mjs +//#region node_modules/uc.micro/properties/Any/regex.mjs var regex_default = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Cc/regex.mjs +//#region node_modules/uc.micro/categories/Cc/regex.mjs var regex_default$1 = /[\0-\x1F\x7F-\x9F]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Cf/regex.mjs +//#region node_modules/uc.micro/categories/Cf/regex.mjs var regex_default$4 = /[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/P/regex.mjs +//#region node_modules/uc.micro/categories/P/regex.mjs var regex_default$3 = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/S/regex.mjs +//#region node_modules/uc.micro/categories/S/regex.mjs var regex_default$5 = /[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Z/regex.mjs +//#region node_modules/uc.micro/categories/Z/regex.mjs var regex_default$2 = /[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/; //#endregion -//#region node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/index.mjs +//#region node_modules/uc.micro/index.mjs var uc_exports = /* @__PURE__ */ __export({ Any: () => regex_default, Cc: () => regex_default$1, @@ -9034,15 +9034,15 @@ var uc_exports = /* @__PURE__ */ __export({ }); //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/generated/decode-data-html.js +//#region node_modules/entities/lib/esm/generated/decode-data-html.js var decode_data_html_default = new Uint16Array("ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms„‹•˜¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻\"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻\xA0ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\0\0⵼\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌".split("").map((c$7) => c$7.charCodeAt(0))); //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/generated/decode-data-xml.js +//#region node_modules/entities/lib/esm/generated/decode-data-xml.js var decode_data_xml_default = new Uint16Array("Ȁaglq \x1Bɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map((c$7) => c$7.charCodeAt(0))); //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/decode_codepoint.js +//#region node_modules/entities/lib/esm/decode_codepoint.js var _a; const decodeMap = new Map([ [0, 65533], @@ -9111,7 +9111,7 @@ function decodeCodePoint(codePoint) { } //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/decode.js +//#region node_modules/entities/lib/esm/decode.js var CharCodes; (function(CharCodes$1) { CharCodes$1[CharCodes$1["NUM"] = 35] = "NUM"; @@ -9545,7 +9545,7 @@ function decodeXML(str) { } //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/generated/encode-html.js +//#region node_modules/entities/lib/esm/generated/encode-html.js function restoreDiff(arr) { for (let i$10 = 1; i$10 < arr.length; i$10++) { arr[i$10][0] += arr[i$10 - 1][0] + 1; @@ -11254,7 +11254,7 @@ var encode_html_default = new Map(/* @__PURE__ */ restoreDiff([ ])); //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/escape.js +//#region node_modules/entities/lib/esm/escape.js const xmlReplacer = /["&'<>$\x80-\uFFFF]/g; const xmlCodeMap = new Map([ [34, """], @@ -11357,7 +11357,7 @@ const escapeText = getEscaper(/[&<>\u00A0]/g, new Map([ ])); //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/encode.js +//#region node_modules/entities/lib/esm/encode.js const htmlReplacer = /[\t\n!-,./:-@[-`\f{-}$\x80-\uFFFF]/g; /** * Encodes all characters in the input using HTML entities. This includes @@ -11418,7 +11418,7 @@ function encodeHTMLTrieRe(regExp, str) { } //#endregion -//#region node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/index.js +//#region node_modules/entities/lib/esm/index.js /** The level of entities to support. */ var EntityLevel; (function(EntityLevel$1) { @@ -11504,7 +11504,7 @@ function encode$1(data, options = EntityLevel.XML) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/utils.mjs +//#region node_modules/markdown-it/lib/common/utils.mjs var utils_exports$1 = /* @__PURE__ */ __export({ arrayReplaceAt: () => arrayReplaceAt, assign: () => assign$1, @@ -11722,7 +11722,7 @@ const lib = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/helpers/parse_link_label.mjs +//#region node_modules/markdown-it/lib/helpers/parse_link_label.mjs function parseLinkLabel(state, start, disableNested) { let level, found, marker, prevPos; const max = state.posMax; @@ -11758,7 +11758,7 @@ function parseLinkLabel(state, start, disableNested) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/helpers/parse_link_destination.mjs +//#region node_modules/markdown-it/lib/helpers/parse_link_destination.mjs function parseLinkDestination(str, start, max) { let code$1; let pos = start; @@ -11834,7 +11834,7 @@ function parseLinkDestination(str, start, max) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/helpers/parse_link_title.mjs +//#region node_modules/markdown-it/lib/helpers/parse_link_title.mjs function parseLinkTitle(str, start, max, prev_state) { let code$1; let pos = start; @@ -11883,7 +11883,7 @@ function parseLinkTitle(str, start, max, prev_state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/helpers/index.mjs +//#region node_modules/markdown-it/lib/helpers/index.mjs var helpers_exports = /* @__PURE__ */ __export({ parseLinkDestination: () => parseLinkDestination, parseLinkLabel: () => parseLinkLabel, @@ -11891,7 +11891,7 @@ var helpers_exports = /* @__PURE__ */ __export({ }); //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/renderer.mjs +//#region node_modules/markdown-it/lib/renderer.mjs /** * class Renderer * @@ -12134,7 +12134,7 @@ Renderer.prototype.render = function(tokens, options, env) { var renderer_default = Renderer; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/ruler.mjs +//#region node_modules/markdown-it/lib/ruler.mjs /** * class Ruler * @@ -12437,7 +12437,7 @@ Ruler.prototype.getRules = function(chainName) { var ruler_default = Ruler; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/token.mjs +//#region node_modules/markdown-it/lib/token.mjs /** * class Token **/ @@ -12610,7 +12610,7 @@ Token.prototype.attrJoin = function attrJoin(name, value) { var token_default = Token; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/state_core.mjs +//#region node_modules/markdown-it/lib/rules_core/state_core.mjs function StateCore(src, md, env) { this.src = src; this.env = env; @@ -12622,7 +12622,7 @@ StateCore.prototype.Token = token_default; var state_core_default = StateCore; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/normalize.mjs +//#region node_modules/markdown-it/lib/rules_core/normalize.mjs const NEWLINES_RE = /\r\n?|\n/g; const NULL_RE = /\0/g; function normalize(state) { @@ -12633,7 +12633,7 @@ function normalize(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/block.mjs +//#region node_modules/markdown-it/lib/rules_core/block.mjs function block(state) { let token; if (state.inlineMode) { @@ -12648,7 +12648,7 @@ function block(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/inline.mjs +//#region node_modules/markdown-it/lib/rules_core/inline.mjs function inline(state) { const tokens = state.tokens; for (let i$10 = 0, l$5 = tokens.length; i$10 < l$5; i$10++) { @@ -12660,7 +12660,7 @@ function inline(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/linkify.mjs +//#region node_modules/markdown-it/lib/rules_core/linkify.mjs function isLinkOpen$1(str) { return /^\s]/i.test(str); } @@ -12758,7 +12758,7 @@ function linkify$1(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/replacements.mjs +//#region node_modules/markdown-it/lib/rules_core/replacements.mjs const RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/; const SCOPED_ABBR_TEST_RE = /\((c|tm|r)\)/i; const SCOPED_ABBR_RE = /\((c|tm|r)\)/gi; @@ -12821,7 +12821,7 @@ function replace(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/smartquotes.mjs +//#region node_modules/markdown-it/lib/rules_core/smartquotes.mjs const QUOTE_TEST_RE = /['"]/; const QUOTE_RE = /['"]/g; const APOSTROPHE = "’"; @@ -12967,7 +12967,7 @@ function smartquotes(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_core/text_join.mjs +//#region node_modules/markdown-it/lib/rules_core/text_join.mjs function text_join(state) { let curr, last; const blockTokens = state.tokens; @@ -12998,7 +12998,7 @@ function text_join(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/parser_core.mjs +//#region node_modules/markdown-it/lib/parser_core.mjs /** internal * class Core * @@ -13043,7 +13043,7 @@ Core.prototype.State = state_core_default; var parser_core_default = Core; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/state_block.mjs +//#region node_modules/markdown-it/lib/rules_block/state_block.mjs function StateBlock(src, md, env, tokens) { this.src = src; this.md = md; @@ -13201,7 +13201,7 @@ StateBlock.prototype.Token = token_default; var state_block_default = StateBlock; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/table.mjs +//#region node_modules/markdown-it/lib/rules_block/table.mjs const MAX_AUTOCOMPLETED_CELLS = 65536; function getLine(state, line) { const pos = state.bMarks[line] + state.tShift[line]; @@ -13392,7 +13392,7 @@ function table(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/code.mjs +//#region node_modules/markdown-it/lib/rules_block/code.mjs function code(state, startLine, endLine) { if (state.sCount[startLine] - state.blkIndent < 4) { return false; @@ -13419,7 +13419,7 @@ function code(state, startLine, endLine) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/fence.mjs +//#region node_modules/markdown-it/lib/rules_block/fence.mjs function fence(state, startLine, endLine, silent) { let pos = state.bMarks[startLine] + state.tShift[startLine]; let max = state.eMarks[startLine]; @@ -13489,7 +13489,7 @@ function fence(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/blockquote.mjs +//#region node_modules/markdown-it/lib/rules_block/blockquote.mjs function blockquote(state, startLine, endLine, silent) { let pos = state.bMarks[startLine] + state.tShift[startLine]; let max = state.eMarks[startLine]; @@ -13615,7 +13615,7 @@ function blockquote(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/hr.mjs +//#region node_modules/markdown-it/lib/rules_block/hr.mjs function hr(state, startLine, endLine, silent) { const max = state.eMarks[startLine]; if (state.sCount[startLine] - state.blkIndent >= 4) { @@ -13650,7 +13650,7 @@ function hr(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/list.mjs +//#region node_modules/markdown-it/lib/rules_block/list.mjs function skipBulletListMarker(state, startLine) { const max = state.eMarks[startLine]; let pos = state.bMarks[startLine] + state.tShift[startLine]; @@ -13875,7 +13875,7 @@ function list(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/reference.mjs +//#region node_modules/markdown-it/lib/rules_block/reference.mjs function reference(state, startLine, _endLine, silent) { let pos = state.bMarks[startLine] + state.tShift[startLine]; let max = state.eMarks[startLine]; @@ -14053,7 +14053,7 @@ function reference(state, startLine, _endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/html_blocks.mjs +//#region node_modules/markdown-it/lib/common/html_blocks.mjs var html_blocks_default = [ "address", "article", @@ -14120,7 +14120,7 @@ var html_blocks_default = [ ]; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/html_re.mjs +//#region node_modules/markdown-it/lib/common/html_re.mjs const attr_name = "[a-zA-Z_:][a-zA-Z0-9:._-]*"; const unquoted = "[^\"'=<>`\\x00-\\x20]+"; const single_quoted = "'[^']*'"; @@ -14137,7 +14137,7 @@ const HTML_TAG_RE = new RegExp("^(?:" + open_tag + "|" + close_tag + "|" + comme const HTML_OPEN_CLOSE_TAG_RE = new RegExp("^(?:" + open_tag + "|" + close_tag + ")"); //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/html_block.mjs +//#region node_modules/markdown-it/lib/rules_block/html_block.mjs const HTML_SEQUENCES = [ [ /^<(script|pre|style|textarea)(?=(\s|>|$))/i, @@ -14225,7 +14225,7 @@ function html_block(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/heading.mjs +//#region node_modules/markdown-it/lib/rules_block/heading.mjs function heading(state, startLine, endLine, silent) { let pos = state.bMarks[startLine] + state.tShift[startLine]; let max = state.eMarks[startLine]; @@ -14267,7 +14267,7 @@ function heading(state, startLine, endLine, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/lheading.mjs +//#region node_modules/markdown-it/lib/rules_block/lheading.mjs function lheading(state, startLine, endLine) { const terminatorRules = state.md.block.ruler.getRules("paragraph"); if (state.sCount[startLine] - state.blkIndent >= 4) { @@ -14330,7 +14330,7 @@ function lheading(state, startLine, endLine) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_block/paragraph.mjs +//#region node_modules/markdown-it/lib/rules_block/paragraph.mjs function paragraph(state, startLine, endLine) { const terminatorRules = state.md.block.ruler.getRules("paragraph"); const oldParentType = state.parentType; @@ -14368,7 +14368,7 @@ function paragraph(state, startLine, endLine) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/parser_block.mjs +//#region node_modules/markdown-it/lib/parser_block.mjs /** internal * class ParserBlock * @@ -14514,7 +14514,7 @@ ParserBlock.prototype.State = state_block_default; var parser_block_default = ParserBlock; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/state_inline.mjs +//#region node_modules/markdown-it/lib/rules_inline/state_inline.mjs function StateInline(src, md, env, outTokens) { this.src = src; this.env = env; @@ -14591,7 +14591,7 @@ StateInline.prototype.Token = token_default; var state_inline_default = StateInline; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/text.mjs +//#region node_modules/markdown-it/lib/rules_inline/text.mjs function isTerminatorChar(ch) { switch (ch) { case 10: @@ -14636,7 +14636,7 @@ function text(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/linkify.mjs +//#region node_modules/markdown-it/lib/rules_inline/linkify.mjs const SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i; function linkify(state, silent) { if (!state.md.options.linkify) return false; @@ -14674,7 +14674,7 @@ function linkify(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/newline.mjs +//#region node_modules/markdown-it/lib/rules_inline/newline.mjs function newline(state, silent) { let pos = state.pos; if (state.src.charCodeAt(pos) !== 10) { @@ -14706,7 +14706,7 @@ function newline(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/escape.mjs +//#region node_modules/markdown-it/lib/rules_inline/escape.mjs const ESCAPED = []; for (let i$10 = 0; i$10 < 256; i$10++) { ESCAPED.push(0); @@ -14758,7 +14758,7 @@ function escape(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/backticks.mjs +//#region node_modules/markdown-it/lib/rules_inline/backticks.mjs function backtick(state, silent) { let pos = state.pos; const ch = state.src.charCodeAt(pos); @@ -14804,7 +14804,7 @@ function backtick(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/strikethrough.mjs +//#region node_modules/markdown-it/lib/rules_inline/strikethrough.mjs function strikethrough_tokenize(state, silent) { const start = state.pos; const marker = state.src.charCodeAt(start); @@ -14900,7 +14900,7 @@ var strikethrough_default = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/emphasis.mjs +//#region node_modules/markdown-it/lib/rules_inline/emphasis.mjs function emphasis_tokenize(state, silent) { const start = state.pos; const marker = state.src.charCodeAt(start); @@ -14974,7 +14974,7 @@ var emphasis_default = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/link.mjs +//#region node_modules/markdown-it/lib/rules_inline/link.mjs function link(state, silent) { let code$1, label, res, ref; let href = ""; @@ -15083,7 +15083,7 @@ function link(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/image.mjs +//#region node_modules/markdown-it/lib/rules_inline/image.mjs function image(state, silent) { let code$1, content, label, pos, ref, res, title$1, start; let href = ""; @@ -15192,7 +15192,7 @@ function image(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/autolink.mjs +//#region node_modules/markdown-it/lib/rules_inline/autolink.mjs const EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/; const AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/; function autolink(state, silent) { @@ -15251,7 +15251,7 @@ function autolink(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/html_inline.mjs +//#region node_modules/markdown-it/lib/rules_inline/html_inline.mjs function isLinkOpen(str) { return /^\s]/i.test(str); } @@ -15290,7 +15290,7 @@ function html_inline(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/entity.mjs +//#region node_modules/markdown-it/lib/rules_inline/entity.mjs const DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i; const NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i; function entity(state, silent) { @@ -15332,7 +15332,7 @@ function entity(state, silent) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs +//#region node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs function processDelimiters(delimiters) { const openersBottom = {}; const max = delimiters.length; @@ -15404,7 +15404,7 @@ function link_pairs(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/rules_inline/fragments_join.mjs +//#region node_modules/markdown-it/lib/rules_inline/fragments_join.mjs function fragments_join(state) { let curr, last; let level = 0; @@ -15429,7 +15429,7 @@ function fragments_join(state) { } //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/parser_inline.mjs +//#region node_modules/markdown-it/lib/parser_inline.mjs /** internal * class ParserInline * @@ -15559,7 +15559,7 @@ ParserInline.prototype.State = state_inline_default; var parser_inline_default = ParserInline; //#endregion -//#region node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs +//#region node_modules/linkify-it/lib/re.mjs function re_default(opts) { const re = {}; opts = opts || {}; @@ -15600,7 +15600,7 @@ function re_default(opts) { } //#endregion -//#region node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs +//#region node_modules/linkify-it/index.mjs function assign(obj) { const sources = Array.prototype.slice.call(arguments, 1); sources.forEach(function(source) { @@ -16092,7 +16092,7 @@ LinkifyIt.prototype.onCompile = function onCompile() {}; var linkify_it_default = LinkifyIt; //#endregion -//#region node_modules/.pnpm/punycode.js@2.3.1/node_modules/punycode.js/punycode.es6.js +//#region node_modules/punycode.js/punycode.es6.js /** Highest positive signed 32-bit float value */ const maxInt = 2147483647; /** Bootstring parameters */ @@ -16425,7 +16425,7 @@ const punycode = { var punycode_es6_default = punycode; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/presets/default.mjs +//#region node_modules/markdown-it/lib/presets/default.mjs var default_default = { options: { html: false, @@ -16446,7 +16446,7 @@ var default_default = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/presets/zero.mjs +//#region node_modules/markdown-it/lib/presets/zero.mjs var zero_default = { options: { html: false, @@ -16475,7 +16475,7 @@ var zero_default = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/presets/commonmark.mjs +//#region node_modules/markdown-it/lib/presets/commonmark.mjs var commonmark_default = { options: { html: true, @@ -16530,7 +16530,7 @@ var commonmark_default = { }; //#endregion -//#region node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.mjs +//#region node_modules/markdown-it/lib/index.mjs const config = { default: default_default, zero: zero_default, @@ -17568,14 +17568,17 @@ function instanceOf(tagName) { //#region apps/shared/ClawdisKit/Tools/CanvasA2UI/bootstrap.js const modalStyles = i` dialog { + position: fixed; + inset: 0; + width: 100%; + height: 100%; + margin: 0; padding: 24px; border: none; - background: none; - display: flex; - align-items: center; - justify-content: center; - max-width: calc(100vw - 32px); - max-height: calc(100vh - 32px); + background: rgba(5, 8, 16, 0.65); + backdrop-filter: blur(6px); + display: grid; + place-items: center; } dialog::backdrop { diff --git a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/index.html b/src/canvas-host/a2ui/index.html similarity index 94% rename from apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/index.html rename to src/canvas-host/a2ui/index.html index cd1ff378b..81b94aeb9 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisKit/Resources/CanvasA2UI/index.html +++ b/src/canvas-host/a2ui/index.html @@ -3,7 +3,7 @@ - Canvas + Clawdis Canvas