ust移动开发与跨平台模式探究腾讯云开发者社区

Rust 在服务端和嵌入式领域已经有很多跨平台模式的应用案例了,本文主要是来探究一下 Rust 在移动开发领域的跨平台开发模式。

本文中涉及所有信息均来自于互联网,如有错漏,请及时反馈。

目前 Rust 对 iOS 和 Android 平台 Target 都是 Tier 2 和 Tier 3 级别的支持,并且都支持 std 。

对 iOS 的支持:

Tier 2:

Tier 3:

对 Android 的支持:

Tier 2:

看得出来,Rust 对 iOS 和 Android 的支持还算可以。

一些公司使用 Rust 来开发跨平台组件,即,在 iOS 和 Andriod 之间共享代码。

对于 iOS ,Rust 可以直接通过FFi 的方式绑定 C-ABI 来进行交互,可以参考 Mozilla 近期发布的这篇文章来了解如何在 iOS 应用中部署 Rust 库。对于 Android ,Rust 通过 JNI 相关的库来进行相关绑定,Rust 社区生态也有一些类似于 android-ndk-rs的工具来进行 NDK 开发。

可以把这种模式称为:应用的 Rust 后端(App Backend-Rust)。当然,Rust 也可以编译到 WebAssembly ,也可以共享到浏览器端(应用条件比客户端相对严格一些)或桌面端(比如 Electron)。

为什么不用 Cpp 来共享代码?

如果写一次代码到处复用的成本开销超过了其收益,就没有必要使用这种策略了。所以, Dropbox 又回归了使用本地语言进行移动开发,直到现在 2022年。今年3月份 Dropbox 的一篇博客也说明了这一情况:使 Android 的相机上传更快更可靠 。

Dropbox Capture 桌面客户端使用 Rust 开发跨平台组件

虽然在移动领域,Dropbox 放弃了使用 Cpp 共享代码这种策略,但也没有使用 Rust。然而在 2021 年,Dropbox 的另一个团队,Dropbox Capture 则使用 Rust 来构建其桌面客户端的跨平台同步引擎组件。Capture 是一个视觉交流工具,旨在使团队可以轻松地使用屏幕录像、视频消息、屏幕截图或 GIF 异步共享他们的工作。

为什么使用 Rust 呢?

一方面,Rust 在 Dropbox 的产品中应用面越来越广,团队经验提升;另一方面,Rust 本身非常符合 Capture 这个场景,希望更好地控制截屏和录制能力、更好的错误处理以及更快的幕后性能。

使用 Rust 的收益:

根据以上 Dropbox 的实践,可以对 Rust vs Cpp 在跨平台共享组件方面的优劣有一定了解。接下来再看看其他公司的实践。

FullStory 公司 提供了数字体验智能 (DXI) 平台,提供了数据分析服务。该平台也提供了针对移动应用的数据采集功能,其中跨平台组件使用 Rust 开发。

为什么选择 Rust ?

当前的移动生态系统主要由 iOS 和 Android 设备组成。任何想要接触大多数移动用户的人都会发现自己必须开发两个版本的应用程序。

这两个平台存在显着差异:在语言级别上,iOS 应用程序主要是用 Swift(历史上是 ObjC)编写的;另一方面,Android 应用程序主要是用 Java 编写的,如今 Kotlin 越来越受欢迎。因为平台对现代移动应用程序想要做的所有事情都有不同的抽象,从创建按钮小部件到地理定位都不同,所以维护两个不同语言的版本会随着业务发展越来越困难。

FullSotry 公司面临的问题可能更加复杂,因为它们是提供框架给别人去使用,而不是直接发布应用程序。所以要考虑技术选择对客户的影响,例如与他们的代码进行有害交互的可能性,以及在 CPU 和内存使用方面对用户可见的性能影响。

如何使用 Rust ?

首先制定了一个粗略的设计准则:Rust 代码应包含与平台无关的通用代码,特定平台的代码应该保留在特定平台的代码中。

代码组织结构:

对于 iOS ,将 Rust 代码构建为静态库,使用 Ditto 编写脚本来构建 Rust 工具链,使用与 XCode 一致的 LLVM 版本。

对于 Android,将 Rust 构建为静态库,通过 CMake 与一些 C 代码链接,再给 Java 库共享。

使用 Rust 以后的优势

