首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
draw.io箭头虚线设置全解:线型、箭头、批量与导出兼容
📅 2026/10/31 3:01:06
✍️ 爱科研究院
👁 阅读 3,247
1. 先把问题说透draw.io 里箭头虚线到底难在哪draw.io 画流程图、架构图、时序图的人不少但真正在箭头线条样式上卡住的人更多。我见过太多人画完一张架构图想让某条连接线表达异步调用或可选依赖结果在右侧样式面板里翻来翻去只找到填充色和线条粗细虚线选项像消失了一样。这个标题draw.io箭头设置虚线背后其实藏着一堆细分需求单条箭头改虚线、批量改虚线、让虚线带箭头、让虚线动起来做成动画虚线、导出后虚线消失、虚线间距太密像实线等等。这件事本质上不复杂draw.io 的连线样式系统是形状样式 线条样式line style 箭头端点arrow end三层结构虚线属于中间那层的一个属性值。但问题在于draw.io 的界面会随着你选中的对象类型变化选中文本框时根本没有线条样式选项选中连线时不同版本的面板位置也有差异再叠加箭头端和线型是两个独立开关很多人在一个地方改完以为没生效其实是改错了对象。这篇内容面向三类人一是刚上手 draw.io、连基本虚线都找不到的作图新手二是需要批量规范图例风格、对图有交付要求的工程从业者三是遇到导出的 PDF 虚线变实线虚线上箭头不见了这类疑难杂症的踩坑者。我会从选中对象的判定开始一直讲到批量刷样式、导出兼容和动画虚线把这条线的每一处能改、该改、容易改错的地方都过一遍。需要先说明一个前置认知draw.io 里的箭头是个统称。很多人说的箭头实际上指的是连接线edge末尾的那个三角/菱形/空心箭头标记它叫 arrow end而线条本身的虚实叫 line style枚举值是 dashed、dotted、dashdot 之类。这两个属性互相独立改一个不影响另一个。搞清楚这层后面所有操作都不会迷路。提示如果你在右侧面板找不到任何线条相关选项99% 的原因是当前没有选中连线或选中的是组合group。先双击进入组合内部或点选单条连线再试。2. 箭头虚线的样式系统拆解三层属性各管什么2.1 连线样式的三层结构先分清再动手draw.io现改名 diagrams.net但大家习惯还叫 draw.io的连线在底层是一段 XML挂在 mxGraphModel 里每个 edge 元素带一个 style 字符串里面用分号分隔键值对。理解这个字符串比死记界面按钮有用得多因为界面只是它的可视化壳子。一条典型的连线样式长这样mxCell ide1 edge1 sourcen1 targetn2 styleedgeStyleorthogonalEdgeStyle;rounded0;html1; endArrowclassic;endFill1;dashed1;dashPattern8 4;这一串里的关键字段可以归成三层层级属性名作用常见取值线型层dashed、dashPattern决定线条是实线还是虚线、虚线节奏dashed1开虚线dashPattern8 4定义节拍端点层endArrow、endFill、endSize决定终点箭头形状、是否填充、大小classic、open、block、none路径层edgeStyle、rounded、curved决定线怎么拐弯orthogonalEdgeStyle、entityRelationEdgeStyle我第一次给别人讲这个用的类比是装修线型层是墙面刷漆还是贴壁纸视觉纹理端点层是门把手装圆的还是方的收口件路径层是走廊怎么拐走向。三个工种的施工顺序互不干扰但成品是同一面墙。所以你改虚线时路径和箭头完全不受影响反过来改箭头形状虚线也不会掉。这里有个高频误区必须点破界面上Line线条区域里的样式按钮比如那个下拉的线型选择器它改的是dashed和dashPattern而Arrows箭头区域改的是endArrow/startArrow。两处面板挨得近图标又都是小线条极易点错。我自己早期就干过想改虚线结果把箭头改成了空心三角的事。2.2 为什么 draw.io 把虚线和箭头拆成两个开关这不是设计缺陷而是刻意的解耦。工程图里的语义需求经常是交叉组合的UML 类图里实现关系用虚线 空心三角箭头依赖关系用虚线 开放箭头组合关系用实线 实心菱形。如果虚线和箭头绑死这些标准画法就没法表达。拆开之后样式组合的自由度是 2 的 n 次方级别。实测下来draw.io 提供的端点形状有二十多种线型有实线、虚线、点线、点划线几类配合dashPattern还能自定义任意节拍。这意味着你可以做出长划 短点的工程标注线、极密点线的辅助线、疏虚线的区域分隔线。这种粒度在同类在线作图工具里算比较细的也是很多人坚持用它画正式图的原因。顺带说一个容易被忽略的点dashed1是布尔开关dashPattern8 4是节拍定义。只开 dashed 不定义 pattern走的是默认节拍定义了 pattern 但没开 dashed很多渲染场景下不会生效。这两个必须配合后面第 3 章会给出完整的参数写法。2.3 虚线在什么场景下才是对的选择不是所有线都该用虚线。我个人的判断标准是虚线表示非确定非实物非主流程。比如异步消息、回调、事件通知用虚线区分同步调用可选依赖、弱引用、未来规划中的模块逻辑分组边界、说明性指引线从注释指向被解释的对象部署图里的网络边界、安全域边界反过来主流程、强依赖、数据主链路就该老老实实用实线。我见过一张支付链路图所有线条都用了虚线结果读者完全分不清哪条是主路径、哪条是补偿路径图等于白画。虚线是信息层级工具不是装饰。这个认知比会点按钮重要得多因为它决定了你画出来的图能不能被同事一眼看懂。3. 单条箭头改虚线三种操作路径与参数细节3.1 面板操作法最快但最容易点错选中一条连线后右侧 Style样式面板从上到下依次是线型与粗细、箭头端点、线条颜色、路径样式。改虚线的入口就是第一块Line区域那个看起来像几条平行短线的下拉框点开后有实线、虚线、点线、点划线几个选项。操作顺序我建议固定成先选线型 → 再调粗细 → 最后看箭头。原因是线型切换会重置一部分外观参数如果你先调了颜色再切线型偶尔会遇到颜色被刷回默认的情况取决于版本和是否使用了样式预设。切换完成后线条立刻变成虚线箭头形状保持不变。这里的实操心得是面板上的线型下拉只有三四个预设够用但不够细。如果你需要划长一点、间隔宽一点的观感得进Edit Style或者用格式面板底部的更多选项。默认虚线在小尺寸缩放预览时经常糊成一片看起来像实线很多人因此以为没生效其实放大后就正常了。判断标准是把画布缩放到 100% 以上再看。注意不要在选中多个对象的状态下改线型。多选时面板顶部会显示 Multiple 或类似提示此时改样式会同时作用于所有选中项包括你不想动的连线。批量操作留到第 5 章专门讲。3.2 右键菜单法适合只想动一条线的场景在连线上右键弹出的菜单里有 Edit Style编辑样式入口点开后是一个文本对话框直接写样式字符串。这条路对新手不友好但对需要精确控制的人非常好用因为你可以直接写dashed1;dashPattern6 3;endArrowclassic;。我常用这个入口做两件事一是把某条线的节拍调成和同图其他虚线完全一致统一dashPattern值二是在箭头端点用非标准形状时手写参数。手写时注意分号结尾、键值不加空格dashed1而不是dashed 1空格在部分解析路径里会被当成节拍分隔符写错会导致整条样式失效、连线回退成默认蓝色实线看着像图坏了。实测中还有一个细节dashPattern的单位是像素级的相对值跟画布缩放无关但跟线宽有关。线宽 1px 时8 4是很清楚的疏虚线线宽 3px 时同样的8 4会显得很挤需要同步放大到12 6才协调。这个比例关系没有官方文档明说是我反复调图调出来的经验值。3.3 键盘与快捷入口被低估的效率点draw.io 有个很好用但少人知道的快捷键组合选中连线后按Ctrl/Cmd Shift S不同版本可能映射不同功能若无效则以面板为准会快速打开样式编辑更可靠的做法是用右侧面板的 Edit Style 按钮。另外把常用样式存成默认样式能省下大量重复操作选中一条已调好的虚线 → 右键 → Set as Default Style之后新画的同类连线会继承这套样式。这个技巧的价值在于一致性。一张有二十条虚线的图如果每条都手调节拍和颜色必然出现细微差异导出后一眼就能看出参差。设成默认后新线全部统一图面立刻显得专业。我现在的习惯是每类图开工前先画一条样式基准线把它设成默认再正式开始画。3.4 参数对照常用虚线风格怎么写视觉效果样式字符串片段适用场景标准虚线dashed1;通用异步、辅助关系疏虚线dashed1;dashPattern10 6;区域边界、规划模块密虚线dashed1;dashPattern3 2;注释指引、次级标注点线dashed1;dashPattern1 3;弱提示、参考线点划线dashed1;dashPattern9 3 2 3;工程标注、轴线虚线 空心箭头dashed1;endArrowopen;endFill0;UML 实现关系虚线 实心箭头dashed1;endArrowclassic;endFill1;异步消息表格里dashPattern的多段值含义是实-空-实-空循环段数不限但超过四段在实际渲染中辨识度会下降没必要过度设计。4. 虚线上加箭头最容易脱节的组合操作4.1 先有线后有箭头顺序别搞反很多人以为改了虚线箭头会消失其实不会。真正导致虚线没有箭头的原因是新建连线时端点被设成了none或者用了某种预设样式比如部分模板里的辅助线样式默认关闭了箭头。解决路径选中连线 → 面板 Arrows 区域 → 把起止端各选一个箭头形状。实操顺序建议是先定箭头形状和填充再切线型。因为箭头大小endSize在实线下的视觉比例到虚线上会显得偏小需要在虚线状态下去调才准。我一般把箭头设为endSize6到8虚线节拍越大箭头也要适度放大否则划长箭头小会显得头重脚轻。还有一个组合值得单独说UML 类图的实现关系。标准画法是虚线 空心闭合三角endArrowblock;endFill0;dashed1;。这个组合在 draw.io 里能直接拼出来但要注意endFill0必须显式写只改endArrowblock会默认填充成实心。依赖关系则是虚线 开放箭头endArrowopen两者区别就在闭合三角形是否填充画错会被懂 UML 的同事当场指出。4.2 双向箭头与无箭头的特殊处理双向虚线startArrow和endArrow都设值在时序图和依赖图里很常见表示双向异步通信。设置时两端形状最好保持一致否则视觉上会不协调。无箭头的纯虚线两端都是none则常用于区域分隔或逻辑分组这种线要记得把线宽调细一点1px并降低不透明度避免抢主体内容的视线。丢一个经验值表示可选/未启用的连线我会用dashed1;endArrowopen;opacity50;——虚线 开放箭头 半透明。三重视觉弱化叠加阅读者不用看文字标注就知道这条不是主链路。这种样式即语义的做法比在图例里写一堆说明高效得多。4.3 箭头端点和线型的联动陷阱有个坑我踩过两次把某条线设成dashPattern极密的点线后原本的classic实心箭头在缩放 50% 时几乎粘成一个黑点看着像没箭头。这不是 bug是像素密度问题。解决办法有两个一是放大endSize二是换用open这类轮廓箭头轮廓在低分辨率下比实心更易辨识。另一个联动点是rounded1圆角拐弯。虚线配合正交路径orthogonalEdgeStyle时拐角处如果有圆角虚线的划段会在圆角处被压缩变形节拍看起来不均匀。追求精细排版的话建议虚线走直线或尖角rounded0节拍才匀。这种细节在正式交付图里很体现专业度。5. 批量统一虚线风格让整张图看起来是一个人画的5.1 多选批量改范围控制的三个要点批量改的前提是选得准。draw.io 的多选有两种方式框选和Ctrl/Cmd 单击追加。框选会连节点一起选中之后改线型没反应因为节点没有线型属性所以我更倾向用Ctrl/Cmd逐条追加或者用 Edit → Select All Edges选择所有连线只选连线不选节点。这是批量操作里最关键的一句先确认选择集里只有连线。判断方法很简单看右侧面板顶部区域——只选连线时会显示线段样式区混选节点时会显示通用的填充/描边区。改之前瞄一眼能省下重新调图的时间。批量改的动作是选好 → 面板把线型切虚线 → 面板颜色和粗细统一 → 完成。drag 选择时要注意跨区域连线横跨画布两端的不容易被框选进来容易漏建议改完后开缩放至全图扫一遍检查有没有漏网的实线。我给团队定过一个交付检查项全图缩放到 50% 时应该能一眼数清虚线有几条数不清说明风格失控了。5.2 用拷贝样式做样式刷draw.io 有 Copy Style 和 Paste Style快捷键通常是Ctrl/Cmd Shift C和Ctrl/Cmd Shift V具体以你的版本为准。这是我最推荐的风格统一手段先把一条虚线调到满意 → 复制样式 → 逐条粘贴。它比面板批量改更精确因为它会连dashPattern、颜色、粗细、箭头形状、透明度一起带过去等于一个完全对齐的样式刷。和团队协作时我会把这个动作升级成流程先定一条样板线复制它的样式给所有同类连线再让其他人也复制这一条而不是各自去面板里点。原因很实际——面板上的几个预设线型在不同人眼里判断不同有人觉得点线够虚有人觉得不够各自点完之后图就花了。统一从样板线复制视觉绝对一致。5.3 自定义样式库与模板化draw.io 支持把样式存进 Scratchpad便签板/暂存区。做法是把调好的虚线拖进 Scratchpad之后从那里拖出来用形态和样式全保留。对于要长期维护同一套图的人来说这一步很值把异步调用线可选依赖线区域边界线三条样板存进去画新图时直接拖不用再记参数。更进一步是自建模板文件把常用图元和样式做成一个 .drawio 文件当模板每次新图从它复制。我自己的模板里就预置了五条线主流程实线、异步虚线、可选项虚线、边界点划线、注释指引密点线。新图开工只做内容不做风格决策效率提升非常直观。5.4 分组内的样式继承问题组合Group里的连线改样式时会遇到一个现象在组合外部选中组合改样式内部的线不变必须进入组合内部选中具体连线才有线型选项。这是 draw.io 的组合语义决定的——组合被视为一个整体形状样式作用在容器层面。处理方法是双击进入组合或右键选择进入内部编辑。这也解释了为什么有人抱怨我的虚线改不了——他选中了组合看到的样式面板是组合容器的改什么都没用。这个点我在第 1 章开头提过但触发频率太高值得单独重申。6. 导出与跨平台兼容虚线消失的真相6.1 导出 PDF/SVG 后虚线变实线的排查这是典型的截图能看见、导出就没了问题。原因通常有三类第一类是缩放导致的视觉错觉。导出成 PDF 后在小屏阅览虚线节拍被压缩看起来像实线。放大到 200% 再看往往正常。判断前先放大别急着重画。第二类是导出设置里开了简化/优化。部分导出路径会对线条做优化处理极端节拍如dashPattern1 1可能被合并。换用较明显的节拍6 3以上基本可规避。第三类是目标软件不认自定义节拍。导出 SVG 给某些工具二次编辑时对方只认基础的 stroke-dasharray不认识 draw.io 的扩展属性表现就是节拍丢失。这种情况改用 PNG 位图导出或让对方用兼容工具打开比反复调参数有效。我的实际交付习惯是给别人看的用 PNG200% 缩放导出清晰且表现稳定需要对方继续编辑的给 .drawio 源文件需要打印的用 PDF 并提前确认节拍够疏。三种格式各有适用面别指望一种通吃。6.2 打印场景下的虚线设计打印会把虚线问题放大。打印机分辨率、缩放比例、纸面对比度都会影响虚线辨识度。经验上纸面输出时dashPattern要比屏幕大 30% 到 50%线宽不低于 1.5px颜色不要用浅灰打印出来常常淡到看不见甚至丢失。用黑色或深灰#555 以下稳定得多。还有一条打印前务必确认虚线不是靠颜色区分的唯一线索。黑白打印会丢掉颜色语义如果你的图里虚线异步这个信息只靠线型表达、没有文字标注或图例那黑白打印后读者只能靠猜。稳妥做法是虚线 文字标签双通道表达。6.3 不同工具间迁移时的样式保留把 draw.io 图导出成其他格式再导入别的工具虚线样式是重灾区。通用的经验是几何和拓扑能保留样式节拍大概率丢。真要跨工具协作优先交换 SVG样式呈现最接近并接受节拍可能有偏差或者干脆导出 PNG 作为展示版另附 .drawio 作为编辑版两边各取所需。这里补一条排错思路如果导入后发现虚线变成实线别在导入端疯狂调参数回头检查源文件的样式字符串是否写成了非标准键。有些手写样式里的自定义键只在 draw.io 内部生效导出时会静默丢弃不留提示。7. 进阶玩法动画虚线与条件样式7.1 让虚线流动起来draw.io 支持在样式里写动画常见形式是顺着线条流动的虚线用来表达数据流方向或实时链路。写法是在样式串里加动画相关属性配合dashed使用dashed1;dashPattern8 4;strokeColor#1a73e8; flowAnimation1;flowDuration2;flowAnimation开启流动flowDuration控制一个循环的秒数数值越小流动越快。这个效果在演示时非常好用——一条从客户端指向服务端的虚线在流动读者瞬间明白那是请求流向不需要任何文字。心得流动效果别滥用。一张图里超过三条动画线视觉会乱成电流图反而干扰阅读而且部分导出格式尤其静态位图会把动画帧定格在某一瞬间出现半截划线的观感看着像渲染错误。所以动画线只用于展示场景现场演示、录屏交付静态文件前把flowAnimation去掉。7.2 条件样式与数据驱动draw.io 支持给形状和连线挂自定义属性配合简单的条件判断能做出数据驱动的效果。虽然它算不上专业可视化工具但在需要根据状态改线型的场景里够用。思路是给连线定一个语义属性比如statuspending再用批量替换把匹配的连线统一刷成虚线样式。这个做法在维护大型架构图时省力明显状态一变改属性值再批量刷一次全图风格自动对齐不用逐条找。代价是需要提前把属性命名规范定好否则后面替换时匹配不上。我的建议是属性名全小写、用短横线连接别用中文兼容性最好。7.3 与图层配合做风格切换draw.io 的图层Layer功能常被低估。把规划中的模块和它们之间的虚线放在单独图层需要时显示、不需要时隐藏就能在同一份文件里维护当前架构和目标架构两个版本。线型在这里是语义标签实线是已建虚线是待建。这个用法对做架构演进图的人价值很大——不用维护两份文件切换图层即可。注意图层隐藏后跨图层的连线可能显示异常一端在隐藏图层里处理办法是把连线也放在显式可见的图层或接受它变成悬空线。8. 常见问题排查速查虚线相关的翻车现场8.1 症状对照表症状最可能原因处理方式面板里找不到线型选项选中的是节点或组合点选连线本体或进入组合内部改了虚线但外观没变只改了dashed没生效 / 缩放太小看不清补dashPattern放大到 100% 以上确认虚线没有箭头端点被设为noneArrows 区重设起止端形状箭头在虚线上显得太小箭头尺寸未随节拍放大提高endSize或换轮廓箭头导出 PDF 虚线消失节拍过密或导出优化加大节拍至6 3以上换 PNG批量改后部分线没变框选漏掉跨区连线全图缩放扫查逐条补多选改样式后节点也变了选择集混入节点只用连线选择或 Ctrl 逐条追加组合内线改不动样式作用在组合容器层进入组合内部编辑拐角处虚线节拍变形圆角 虚线叠加改rounded0或用直线流动动画导出成半截线静态格式定格动画帧交付前去掉动画属性这张表基本覆盖了我这些年被问到的绝大多数虚线问题。可以看到真正属于功能不会用的很少大部分是选中对象不对、参数没配对、导出格式不匹配这三类。所以遇到问题先问自己三句我选中的是线吗参数是成对的吗导出格式适合吗8.2 三个只有踩过才知道的坑坑一复制粘贴样式时把箭头也带走了。Paste Style是全量覆盖包括箭头形状。如果你只想统一虚线节拍结果箭头也被改成了源线的样式会很难受。规避办法是先把箭头形状设计得全图一致本来也该一致或粘贴后单独复核箭头区。坑二从网页复制的图画进 draw.io虚线全是实线。粘贴进来的内容走的是格式归一化路径很多样式属性会被丢掉。这种图不要试图在原图上修补直接按原貌重画关键连线更快。我一般会留一张原图截图对照重画避免遗漏关系。坑三dashPattern值里用了逗号。有些地方的 CSS 习惯是逗号分隔draw.io 这里是空格分隔。写成8,4不报错但不生效静默失败最难查。记住是空格。8.3 一份可直接抄的样式清单下面这几个样式串可以直接粘到 Edit Style 里用覆盖了绝大多数常见需求我按语义命名方便记忆主流程实线 endArrowclassic;endFill1; 异步调用虚线 dashed1;dashPattern8 4;endArrowclassic;endFill1; 可选依赖虚线 dashed1;dashPattern6 3;endArrowopen;endFill0;opacity60; UML 实现关系 dashed1;endArrowblock;endFill0; 区域边界线 dashed1;dashPattern10 6;strokeWidth1;strokeColor#888888; 注释指引密点线 dashed1;dashPattern2 3;endArrowopen;endFill0;strokeWidth1; 工程轴线点划线 dashed1;dashPattern9 3 2 3;strokeWidth1; 流动数据流 dashed1;dashPattern8 4;flowAnimation1;flowDuration2;这段清单我建议直接存进自己的笔记或团队文档比每次翻面板找快得多。注意上面每个样式串末尾的分号要保留部分版本的解析依赖它粘贴时别带多余空格尤其行首缩进否则可能解析失败。9. 一点排版层面的经验补充技术上手之后虚线用得好不好差距在排版。说说我自己的几条准则。第一条一张图里虚线层级不超过两级。一级表示非主流程二级表示更弱的提示超过两级读者就分不清了。如果确实有三层信息要表达改用颜色或线宽区分别在线型上继续加码。第二条虚线的节拍要和图的整体精度匹配。高频截图用的小图比如手机端预览节拍要放大印刷级大图节拍可以细一些。这一点跟字号的处理逻辑一致——没有绝对正确的值只有跟整体协调的值。第三条虚线别和阴影、渐变混用。视觉元素叠加太多虚线本身的弱化语义会被冲淡读者反而会去关注那些花哨效果。我见过把虚线做成彩色渐变 阴影的图第一眼很热闹第二眼不知道它在表达什么。作图的信息效率永远优先于视觉花哨。最后补一个很实用的小动作出图前把画布缩放到 50%退后一米看屏幕。如果这时候还能清楚分辨哪些线是虚线、哪些是实线、虚线的箭头朝哪这张图的线型设计就过关了如果糊成一片说明节拍、粗细或对比度至少有一项需要调。这个一米测试比我调过的任何参数都管用也最省时间——它模拟的正是你同事、评审者打开这张图时的第一眼状态。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/31 3:01:06
Redis进阶实战:核心概念与性能优化全解析
2026/10/31 3:01:06
云终端和瘦终端有什么区别?胖终端、TCO与选型落地
2026/10/31 3:01:06
单细胞轨迹推断算法:原理、应用与优化指南
2026/10/31 3:51:09
VSCode配置指南:高效搭建大模型开发环境
2026/10/31 3:51:09
JavaScript括号匹配:用栈判断有效括号字符串
2026/10/31 3:51:09
Kev推理框架:一次前向实现多问题隔离作答与LoRA热加载
2026/10/31 3:51:09
Kev架构实战:一次前向实现多问题隔离作答的推理优化
2026/10/31 3:51:09
Lua协程在游戏开发中的高效应用与优化
2026/10/31 3:46:09
微软拆分Copilot:从聊天框到智能体工作流的AI办公变革
2026/10/31 0:00:18
猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包
2026/10/31 0:00:18
HDU2017多校标程复现:算法竞赛工程化真题沙盒
2026/10/31 0:00:18
Codex Sandbox 隔离环境拆解:AI Agent 的临时实验室如何运作
2026/10/31 0:57:03
全国计算机二级C语言真题PDF高效刷题指南
2026/10/31 0:56:56
requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南
2026/10/30 21:48:31
递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现
2026/10/30 3:44:27
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/30 3:44:25
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/30 3:44:29
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)