diff --git a/README.md b/README.md index a71e436..f840c30 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Quick Reference [INI](./docs/ini.md)<!--rehype:style=background: rgb(57 59 60/var(\-\-bg\-opacity));--> [JSON](./docs/json.md)<!--rehype:style=background: rgb(57 59 60/var(\-\-bg\-opacity));--> [Java](./docs/java.md)<!--rehype:style=background: rgb(211 55 49/var(\-\-bg\-opacity));&class=contributing&data-info=👆看看还缺点儿什么?--> +[Julia](./docs/julia.md)<!--rehype:style=background: rgb(211 55 49/var(\-\-bg\-opacity));&class=contributing&data-info=👆看看还缺点儿什么?--> [LaTeX](./docs/latex.md)<!--rehype:style=background: rgb(0 128 128/var(\-\-bg\-opacity));&class=contributing--> [Markdown](./docs/markdown.md)<!--rehype:style=background: rgb(103 61 156/var(\-\-bg\-opacity));--> [MySQL](./docs/mysql.md)<!--rehype:style=background: rgb(1 117 143/var(\-\-bg\-opacity));&class=tag&data-lang=SQL--> diff --git a/docs/julia.md b/docs/julia.md new file mode 100644 index 0000000..394eaf5 --- /dev/null +++ b/docs/julia.md @@ -0,0 +1,681 @@ +Julia 备忘清单 +=== + +本备忘清单旨在快速理解 [Julia](https://mysql.com) 一份简单而粗略的语言概览,供您参考。 + +入门 +--- + +### Julia 是什么? +<!--rehype:wrap-class=row-span-3--> + +- **`Julia`** 是一种为科学计算而生的,开源、多平台、高性能的高级编程语言 +- **`Julia`** 有一个基于 LLVM 的 JIT 编译器,这让使用者无需编写底层的代码也能拥有像 C 与 FORTRAN 那样的性能。因为代码在运行中编译,你可以在 shell 或 REPL 中运行代码,这也是一种推荐的工作流程 +- **`Julia`** 是动态类型的。并且提供了为并行计算和分布式运算设计的多重派发机制 +- **`Julia`** 自带包管理器 +- **`Julia`** 有许多内置的数学函数,包括特殊函数 (例如:Gamma 函数)。并且支持开箱即用的复数运算 +- **`Julia`** 允许你通过类似 Lisp 的宏来自动生成代码 +- **`Julia`** 诞生于 2012 年 + +### 赋值语句 + +```julia +answer = 42 +x, y, z = 1, [1:10; ], "A string" +x, y = y, x # 交换 x, y +``` + +### 常量定义 + +```julia +const DATE_OF_BIRTH = 2012 +``` + +### 行尾注释 + +```julia +i = 1 # 这是一行注释 +# 多行注释 +#= 这是另一行注释 =# +``` + +### 链式操作 + +```julia +x = y = z = 1 # 从右向左 +0 < x < 3 # true +5 < x != y < 5 # false +``` + +### 函数定义 + +```julia +function add_one(i) + return i + 1 +end +``` + +### 插入 LaTeX 符号 + +```julia +\delta + [Tab] # δ +``` + +### 运算符 +<!--rehype:wrap-class=row-span-2--> + +:- | :- +:- | :- +基本算数运算 | `+`,`-`,`*`,`/` +幂运算 | `2^3` => 8 +除法 | `3/12` => 0.25 +反向除法 | `7\3 == 3/7` => true +取余 | `x % y` 或 `rem(x,y)` +取反 | `!true` => false +等于 | `a == b` +不等于 | `a != b` 或 `a ≠ b` +小于与大于 | `<` 与 `>` +小于等于 | `<=` 或 `≤` +大于等于 | `>=` 或 `≥` +逐元素运算(点运算) | `[1, 2, 3] .+ [1, 2, 3] == [2, 4, 6]` => true<br /> `[1, 2, 3] .* [1, 2, 3] == [1, 4, 9]` => true +检测非数值(NaN) | `isnan(NaN)` => true <br />而不是 `NaN == NaN` => false +三元运算符 | `a == b ? "Equal" : "Not equal"` +短路 AND 和 OR 表达式 | `a && b` 和 `a \|\| b` +对象等价 | `a === b` + +### shell/REPL 环境 +<!--rehype:wrap-class=col-span-2--> + +:- | :- +:- | :- +上一次运算的结果 | `ans` +中断命令执行 | <kbd>Ctrl</kbd> + <kbd>C</kbd> +清屏 | <kbd>Ctrl</kbd> + <kbd>L</kbd> +运行程序文件 | `include("filename.jl")` +查找 func 相关的帮助 | `?func` +查找 func 的所有定义 | `apropos("func")` +命令行模式 | `;` +包管理模式 | `]` +帮助模式 | `?` +查找特殊符号输入方式 | `?☆ # "☆" can be typed by \bigwhitestar<tab>` +退出特殊模式,返回到 REPL | 在空行上按 <kbd>Backspace</kbd> +退出 REPL | `exit()` 或 <kbd>Ctrl</kbd> + <kbd>D</kbd> + +### 缺失值与空值 + +:- | :- +:- | :- +空值(Null) | `nothing` +缺失数据 | `missing` +浮点数的非数值 | `NaN` +滤除缺失值 | `collect(skipmissing([1, 2, missing])) == [1,2]` +替换缺失值 | `collect((df[:col], 1))` +检查是否有缺失值 | `ismissing(x)` 而不是 `x == missing` + +### 自我检查与反射 + +:- | :- +:- | :- +类型 | `typeof(name)` +类型检查 | `isa(name, TypeName)` +列出子类型 | `subtypes(TypeName)` +列出超类型 | `supertype(TypeName)` +函数方法 | `methods(func)` +即时编译的字节码 | `code_llvm(expr)` +汇编代码 | `code_native(expr)` + +### 随机数 +<!--rehype:wrap-class=col-span-2--> + +:- | :- +:- | :- +设置随机数种子 | `Random.seed!(seed)` +产生随机数 | `rand()` # 均匀分布 [0,1)<br/>`randn()` # 正态分布 (-Inf, Inf) +产生特定分布的随机数 | `using Distributions`<br/>`my_dist = Bernoulli(0.2)` 举例<br/>`rand(my_dist)` +以概率 p 从 A 中进行伯努利抽样 | `randsubseq(A, p)` +随机重排 A 中的元素 | `shuffle(A)` + +许多随机数函数都需要 `using Random` + +### 异常处理 +<!--rehype:wrap-class=row-span-3--> + +```julia +# 抛出异常 SomeExcep +throw(SomeExcep()) +# 再次引发当前的异常 +rethrow() +``` + +定义新异常 NewExcep + +```julia +struct NewExcep <: Exception + v::String +end +Base.showerror(io::IO, e::NewExcep) = print(io, "A problem with $(e.v)!") + +throw(NewExcep("x")) +# 抛出带文本的异常 +error(msg) +``` + +异常处理流程 + +```julia +try + # 进行一些可能会失败的操作 + catch ex + if isa(ex, SomeExcep) + # 处理异常 SomeExcep + elseif isa(ex, AnotherExcep) + # 处理另一个异常 AnotherExcep + else + # 处理其余的异常 + end + finally + # 永远执行这些语句 +end +``` + +### 类型 +<!--rehype:wrap-class=row-span-4--> + +```julia +# 类型注释 +var::TypeName +# 类型声明 +struct Programmer + name::String + birth_year::UInt16 + fave_language::AbstractString +end +# 可变类型声明 +将 struct 替换为 mutable struct +# 类型别名 +const Nerd = Programmer +# 类型构造器 +methods(TypeName) +# 类型实例 +me = Programmer("Ian", 1984, "Julia") +me = Nerd("Ian", 1984, "Julia") +# 子类型声明 +abstract type Bird end +struct Duck <: Bird + pond::String +end +# 参数化类型 +struct Point{T <: Real} + x::T + y::T +end + +p = Point{Float64}(1,2) +# 联合类型 +Union{Int, String} +# 遍历类型层级 +supertype(TypeName) 和 subtypes(TypeName) +# 默认的超类型 +Any +# 所有字段 +fieldnames(TypeName) +# 所有字段类型 +TypeName.types +``` + +### 标准库 + +:- | :- +:- | :- +Random | `rand`, `randn`, `randsubseq` +Statistics | `mean`, `std`, `cor`, `median`, `quantile` +LinearAlgebra | `I`, `eigvals`, `eigvecs`, `det`, `cholesky` +SparseArrays | `sparse`, `SparseVector`, `SparseMatrixCSC` +Distributed | `@distributed`, `pmap`, `addprocs` +Dates | `DateTime`, `Date` + +### 表达式 +<!--rehype:wrap-class=row-span-2--> + +使用引用 `:( ... )` 或块引用 `quote ... end` 可以创建一个表达式,就像 `parse(str)`,和 `Expr(:call, ...)`。 + +```julia +x = 1 +line = "1 + $x" # 一些代码 +expr = Meta.parse(line) # 生成一个 Expr 对象 +typeof(expr) == Expr # true +dump(expr) # 打印生成抽象语法(AST) +eval(expr) == 2 # 对 Expr 对象求值: true +``` + +Julia 具有同像性:程序被表示为语言本身的数据结构。 实际上 `Julia` 语言里的任何东西都是一个表达式 `Expr`。符号(`Symbols`)即驻留字符串 ,以冒号 `:` 为前缀。相对于其他类型来说,符号效率更高。它也经常用作标识符、字典的键或者数据表里的列名。符号不能进行拼接。 + +### 输入/输出 +<!--rehype:wrap-class=row-span-3--> + +读取流 + +```julia +stream = stdin +for line in eachline(stream) + # 做点啥 +end +``` + +读取文件 + +```julia +open(filename) do file + for line in eachline(file) + # 做点啥 + end +end +``` + +读取/写入 CSV 文件 + +```julia +# 读取 CSV 文件 +using CSV +data = CSV.File(filename) +# 写入 CSV 文件 +[label](koajs.md)CSV.write(filename, data) +``` + +读取/保存 Julia 对象 + +```julia +using JLD +# 保存 Julia 对象 +save(filename, "object_key", object, ...) +# 读取 Julia 对象 +d = load(filename) # 返回对象的字典 +``` + +读取/保存 HDF5 + +```julia +using HDF5 +# 保存 HDF5 +h5write(filename, "key", object) +# 读取 HDF5 +h5read(filename, "key") +``` + +### 宏 +<!--rehype:wrap-class=row-span-2--> + +宏允许你在程序中自动生成代码(如:表达式) + +```julia +# 定义 +macro macroname(expr) + # 做点啥 +end +``` + +使用 + +```julia +macroname(ex1, ex2, ...) 或 @macroname ex1, ex2, ... +``` +<!--rehype:className=wrap-text--> + +内置的宏 + +```julia +@assert # assert (单元测试) +@which # 查看对特定参数使用的方法/查找函数所在的模块 +@time # 运行时间与内存分配统计 +@elapsed # 返回执行用时 +@allocated # 查看内存分配 +@async # 异步任务 + +using Test +@test # 精确相等 +@test x ≈ y # 近似相等 isapprox(x, y) + +using Profile +@profile # 优化 +``` +<!--rehype:className=wrap-text--> + +创建 卫生宏 (hygienic macros)的规则: + +- 在宏的内部只通过 `local` 声明本地变量 +- 在宏的内部不使用 `eval` +- 转义插值表达式以避免宏变大:`$(esc(expr))` + +### 并行计算 +<!--rehype:wrap-class=row-span-2--> + +并行计算相关的工具可以在标准库 `Distributed` 里找到 + +```julia +# 启动带 N 各 worker 的 REPL +julia -p N +# 可用的 worker 数量 +nprocs() +# 添加 N 个 worker +addprocs(N) +# 查看所有 worker 的 pid +for pid in workers() + println(pid) +end +# 获得正在执行的 worker 的 id +myid() +# 移除 worker +rmprocs(pid) +# 在特定 pid 的 worker 上运行 f(args) +r = remotecall(f, pid, args...) +# 或: +r = @spawnat pid f(args) +... +fetch(r) +# 在特定 pid 的 worker 上运行 f(args) (更高效) +remotecall_fetch(f, pid, args...) +# 在任意 worker 上运行 f(args) +r = @spawn f(args) ... fetch(r) +# 在所有 worker 上运行 f(args) +r = [@spawnat w f(args) for w in workers()] ... fetch(r) +# 让表达式 expr 在所有 worker 上执行 +@everywhere expr +# 并行化带规约函数 red 的循环 +sum = @distributed (red) for i in 1:10^6 + # 进行并行任务 +end +# 将 f 用用到集合 coll 中的所有元素上 +pmap(f, coll) +``` +<!--rehype:className=wrap-text--> + +### 数组 +<!--rehype:wrap-class=col-span-2 row-span-2--> + +:- | :- +:- | :- +声明数组 | `arr = Float64[]` +预分配内存 | `sizehint!(arr, 10^4)` +访问与赋值 | `arr = Any[1,2]`<br/>`arr[1] = "Some text"` +从 m 到 n 的子数组 | `arr[m:n]` +n 个 `0.0` 填充的数组 | `zeros(n)` +n 个 `1.0` 填充的数组 | `ones(n)` +n 个随机 Int8 填充的数组 | `rand(Int8, n)` +用值 val 填充数组 | `fill!(arr, val)` +弹出最后一个元素 | `pop!(arr)` +弹出第一个元素 | `popfirst!(a)` +n 个 `#undef` 填充的数组 | `Vector{Type}(undef,n)` +n 个从 `start` 到 `stop` 的等间距数 | `range(start,stop=stop,length=n)` +将值 `val` 作为最后一个元素压入数组 | `push!(arr, val)` +将值 `val` 作为第一个元素压入数组 | `pushfirst!(arr, val)` +删除指定索引值的元素 | `deleteat!(arr, idx)` +数组排序 | `sort!(arr)` +将 `b` 连接到 `a` 后 | `append!(a,b)` +转化为字符串,并以 delim 分隔 | `join(arr, delim)` +<!--rehype:className=left-align--> + +--- + +```julia +# 数组比较 +a = [1:10;] +b = a # b 指向 a +a[1] = -99 +a == b # true +# 复制元素(而不是地址)/深拷贝 +b = copy(a) +b = deepcopy(a) +# 检查值 val 是否在数组 arr 中 +in(val, arr) # 或 +val in arr +# 改变维数 +reshape(1:6, 3, 2)' == [1 2 3; 4 5 6] +``` + +### 线性代数 + +:- | :- +:- | :- +单位矩阵 | `I` +定义矩阵 | `M = [1 0; 0 1]` +矩阵维数 | `size(M)` +选出第 i 行 | `M[i, :]` +选出第 j 列 | `M[:, j]` +水平拼接 | `M = [a b] 或 M = hcat(a, b)` +竖直拼接 | `M = [a ; b]` 或 `M = vcat(a, b)` +矩阵转置 | `transpose(M)` +共轭转置 | `M'` 或 `adjoint(M)` +迹(trace) | `tr(M)` +行列式 | `det(M)` +秩(rank) | `rank(M)` +特征值 | `eigvals(M)` +特征向量 | `eigvecs(M)` +矩阵求逆 | `inv(M)` +解矩阵方程 `M*x == v` | `M\v` 比 `inv(M)*v` 更好 +求 Moore-Penrose 伪逆 | `pinv(M)` +<!--rehype:className=left-align--> + +控制流与循环 +--- + +### 条件语句 + +```julia +if x < y + println("x is less than y") +elseif x > y + println("x is greater than y") +else + println("x is equal to y") +end +``` + +### for 循环 + +```julia +for i in 1:10 + println(i) +end +``` + +### 嵌套循环 + +```julia +for i in 1:10, j = 1:5 + println(i*j) +end +``` + +### 枚举 + +```julia +for (idx, val) in enumerate(arr) + println("the $idx-th element is $val") +end +``` + +### while 循环 + +```julia +while bool_expr + # 做点啥 +end +``` + +### 退出循环 + +```julia {4} +julia> i = 0 +julia> while true + global i += 1 + i > 5 && break + println(i) + end +``` + +### 退出本次循环 + +```julia {2} +for i = 1:6 + iseven(i) && continue + println(i) +end +``` + +数字相关 +--- + +### 整数类型 + +`IntN` 和 `UIntN`, 且 `N ∈ {8, 16, 32, 64, 128}`, `BigInt` + +### 浮点类型 + +`FloatN` 且 `N ∈ {16, 32, 64}` +`BigFloat` + +### 类型的最大和最小值 + +```julia +typemin(Int8) +typemax(Int64) +``` + +### 复数类型 + +```julia +Complex{T<:Real} +``` + +### 虚数单位 + +```julia +im +``` + +### 机器精度 + +```julia +eps() # 等价于 eps(Float64) +``` + +### 圆整 + +```julia +round() # 浮点数圆整 +round(Int, x) # 整数圆整 +``` + +### 类型转换 + +```julia +# 尝试进行转换/可能会报错 +convert(TypeName, val) +# 调用类型构造器转换 +TypeName(val) +``` + +### 全局常量 + +```julia +pi # 3.1415... +π # 3.1415... +im # real(im * im) == -1 +``` + +### 更多常量 + +```julia +using Base.MathConstants +``` + +模块 +--- + +### 定义 + +```julia +module PackageName +# 添加模块定义 +# 使用 export 让定义对外可见 +end +``` + +### 包含文件 filename.jl + +```julia +include("filename.jl") +``` + +### 加载 +<!--rehype:wrap-class=row-span-2--> + +```julia +using ModuleName # 导出所有名称 +# 仅导出 x, y +using ModuleName: x, y +# 仅导出 x, y +using ModuleName.x, ModuleName.y: +# 仅导出 ModuleName +import ModuleName +# 仅导出 x, y +import ModuleName: x, y +# 仅导出 x, y +import ModuleName.x, ModuleName.y +``` + +`using` 和 `import` 只有一点区别:使用 `using` 时,你需要写 `function Foo.bar(..` 来给 `Foo` 模块的函数 `bar` 增添一个新方法; 而使用 `import Foo.bar` 时,只需写 `function bar(...` 就能达到同样的效果 + +### 导出 + +```julia +# 得到模块导出名称的数组 +names(ModuleName) + +# 包含未导出的、弃用的 +# 和编译器产生的名称 +names(ModuleName, all::Bool) +# 也显示从其他模块显式导入的名称 +names(ModuleName, all::Bool, imported::Bool) +``` +<!--rehype:className=wrap-text--> + +包管理 +--- + +### 介绍 + +一个程序包必须先[注册](https://github.com/JuliaRegistries/General),然后才能在包管理器中看到它。在 Julia 1.0 中,有两种使用包管理器的方法: + +- 一是通过 `using Pkg` 导入 `Pkg` 模块,然后用它的函数管理其他包; +- 或者在 REPL 中输入 `]`,然后按回车。进入特殊的交互式包管理模式。 (要从包管理模式返回 REPL,只需要在空行上按退格键 `BACKSPACE` 就行了) + +注意新的工具总是先添加到交互式模式中,然后才会加入 `Pkg` 模块 + +### 在 Julia 会话中使用 Pkg 管理包 + +:- | :- +:- | :- +列出已安装的包 | `Pkg.status()` +更新所有包 | `Pkg.update()` +安装包 | `Pkg.add("PackageName")` +重新构建包 | `Pkg.build("PackageName")` +使用包 | `using PackageName` +删除包 | `Pkg.rm("PackageName")` +<!--rehype:className=left-align--> + +### 交互式包管理模式 + +:- | :- +:- | :- +添加包 | `add PackageName` +删除包 | `rm PackageName` +更新包 | `update PackageName` +使用开发版本 | `dev PackageName` 或 `dev GitRepoUrl` +返回普通发行版 | `free PackageName` +<!--rehype:className=left-align--> + +另见 +--- + +- [快速入门一份简单而粗略的语言概览](https://cheatsheet.juliadocs.org/zh-cn/) diff --git a/scripts/assets/julia.svg b/scripts/assets/julia.svg new file mode 100644 index 0000000..fd3637c --- /dev/null +++ b/scripts/assets/julia.svg @@ -0,0 +1,2 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 234 151"> +<path fill="currentColor" d="M44.4519565,56.2879688 L44.4519565,123.30109 C44.6129734,128.045059 43.9365796,132.780279 42.4538159,137.289445 C41.3975884,140.486966 39.488118,143.335289 36.9315073,145.526977 C34.4491469,147.561382 31.4874884,148.926728 28.328351,149.493094 C24.6499538,150.207169 20.9090714,150.549532 17.1621635,150.515016 C14.697617,150.540493 12.237511,150.300076 9.82452683,149.797934 C7.94021993,149.417438 6.12125023,148.76498 4.42470261,147.861035 C3.12541251,147.189554 2.00596054,146.216479 1.16012839,145.023328 C0.417866268,144.066901 0.0104722421,142.893053 0.000640110633,141.68243 C-0.027402649,139.682282 0.867265468,137.78067 2.42610495,136.527117 C4.3072243,135.065905 6.65332886,134.3343 9.03157761,134.467277 C10.0050542,134.446711 10.9730464,134.612156 11.8839096,134.955387 C12.6625959,135.255777 13.396535,135.661265 14.0653198,136.160578 C14.6903806,136.665327 15.2815339,137.210678 15.8349448,137.793094 C16.3079721,138.40323 16.7352964,138.967664 17.1009214,139.501477 C17.7517198,140.395652 18.5274342,141.191836 19.4043589,141.865699 C19.9237689,142.223017 20.5298596,142.433783 21.1589018,142.475836 C21.6975954,142.482029 22.226807,142.333907 22.6840151,142.048969 C23.1959461,141.666448 23.5748251,141.13282 23.7671792,140.523398 C24.1022021,139.584499 24.3074764,138.604256 24.3773159,137.609824 C24.5619565,136.060945 24.6433081,134.502012 24.6213706,132.942164 L24.6213706,61.7494922 L44.4519565,56.2879688 Z M73.4350503,57.8747812 L73.4355073,103.730098 C73.4286776,104.981036 73.6725016,106.220669 74.1525893,107.375836 C74.68359,108.436549 75.4020238,109.3925 76.2732143,110.197547 C77.1726157,111.012132 78.204284,111.667454 79.3238979,112.135359 C80.4824619,112.623247 81.7276268,112.872124 82.9847182,112.867066 C83.8358383,112.829018 84.6708213,112.621593 85.4408042,112.25693 C86.4244048,111.805426 87.3469967,111.231417 88.1866479,110.548547 C89.1830827,109.791696 90.1071945,108.944083 90.9471167,108.016594 C91.8743056,107.030822 92.6974967,105.952174 93.4036596,104.797723 L93.4036596,57.8747812 L113.234246,57.8747812 L113.234246,123.469277 L93.4036596,123.469277 L93.4036596,117.367453 C90.9171044,119.552956 88.1270511,121.366706 85.1204253,122.752195 C82.4487719,124.000813 79.5419179,124.666376 76.5931362,124.704633 C73.5251745,124.748269 70.4750348,124.231265 67.5928198,123.179062 C64.9275784,122.157209 62.4680675,120.663885 60.3319643,118.770539 C58.3044443,116.935342 56.6609537,114.716319 55.4965737,112.241848 C54.3249743,109.713798 53.7257243,106.95834 53.7412673,104.172047 L53.7412673,57.8747812 L73.4350503,57.8747812 Z M218.824917,58.1796211 C221.811594,58.8462298 224.650304,60.0561363 227.199558,61.7490352 C229.26996,63.1619009 230.94079,65.0850713 232.050488,67.3325859 C233.110219,69.6305216 233.631969,72.139862 233.576058,74.6697656 L233.606679,123.46882 L213.776093,123.469277 L213.776093,118.252266 C212.738565,119.14526 211.664698,119.995144 210.557222,120.799758 C209.454858,121.594613 208.280135,122.283961 207.048593,122.858684 C205.667911,123.461583 204.225495,123.91184 202.747015,124.201441 C200.844491,124.543437 198.913468,124.701537 196.980652,124.673555 C194.21834,124.714756 191.469081,124.286681 188.850066,123.407578 C186.610925,122.631205 184.540214,121.435311 182.748699,119.883867 C181.102652,118.382826 179.797056,116.546763 178.919691,114.499125 C178.02715,112.390849 177.575479,110.122227 177.592472,107.832867 C177.549509,105.510229 178.023622,103.207105 178.980476,101.090285 C179.962005,99.0695119 181.27701,97.2285663 182.870269,95.6447578 C184.601742,93.9607701 186.533262,92.4955533 188.62155,91.2819375 C190.907645,89.955973 193.276946,88.7789557 195.714675,87.7582266 C198.262167,86.7056836 200.901066,85.7445469 203.601207,84.8446523 L211.609765,82.235918 L213.791175,81.7628906 L213.791175,75.2648203 C213.826367,73.4869688 213.600136,71.7136875 213.119796,70.0021055 C212.806131,68.7110809 212.206705,67.5069173 211.36571,66.4783945 C210.662106,65.568045 209.715437,64.8751942 208.634949,64.4797969 C207.491799,64.0623595 206.282436,63.8556375 205.065535,63.8696602 C203.722822,63.8357393 202.384874,64.0423751 201.114957,64.4797969 C200.146021,64.8391405 199.273899,65.4188342 198.567464,66.1730977 C197.92048,66.8612473 197.444799,67.6922011 197.179003,68.5985625 C196.879148,69.587118 196.735132,70.616354 196.752136,71.6492461 C196.759527,72.8573622 196.615974,74.0616703 196.324812,75.2341992 C196.101603,76.3438826 195.626752,77.3875549 194.936808,78.2848828 C194.20353,79.1532532 193.264827,79.8245633 192.206046,80.2377773 C190.806474,80.8203451 189.296765,81.0909386 187.781984,81.0307266 C186.480405,81.0463326 185.185686,80.8399998 183.953433,80.4205898 C182.883637,80.017973 181.896278,79.4235441 181.039859,78.6665039 C180.237737,77.9013332 179.581294,76.9968076 179.102503,75.9969844 C178.65841,74.9446518 178.430255,73.8138252 178.431582,72.671625 C178.444506,70.3816085 179.259551,68.1685341 180.735019,66.4171523 C182.441591,64.3416967 184.547455,62.6299639 186.927792,61.3834102 C189.777698,59.894272 192.815374,58.7961888 195.95873,58.1188359 C199.520008,57.294594 203.164685,56.8851142 206.820078,56.8985625 C210.858863,56.8300078 214.891249,57.2609883 218.824917,58.1796211 Z M172.588894,56.4716953 L172.588894,123.469277 L152.758308,123.469277 L152.758308,61.9323047 L172.588894,56.4716953 Z M142.08023,26.7715195 L142.08023,123.469277 L122.249644,123.469277 L122.249644,32.2321289 L142.08023,26.7715195 Z M213.776093,89.6498789 C211.807296,90.4928035 209.887201,91.4452216 208.024812,92.502668 C206.158286,93.5022364 204.391063,94.6770696 202.747015,96.0112969 C201.259992,97.1732505 199.949705,98.5451188 198.857222,100.083902 C197.896681,101.384874 197.363634,102.951918 197.331595,104.56875 C197.328092,105.77543 197.492369,106.976741 197.819761,108.138164 C198.113186,109.170696 198.560622,110.153082 199.14698,111.052195 C199.656049,111.801128 200.290767,112.456411 201.023093,112.989094 C201.699087,113.460751 202.502275,113.716209 203.326531,113.721715 C205.051154,113.657969 206.726792,113.130998 208.17746,112.196145 C210.0836,111.038818 211.926962,109.781127 213.699769,108.428379 L213.776093,89.6498789 Z M161.39757,28.2664675 C168.893339,28.2692109 174.968656,34.3468125 174.968656,41.842582 C174.960429,49.3433789 168.877343,55.4191523 161.377003,55.4191523 C153.880777,55.4104688 147.810488,49.3287539 147.815968,41.8325273 C147.821457,34.3367578 153.901343,28.2632695 161.39757,28.2664675 Z M194.026402,28.2664675 C201.522628,28.2692109 207.597945,34.3468125 207.597945,41.842582 C207.589382,49.2392012 201.674423,55.250106 194.317535,55.4156487 L194.005,55.419 L193.694787,55.4157268 C186.342606,55.2412594 180.439402,49.2246396 180.445257,41.8325273 C180.450746,34.3367578 186.530632,28.2632695 194.026402,28.2664675 Z M33.8200385,28.2664687 C41.3180932,28.2664687 47.3961518,34.3449844 47.3961518,41.842582 C47.3879253,49.3374375 41.314437,55.4109258 33.8200385,55.4191523 C26.3219839,55.4196094 20.2434682,49.3410937 20.2434682,41.842582 C20.2434682,34.3445273 26.3219839,28.2664687 33.8200385,28.2664687 Z M177.699417,0 C185.197472,0 191.275539,6.07851563 191.275539,13.5765703 C191.279539,17.1784066 189.85049,20.6338734 187.303605,23.1807579 C184.756721,25.7276424 181.301254,27.1566916 177.699417,27.152692 C170.201363,27.152692 164.122847,21.074168 164.122847,13.5765703 C164.122847,6.07851563 170.201363,0 177.699417,0 Z"/></svg> \ No newline at end of file