移动开发中使用 Rust 带来的痛苦是什么?

FullStory 工程师在 hacknews 上面透露:

"The only real pain we felt was around iOS bitcode and that was mainly Apple's fault because they make the whole process so Byzantine if you aren't using clang."

"我们唯一真正感到痛苦的是围绕着iOS的位码,这主要是苹果的错,因为如果你不使用clang,他们会使整个过程变得非常复杂。"

1Password 现在也加入了 Rust 基金会。其产品大约 63% 的 1Password 核心代码(加密和同步数据)使用了 Rust 。用 Rust 开发的跨平台组件来支持多个平台,包括移动端和浏览器(将 Rust 编译为 WebAssembly)。但 1Password 把这种方式叫「混合(hybrid)应用程序开发」。

“1Password 也开源了一些跨平台库。比如, sys-locale,轻量级获取位置的跨平台库,支持 iOS/ Android/ MacOS/ Linux/ Windows/ WebAssembly 。还有一个早期开源的 TypeShare库,用于把一些用Rust写的类型生成为其他语言的对应类戏,目前已经不再维护,但是其公司内部还在使用。

1password

首先,1Password 这个 core 库是完全独立的 Rust 库,它定义了明确的 API 来供各个客户端来使用。

op-app和op-ui用于整合其他crates。大部分状态被完全保留在内部,以确保密钥和其他secrets得到正确的处理,同时也使每个客户端UI能够专注于他们的优势,而不是业务逻辑。foundation crate 为 core 提供特定平台的服务(OS Services)。等等。

目前这个通用的 core 库在 Linux 端比较成功,1Password 团队表示会在下一代 1Password 的产品中也采用这种架构。

“1Password 趣事:翻到一篇2019年论文,探讨了流行的密码管理器的安全最佳实践,包括 1Password 。并且同年,在 1P 社区论坛中针对该论文中提到 1P的安全问题引起激烈讨论,1P 成员也第一次提到 Rust 语言,也许这是 1P使用 Rust 的开端,现在1Password 是 Rust 基金会成员。

关于飞书使用 Rust 的公开资料很少,只有2019年字节跳动王枞在QCon分享的《Rust 跨平台客户端开发在字节跳动的实践》,从其中可以了解到,飞书使用 Rust 也是做跨平台组件。飞书客户端非 UI 部分由 Rust 跨平台实现,目前包括移动端和桌面端共 5 个平台。

为什么跨平台使用Rust?

考虑跨平台能带来的收益:

如何做跨平台:

语言选择:

飞书架构:

如图,基本架构是通过一个线程池来管理不同的线程进行交互。

Rust 进程 和 Swift / Java / NodeJS 通过 FFi 和 Protocol Buffers (类似 RPC)的方式来进行调用。

Rust 库的模块组织结构如下:

每个crate都是独立构建、运行、测试和依赖。底层的一些 crate 不会频繁变动。

用到的 Rust 技术栈为:

遇到的问题:

Piccolo 是一款适用于 iPhone、iPad 和(通过Mac Catalyst)macOS 的 Othello(黑白棋) 应用程序,收获了 AppStore 2022年2月精选和2021年最爱游戏荣誉。

AppFlowy是一款开源的笔记类应用,类似于 Notion 。但 AppFlowy 相比Notion更加灵活,用户不仅可以DIY自己的域名、页面外观,还可以跨多个平台使用。

“虽然飞书使用 Rust 开发跨平台组件的细节不得而知,但是据飞书开发成员透露,其应用思路应该和 AppFlowy 是相似的。

AppFlowy 的前端和后端服务都用到了 Rust。这里主要谈前端架构。

前端架构 AppFlowy 采用了领域驱动设计(DDD)的概念,采用分层架构

“DDD,简单来说,就是业务架构映射到了系统架构之上,并能充分隔离业务和技术的边界。一般通过分层架构和六边形架构实现业务与技术实现的隔离。分层架构:遵循“关注点分离”原则来进行上下分层,将属于业务逻辑的关注点放到领域层(Domain Layer)中,而将支撑业务逻辑的技术实现放到基础设施层(Infrastructure Layer)中。另外还有一个应用层(Application Layer),一方面通过暴露业务应用服务的 API 来作为业务的逻辑门面(Facade),另一方面它又是业务和技术实现的粘合剂。六边形架构(端口-适配器):遵循“内外分离”原则来分层。内部代表了应用的业务逻辑,外部代表应用的驱动逻辑、基础设施和其他诸如UI/DB 等层,这样更加清晰地勾勒出业务逻辑与技术实现的边界,且将业务逻辑放在了架构的核心位置。体现业务逻辑的应用层与领域层处于六边形架构的内核,并通过内部的六边形边界与基础设施的模块隔离开。在进行软件开发时,只要恪守架构上的六边形边界,就不会让技术实现的复杂度污染到业务逻辑,保证了领域的整洁。如果我们在领域层或应用层抽象了技术实现的接口,再通过依赖注入将控制的方向倒转,业务内核就会变得更加的稳定,不会因为技术选型或其他决策的变化而导致领域代码的修改。

AppFlowy 的前端架构分层了两大部分:

抽象层级由基础设施层到表示层递增,复杂度则相反。

如何跨平台

拿 Flutter 来说,AppFlowy 通过实现 FlowySDK 来做到跨平台:在 Flutter 中定义接口,在 Rust 中实现接口,然后通过 Dart FFi 来绑定 Rust 实现,利用事件分发机制来。

这种模式的优点是:

缺点:

AppFlowy DDD 架构整体业务处理流程

流程如下:

flutter_rust_bridge 的作者 fzyzcjy 也在和 AppFlowy 的开发者沟通,后续 AppFlowy 有可能使用 flutter_rust_bridge,但目前这个进展比较缓慢。

Glean 是 Mozilla 开源的一款现代化跨平台遥测(Telemetry)库。它提供了 Glean SDK支持 Rust/ Kotlin / Swift / Python / JavaScript / QML 等多语言和开发环境。其中 Rust/ Kotlin/ Swift/ Python SDK 是基于一个 Rust core 库来构建的,而 Javascript/ QML 是基于 JavaScript 核心库构建。

“Telemetry(遥测技术),一般是指从物理网元或者虚拟网元上远程实时高速采集数据,实现对网络实时、高速和更精细的监控技术。

跨平台支持:

Glean 使用 uniffi-rs 来自动生成 Rust 库 FFi 绑定,通过需要编写一个接口定义语言(基于WebIDL)文件来描述目标语言可用的方法和数据结构。然后可以生成 Kotlin / Swift 绑定。

除了使用 Rust 开发跨平台共享组件之外,在 Rust 生态中,也有一些框架和游戏引擎来帮助你实现跨平台的应用和游戏。

Tauri 主要是用于开发桌面平台,相比于 Electron 来说,更加轻量、性能更好。Tauri 可以使开发者利用每个平台的 Webview 技术栈,通过 JS Api 调用后台接口。目前支持 Windows/ MacOS/ Linux 等平台,对于 iOS / Android 移动平台的支持正在进行中。

“1Password 8 使用 Electron 开发,引起很多用户的不满。因为 Electron 占用资源过多,也存在内存泄漏问题和安全隐患。用户们考虑到只是一个密码管理软件,不应该占用过多系统资源。也许未来 Tauri 会是一个好的替代。

Tauri 架构

Tauri 主要由两大组件构成:

跨平台支持

tauri-app/tao 利用 Rust 的 trait 和 features 机制,完美实现了跨平台架构:

使用统一的 Window 、Clipboard、 EventLoop 等窗口抽象:

其内部由 platform_impl门面模块来负责调用各个平台的特定实现:

对于 tauri-app/wry来说,跨平台架构的实现也是和 tao 类似的。

建立统一的跨平台抽象:

而内部的 InnerWebView 则是平台特定行为代码,通过 cfg 和 features 来构造一个统一的门面模块,完成跨平台分发。

看得出来,使用 Rust 进行跨平台开发,是非常简洁的。

Bevy 是一个数据驱动的游戏引擎,目前在社区的声望很高,也得到了很多公司的赞助。Bevy 也是跨平台的,在主流桌面操作系统(Linux、macOS、Windows)上开箱即用,无需特殊配置。Bevy 的目标还有 Web 浏览器(通过 WebAssembly,有一定限制)、移动设备(Android 和 iOS,可以构建但不一定能运行)和游戏主机(等待支持)。

跨平台支持

Bevy 本身的抽象程度比较高,跨平台支持主要是依赖于底层的一些库:

这些底层库实现跨平台的模式和上面 Tauri 的架构是相似的。

cargo-mobile 是一个与框架无关的工具,可以生成 Rust 移动项目的所有样板文件,并且包含大量用于在移动设备上构建和运行的便捷命令,可以提升 Rust 在移动领域的开发体验。目前仅支持 macOS 和 Linux 。

ndk-rs, Android NDK 的 Rust 绑定库。该库在 Rust 移动领域生态中应用比较广泛,上面提到到公司产品和项目基本都用到了它。

自 2019 年以来,Android 团队一直致力于将 Rust 编程语言引入 Android 开源项目 (AOSP)中。在 2021 年 4月,谷歌宣布 Android 开源项目(AOSP)现在支持 Rust 编程语言来开发 OS。

关键信息摘录:

IronCore Labs 公司 CEO( Patrick Walsh )去年(2021.10)在其官网发布了一篇 给Apple 的一封公开信:请用 Rust 替换 Objective-C 的文章,内容摘要:

这是一项艰巨的工作,但它会带来巨大的投资回报。迁移到 Rust 可以消除 70% 的漏洞,并且可能更接近 95% 的可远程利用的漏洞。专注于解析来自不受信任来源的数据的库将使Apple平台更加安全。

THE END
0.机械工程基础笔记整理碳素工具钢:高硬度,高耐磨性(0.7%以上高碳钢)(优质非合金钢) 用T+数字表示 T代表碳数字代表含碳千分数,后加A表示有害元素更低、 ² T7 T8:碳质量分数相对较低,仍具有一定塑性,且有良好硬度,常用于制造斧头,锤子,凿子,定位冲子等切削能力要求不高的工具 ² T9 T10;用于制造钢锯锯条,手攻螺纹用的丝锥和板牙等 jvzq<84yyy4489iqe0ipo8hqpvkov8741373785713:5;<5a32;86=;4874tj}rn
1.日本GOODDESIGNAWARD2021获奖作品欣赏(一)在中国台湾全域运行的都市间特急列车。开发过程中积极接受公众以及当地专家的意见。以简洁的外观、柔和、简练的内装,去除一切浮夸的要素,打造出增加当地人自豪感的标志性移动工具。 49 活动支援移动工具 KUPO 获奖公司/组织:SUZUKI MOTOR CORPORATION 扩展活动范围、保持健康的解决方案式移动工具。步行模式下可以推动前行,jvzq<84yyy4489iqe0ipo8hqpvkov8731363586714697=:29a7129>95:?10|mvon
2.辅助功能(设计基础知识)高度可自定义的用户界面(UI):使用 渐进式披露 隐藏复杂性;使用图标和其他视觉辅助工具。 没收 包括对移动和闪烁的视觉敏感度。 对接口进行调节的保守方法,例如动画的使用;避免屏幕闪烁在 2 赫茨(Hz) 和 55 Hz 之间。 语音或语言 包括阅读障碍和口头沟通困难。 拼写检查和语法检查实用工具;语音识别和文本转语音技jvzquC41fqit0vnetqyph}3eqo5{j6hp1yoofx|u1yoo5;4wzi{jfn4kpvks/jheguyjdrqkv{
3.PS学习笔记(一)跑起来会有风(三)移动工具(图层概念) 1、图层认识 通俗地讲,图层就像是含有文字或图形等元素的胶片,一张纸按上下顺序叠放在一起,组合起来形成页面的最终效果。图层可以调整顺序、不透明度,也可以复制删除、变化大小等。 打个比喻,每个图层就好似是一个透明的“玻璃”,而图层内容就画在这些“玻璃”上,如果“玻璃”什么都没有jvzquC41yy}/ewgnqiy/exr1nq|f/‚u1r17679=6794ivvq
4.2023Web前端开发八股文&面试题(万字系列)——这篇就够了!BFC的基本概念–BFC就是“块级格式化上下文”的意思,也有译作“块级格式化范围”。 通俗的讲,就是一个特殊的块,内部有自己的布局方式,不受外边元素的影响。 布局规则 内部的 Box 会在垂直方向,一个接一个地放置 垂直方向上的距离由margin决定。(完整的说法是:属于同一个BFC的两个相邻Box的margin会发生重叠(塌jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:8758=8
5.【PS教程】终于有一套全面的PS教程啦!从零开始学PS!!2.移动变换 和移动工具的操作基本一样 可以通过选项栏来调节xy精确控制对象移动。 △:参考点 变换的结果要应用(enter)或者取消(esc) 3.再次变换命令 可以快捷的重复变换的操作。 编辑菜单-变换-再次变换(Ctrl+shift+T) 再次变换并复制(Ctrl+shift+Alt+T) jvzquC41yy}/5?5fqe4dp8ftvkimg8699:662?d332<65<>770nuou
6.Photoshop中基本的3D概念和工具在Adobe Photoshop 中,了解 3D 概念和工具,例如构成 3D 图像的网格、材质和光源。jvzquC41jgrqz7ffqdk/exr1ep5qjxyqujuq1~xkpi5fu|jpvkgm/
7.虚幻引擎:开创视觉与创意的新纪元虚幻引擎5.3对UE5的核心工具集作了进一步优化,涉及渲染、世界构建、程序化内容生成(PCG)、动画和建模工具、虚拟制片、模拟等多方面。 渲染 纳尼特 显式切线 Nanite现在支持在数据格式和运行时中使用显式切线(Explicit Tangent)。此前,Nanite依赖的切线空间是在材质中隐式派生的,并且需要依赖屏幕空间位置和UV梯度jvzq<84yyy4njyv0ep5og€x145>727mvon
8.AdobePhotoshop2019新功能全面解析!现在,您可以使用“移动”工具双击“文字”图层,以快速开始编辑文档中的文本。无需切换工具即可编辑文本。 新功能05:实时混合模式预览 现在,您可以滚动查看各个混合模式选项,以了解它们在图像上的外观效果。当您在图层面板和图层样式对话框中滚动查看不同的混合模式选项时,Photoshop 将在画布上显示混合模式的实时预览效果jvzq<84yyy4489iqe0ipo8hqpvkov87312:1687513;98>68a;=18:<;344tj}rn
9.小学英语数字教学大全11篇一、电子书包的概念 电子书包是一种智能的、数字化移动学习工具,它能针对不同阶段的学习提供不同的电子教学辅助系统平台,通过系统平台,教师可以用电脑、手机、平板电脑等能够上网的设备连接电子书包,获取相关书本知识点或教学资源等。利用电子书包,学生能随时随地获得更多的教学资源,同时利用电子书包学生能获得个性化的jvzquC41yy}/hjgkcq4dqv3ep1nbq€jp168:9@3jvor
10.ps图层怎么移动在Adobe Photoshop(简称PS)这一强大的图像处理软件中,图层的概念至关重要,它允许用户在不破坏原始图像的情况下,对图像的不同部分进行独立编辑。掌握如何移动图层,是PS基础操作中的一项基本技能。以下将分点详细阐述如何在PS中移动图层。 **一、使用移动工具** 1. **选择移动工具**:首先,确保工具箱中的“移动jvzquC41i0vdqwqkpg4dqv3ep1~03A5813>189;:40nuou
11.座舱设计趋势研究:3D立体化融合式交互探索1.1.9 延锋 XiM23移动概念舱 1.1.10 奔驰VISION EQXX概念车智能座舱 1.1.11 奥迪urbansphere智能座舱 1.1.12 宝马MINI ACEMAN智能座舱 1.1.13 LG-Vision OMNIPOD移动概念舱 1.1.14 丰田纺织MX 221概念座舱 1.1.15 广汽概念车绿境SPACE 1.1.16 林肯首款纯电动概念车Lincoln Star智能座舱 jvzquC41yy}/fxsiejkek7hqo1gsvrhng1=29;953878998:43>43
12.【全文】肠造口患者造口适应水平的研究进展(结直肠癌论文)因此,提高肠造口患者术后生理、心理适应水平,让其尽早的回归到正常生活、工作与学习之中,是医护人员一直以来的工作要点[7]。现就有关肠造口患者造口适应水平概念、现状、测量工具、影响因素及干预措施的研究现状综述如下,以期为我国护理工作者进行相关研究提供参考和借鉴的经验。jvzquC41yy}/;:}wgunv0lto1n3k|lfny1<77:50jvsm
13.明源云研究报告:云中明源,领航不动产数字化大时代移动验房:验房更智慧,交房更轻松。移动验房是一款专门为房地产企 业进行房屋质量验收和交付的移动工具,其功能贯穿模拟验房、工地开 放、专项检查、正式交付五大场景,通过智能化缺陷分析模型,可实现 房间检查重点的精准预测,全面预控交付风险。 金地集团在工程质检和移动验房的应用上成为公司的标杆案例之一。2018 年,金地jvzquC41o0|{mxt0eqs0tnff14634984;787gA7hde883B=g6f752k;e;0nuou
14.混合式学习理论论文范文现代通信技术开课前,学生已经学习了数字电路、模拟电路、计算机网络、通信原理等课程,对于现代通信中的基本概念、现代通信网络组成及其特点有了一定的认识,这为我们开展教学奠定了一定的基础。另外,大多数学生都是伴随着互联网长大的一代,他们对于网络工具和移动互联网工具非常熟悉。而且非常喜欢通过互联网提供的各种平台与jvzquC41yy}/i€~qq0ipo8mcqyko1@95664ivvq
15.教科版六年级上册科学第一单元《机械和工具》教案【八篇】®无忧考网整理了教科版六年级上册科学第一单元《机械和工具》教案【八篇】,希望对你有帮助!第一课 使用工具【教学目标】科学概念:认识机械指的是利用力学原理组成的各种装置。杠杆、滑轮、斜面等都是机械。简单机械又被人们习惯地称为工具。过程与方法:常识在实践中解决指定的科学问题(如拔图钉、铁钉和木螺钉),jvzquC41yy}/7:yguv4og}4ujq}0:>>;35
16.某智慧教室建设解决方案智慧教室是微云服务器、移动平台端工具及智慧课堂云平台三大应用为一体,具有重新定义智慧教室应用概念的全新解决方案。通过“云加端”的应用,实现了教室内多种终端设备的无缝连接和智能化运用,进而改变课堂结构,实现教与学的革命。其核心功能:在教室内,教师和学生可以通过多种移动设备(同时支持安卓、苹果、windows),在无jvzq<84yyy4jg}3eqo4dp8fn1ljbn867856/j}rn
17.全国高等学校计算机二级Photoshop练习题及答案81、对于颜色取样器工具,下列正确的描述是:(AB) A、在图像上最多可放置四个颜色取样点。 B、颜色取样器可以指读取单个像素的值。 C、颜色取样点在信息调板上显示的颜色模式和图象当前的颜色模式可以不一致。 D、颜色取样点可用移动工具对其进行位置的改变。 jvzq<84mcqyik7~ld{y/exr1pexf48ykmw552A;850nuou
18.PowerDot肌肉刺激训练与康复工具,通过移动应用控制的便携式设备PowerDot的核心理念是希望让人们能够在舒适的家中享受尖端的健康和保健技术。PowerDot核心产品是一款从世界顶级运动员到健身爱好者都适用的智能肌肉刺激器。该产品采用了经验证的神经肌肉电刺激(NMES)概念,并将其封装在成一个轻巧的小贴片中,并可完全由移动设备上的App控制。 这使得用户可以在几乎任何场景下jvzquC41ep4dupk0qtm/ew4zj|~0j‚iv18?567mvon
19.入门本示例还概述了机器人的基本概念,如如何使用参考坐标系、工具和目标。 示例部分提供了更多不同应用的示例。例如:机器加工、抛光或焊接。 新RoboDK 项目 RoboDK 项目中使用的所有机器人、物体和工具都保存为一个 RoboDK 工作站(RDK 文件)。一个 RoboDK 工作站包含与机器人、工具、参考坐标系、目标、物体和其他参数有jvzquC41tqhpft3eqo5eql4ep1Mfv}npi/Yuc{ygf0nuou
20.SU中的镜像操作:简单教程与技巧在建模过程中,镜像操作是一个常用且有用的技巧,可以让您更高效地创建对称性的模型。在SU中,镜像操作同样也是一个重要的工具,让您可以轻松地复制和镜像对象。本文将为您介绍SU怎么镜像操作,以及一些与之相关的技巧。 1. 通过移动和旋转进行镜像: 在SU中,您可以使用移动和旋转工具来实现镜像效果。首先,选择您要镜像jvzquC41yy}/5m;80eun1tz1pg}t1:7930nuou