From b2f0d4603d3fed1c8fe8ffc1d2e820db91c20ad0 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Thu, 11 Apr 2024 20:18:19 +0800 Subject: [PATCH] Many bug fixes and improvements (#1270) * Add Ruby and Kotlin icons Add the avatar of @curtishd * Update README * Synchronize zh-hant and zh versions. * Translate the pythontutor blocks to traditional Chinese * Fix en/mkdocs.yml * Update the landing page of the en version. * Fix the Dockerfile * Refine the en landingpage * Fix en landing page * Reset the README.md --- Dockerfile | 17 +- docs/assets/avatar/avatar_curtishd.jpg | Bin 0 -> 21920 bytes docs/index.html | 40 +- docs/index.md | 14 +- en/README.md | 6 +- en/docs/index.html | 367 ++++++++++++++++++ en/docs/index.md | 157 +------- en/mkdocs.yml | 20 +- overrides/main.html | 2 +- overrides/stylesheets/extra.css | 7 - .../hash_map_open_addressing.c | 3 + .../linkedlist_deque.c | 4 +- zh-hant/codes/cpp/chapter_tree/avl_tree.cpp | 4 +- .../coin_change.go | 2 +- .../coin_change_ii.go | 2 +- .../java/chapter_sorting/radix_sort.java | 3 +- .../chapter_array_and_linkedlist/array.kt | 5 +- .../linked_list.kt | 21 +- .../chapter_array_and_linkedlist/list.kt | 8 +- .../chapter_array_and_linkedlist/my_list.kt | 10 +- .../kotlin/chapter_backtracking/n_queens.kt | 18 +- .../chapter_backtracking/permutations_i.kt | 10 +- .../chapter_backtracking/permutations_ii.kt | 9 +- .../preorder_traversal_i_compact.kt | 10 +- .../preorder_traversal_ii_compact.kt | 18 +- .../preorder_traversal_iii_compact.kt | 20 +- .../preorder_traversal_iii_template.kt | 27 +- .../chapter_backtracking/subset_sum_i.kt | 14 +- .../subset_sum_i_naive.kt | 13 +- .../chapter_backtracking/subset_sum_ii.kt | 15 +- .../recursion.kt | 2 +- .../space_complexity.kt | 6 +- .../time_complexity.kt | 11 +- .../worst_best_time_complexity.kt | 7 +- .../chapter_divide_and_conquer/build_tree.kt | 14 +- .../chapter_divide_and_conquer/hanota.kt | 10 +- .../climbing_stairs_backtrack.kt | 7 +- .../climbing_stairs_dfs_mem.kt | 6 +- .../climbing_stairs_dp.kt | 4 +- .../coin_change.kt | 8 +- .../edit_distance.kt | 16 +- .../chapter_dynamic_programming/knapsack.kt | 44 +-- .../min_cost_climbing_stairs_dp.kt | 4 +- .../min_path_sum.kt | 36 +- .../unbounded_knapsack.kt | 20 +- .../chapter_graph/graph_adjacency_list.kt | 10 +- .../chapter_graph/graph_adjacency_matrix.kt | 19 +- .../codes/kotlin/chapter_graph/graph_bfs.kt | 16 +- .../codes/kotlin/chapter_graph/graph_dfs.kt | 14 +- .../chapter_greedy/fractional_knapsack.kt | 20 +- .../kotlin/chapter_greedy/max_capacity.kt | 4 +- .../chapter_greedy/max_product_cutting.kt | 8 +- .../kotlin/chapter_hashing/array_hash_map.kt | 46 +-- .../kotlin/chapter_hashing/built_in_hash.kt | 6 +- .../codes/kotlin/chapter_hashing/hash_map.kt | 6 +- .../chapter_hashing/hash_map_chaining.kt | 16 +- .../hash_map_open_addressing.kt | 29 +- .../kotlin/chapter_hashing/simple_hash.kt | 4 +- zh-hant/codes/kotlin/chapter_heap/heap.kt | 12 +- zh-hant/codes/kotlin/chapter_heap/my_heap.kt | 23 +- .../chapter_searching/hashing_search.kt | 9 +- .../kotlin/chapter_searching/linear_search.kt | 2 +- .../kotlin/chapter_sorting/bubble_sort.kt | 2 +- .../kotlin/chapter_sorting/bucket_sort.kt | 6 +- .../kotlin/chapter_sorting/counting_sort.kt | 4 +- .../codes/kotlin/chapter_sorting/heap_sort.kt | 9 +- .../kotlin/chapter_sorting/insertion_sort.kt | 2 +- .../kotlin/chapter_sorting/merge_sort.kt | 6 +- .../kotlin/chapter_sorting/radix_sort.kt | 9 +- .../kotlin/chapter_sorting/selection_sort.kt | 3 +- .../chapter_stack_and_queue/array_deque.kt | 9 +- .../chapter_stack_and_queue/array_queue.kt | 6 +- .../chapter_stack_and_queue/array_stack.kt | 6 +- .../linkedlist_deque.kt | 31 +- .../linkedlist_queue.kt | 6 +- .../linkedlist_stack.kt | 4 +- .../kotlin/chapter_tree/array_binary_tree.kt | 44 ++- zh-hant/codes/kotlin/chapter_tree/avl_tree.kt | 75 ++-- .../kotlin/chapter_tree/binary_search_tree.kt | 57 ++- .../kotlin/chapter_tree/binary_tree_bfs.kt | 15 +- .../kotlin/chapter_tree/binary_tree_dfs.kt | 8 +- zh-hant/codes/kotlin/utils/ListNode.kt | 8 +- zh-hant/codes/kotlin/utils/PrintUtil.kt | 17 +- zh-hant/codes/kotlin/utils/TreeNode.kt | 9 +- zh-hant/codes/kotlin/utils/Vertex.kt | 8 +- .../chapter_array_and_linkedlist/array.md | 12 +- .../linked_list.md | 8 +- .../chapter_array_and_linkedlist/my_list.md | 2 +- .../chapter_backtracking/n_queens.md | 2 +- .../chapter_backtracking/permutations_i.md | 2 +- .../chapter_backtracking/permutations_ii.md | 2 +- .../preorder_traversal_i_compact.md | 2 +- .../preorder_traversal_ii_compact.md | 2 +- .../preorder_traversal_iii_compact.md | 2 +- .../preorder_traversal_iii_template.md | 2 +- .../chapter_backtracking/subset_sum_i.md | 2 +- .../subset_sum_i_naive.md | 2 +- .../chapter_backtracking/subset_sum_ii.md | 2 +- .../iteration.md | 16 +- .../recursion.md | 8 +- .../space_complexity.md | 12 +- .../time_complexity.md | 22 +- .../worst_best_time_complexity.md | 2 +- .../binary_search_recur.md | 2 +- .../chapter_divide_and_conquer/build_tree.md | 2 +- .../chapter_divide_and_conquer/hanota.md | 2 +- .../climbing_stairs_backtrack.md | 2 +- .../climbing_stairs_constraint_dp.md | 2 +- .../climbing_stairs_dfs.md | 2 +- .../climbing_stairs_dfs_mem.md | 2 +- .../climbing_stairs_dp.md | 4 +- .../coin_change.md | 4 +- .../coin_change_ii.md | 4 +- .../edit_distance.md | 4 +- .../chapter_dynamic_programming/knapsack.md | 8 +- .../min_cost_climbing_stairs_dp.md | 4 +- .../min_path_sum.md | 8 +- .../unbounded_knapsack.md | 4 +- .../chapter_graph/graph_adjacency_list.md | 2 +- .../chapter_graph/graph_adjacency_matrix.md | 2 +- .../pythontutor/chapter_graph/graph_bfs.md | 2 +- .../pythontutor/chapter_graph/graph_dfs.md | 2 +- .../chapter_greedy/coin_change_greedy.md | 2 +- .../chapter_greedy/fractional_knapsack.md | 2 +- .../chapter_greedy/max_capacity.md | 2 +- .../chapter_greedy/max_product_cutting.md | 2 +- .../chapter_hashing/array_hash_map.md | 2 +- .../chapter_hashing/hash_map_chaining.md | 2 +- .../chapter_hashing/simple_hash.md | 2 +- .../codes/pythontutor/chapter_heap/my_heap.md | 8 +- .../codes/pythontutor/chapter_heap/top_k.md | 2 +- .../chapter_searching/binary_search.md | 4 +- .../chapter_searching/binary_search_edge.md | 4 +- .../binary_search_insertion.md | 4 +- .../pythontutor/chapter_searching/two_sum.md | 4 +- .../chapter_sorting/bubble_sort.md | 4 +- .../chapter_sorting/bucket_sort.md | 2 +- .../chapter_sorting/counting_sort.md | 4 +- .../pythontutor/chapter_sorting/heap_sort.md | 2 +- .../chapter_sorting/insertion_sort.md | 2 +- .../pythontutor/chapter_sorting/merge_sort.md | 2 +- .../pythontutor/chapter_sorting/quick_sort.md | 8 +- .../pythontutor/chapter_sorting/radix_sort.md | 2 +- .../chapter_sorting/selection_sort.md | 2 +- .../chapter_stack_and_queue/array_queue.md | 2 +- .../chapter_stack_and_queue/array_stack.md | 2 +- .../linkedlist_queue.md | 2 +- .../linkedlist_stack.md | 2 +- .../chapter_tree/array_binary_tree.md | 2 +- .../chapter_tree/binary_search_tree.md | 6 +- .../chapter_tree/binary_tree_bfs.md | 2 +- .../chapter_tree/binary_tree_dfs.md | 2 +- .../chapter_array_and_linkedlist/array.rb | 51 +-- .../linked_list.rb | 57 +-- .../ruby/chapter_array_and_linkedlist/list.rb | 87 +++-- .../chapter_array_and_linkedlist/my_list.rb | 59 +-- .../iteration.rb | 21 +- .../recursion.rb | 21 +- .../space_complexity.rb | 27 +- .../time_complexity.rb | 55 +-- .../worst_best_time_complexity.rb | 15 +- .../chapter_stack_and_queue/array_deque.rb | 145 +++++++ .../chapter_stack_and_queue/array_queue.rb | 107 +++++ .../chapter_stack_and_queue/array_stack.rb | 78 ++++ .../ruby/chapter_stack_and_queue/deque.rb | 42 ++ .../linkedlist_deque.rb | 168 ++++++++ .../linkedlist_queue.rb | 101 +++++ .../linkedlist_stack.rb | 87 +++++ .../ruby/chapter_stack_and_queue/queue.rb | 38 ++ .../ruby/chapter_stack_and_queue/stack.rb | 37 ++ zh-hant/codes/ruby/test_all.rb | 23 ++ .../rust/chapter_hashing/hash_map_chaining.rs | 7 +- .../rust/chapter_tree/binary_tree_bfs.rs | 6 +- .../rust/chapter_tree/binary_tree_dfs.rs | 12 +- zh-hant/codes/rust/include/tree_node.rs | 9 +- .../chapter_array_and_linkedlist/array.md | 2 +- .../linked_list.md | 2 +- .../docs/chapter_array_and_linkedlist/list.md | 12 +- .../time_complexity.md | 12 +- .../basic_data_types.md | 7 +- .../chapter_data_structure/number_encoding.md | 2 +- .../docs/chapter_data_structure/summary.md | 32 ++ .../docs/chapter_hashing/hash_algorithm.md | 2 +- zh-hant/docs/chapter_hashing/hash_map.md | 4 +- zh-hant/docs/chapter_heap/heap.md | 2 +- zh-hant/docs/chapter_preface/suggestions.md | 5 + zh-hant/docs/chapter_stack_and_queue/deque.md | 87 +++-- zh-hant/docs/chapter_stack_and_queue/queue.md | 116 +++--- zh-hant/docs/chapter_stack_and_queue/stack.md | 109 +++--- zh-hant/docs/chapter_tree/binary_tree.md | 4 +- zh-hant/docs/index.html | 32 +- zh-hant/docs/index.md | 14 +- 192 files changed, 2382 insertions(+), 1196 deletions(-) create mode 100644 docs/assets/avatar/avatar_curtishd.jpg create mode 100644 en/docs/index.html create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/array_deque.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/array_queue.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/array_stack.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/deque.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/linkedlist_stack.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/queue.rb create mode 100644 zh-hant/codes/ruby/chapter_stack_and_queue/stack.rb create mode 100644 zh-hant/codes/ruby/test_all.rb diff --git a/Dockerfile b/Dockerfile index 89e35a391..7531d6f91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,18 +2,23 @@ FROM python:3.10.0-alpine ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple RUN pip install --upgrade pip -RUN pip install mkdocs-material==9.5.2 mkdocs-glightbox +RUN pip install mkdocs-material==9.5.5 mkdocs-glightbox WORKDIR /hello-algo COPY overrides ./build/overrides -COPY docs ./build/docs -COPY docs-en ./build/docs-en -COPY mkdocs.yml ./mkdocs.yml -COPY mkdocs-en.yml ./mkdocs-en.yml +COPY docs ./build/docs +COPY mkdocs.yml mkdocs.yml RUN mkdocs build -f mkdocs.yml -RUN mkdocs build -f mkdocs-en.yml + +COPY zh-hant/docs ./build/zh-hant/docs +COPY zh-hant/mkdocs.yml ./zh-hant/mkdocs.yml +RUN mkdocs build -f ./zh-hant/mkdocs.yml + +COPY en/docs ./build/en/docs +COPY en/mkdocs.yml ./en/mkdocs.yml +RUN mkdocs build -f ./en/mkdocs.yml WORKDIR /hello-algo/site EXPOSE 8000 diff --git a/docs/assets/avatar/avatar_curtishd.jpg b/docs/assets/avatar/avatar_curtishd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40d47610b51b0eb2ccf81fdb06a479dc9a32c2c0 GIT binary patch literal 21920 zcmagF1z22NuP8h?MT@%>FYfM6ad&qa26rnIclSbZx8h#h-5K27q4>{x?y>*5-#It) z%&a|`l`Km#*-7^M()$(wSHi>E0sxSap#{JL{tMnu0chf`rna5{2mtg4niv3h--05w za&d9sWn!{-W;8YfnV2)0f`CjO#tuv@jLb{`ejyJBV^dpm7g7^*OKW=pvWvDZGE!?Z z0WwVvd1iSBF>@qC)B|W|@678VK=yCU zc|WfIK{Jt&{#zFpTLChWe?}$Ml2;-X138(K@-VV6m@+f7kaB%ov2(I=^YCzSanX~q zGPANVF>^Apaxk#6@p5qSvapl>JCJ>h=wxQWt0FG>@8f-Z6CnHdg}J-CGrF@ef}AXw zSa^7Nn3!3aSXmi9dN4S9+PfHgFxWej{|5(gb7xa0YX=u=kUi-?9F0vtt}X&(AG7^G z%K$pa%l{|if4O5o;6H2ox8BY!D(3$+jeptOS=F_@EG#S%5~5tpY!b|Dk|Gj3 zJmTD3tp7nPWAE%@Y;S7*AGFs0Ma%ZT((;NqnH#%+oYX)dyZ<;rB`c5%$k__y@Xt}P zlgb;LTHF7F_-AkbeX8b8)^6rzl1?BX>A!6bul0YM0GAjiv$!}n2Nw&gC>t}o1Sb~< z50{9jxCASUB&Rql7umnlnEkf}|37J%J_cv{=Oq8z$^HlGLtOs3{7+f^`0}69Zf^e} z;!Yp3{C*BV`8Np#n00^X48;2?;0NF{A|fIZ;%6kJ&p4>as5k_epFd*~kl_3SB*ZxQ zAAmzlOioEnNlwhf#Ky+NB>eve2sBhwGz>H>baX6Cw2v1)CN?%EJ{3MbAwE78Gdb}G zkTcUUQd3hi(s6JwGjnhV3k&^s7Vq5vGU0fYcgFqq21$`Y9W&qi6Vtqidi;BoXY} zy)B@r#x(cAz5y`@v1$)VV-YM7T&7EEAEC^)74J@+g~ErjEs$3oW3@{x=KuFVZp5Ub zw4}5QAtED4MD45rxj7rAd0w_6H_<_*_i^TkKNd{M2p_{r9%gIm=mw-+TTiE)M2z!q zt?jT8}zI!CFNx-32UEl;{IWtL=`t*Zbuq4m*_D)ihznVON8n^b7(==;BqqKIP>_e7uVS z@*-#uX!8D-rb=rG-BStrdubVEb^sN{##~~(Cbdhk^P`%BYR{TZ^R;>Lk#rB~7$U>K zi6bD}V}WszpFVK}gN{r^O_Ho>Op9w-dT*58j(kwCN{JLF-aZVau}R0v^46^v;Uc+S z9kA?`VlSHOwiHINwmkmu8Q6BZr!_fqg})WCv@EKTUWm?zY@nve_0sAoRaYI$X(fz@ zc7eYxeb?0FYF%tI82ci3uf$f*nDV9;PY@kpJ}@#g0?GE8S%%Q z5WX@0Mimx2UMz%V9H?y%PhPDfMcp*;ZCAXX(5E{NGℜtmzseiXuW#KgCV*cY)&~ zrJCCDnxa-OlP+Wh*I=@EO&$eHj8+~)@`X?<7HFB3UX#Kj-N~Ds4)1EVOF=Tx!8*)S z<;F=DP9fdDbWOGX$62KUPwXo+n)iZ%qo>ne49WE%L=ErPmX@uF`HD9TL@d18$N}jD zS?S!9%3I~Lvg_To&!iCT!3+0S&$KUUbdZ7U2n_zj>>*}Ni8itHwuOJOy|!*wZs@#v zW`@y;7QVox^lES&ZQFpkJl5*)L`V_84;e~y8PsPCY>m}5U+YPM5*5gAGCHWjksJU6 z^0?v|wFjVMd50N)mABRAJ1_Nlk$uSqwHD@qRlN3tKxD0VK)s4Vqh3Lg$Y<;3K|Jtb zSN4k!j3%@@*hoKOg^rl_%0w~a?qv1oq&I1i3f0lVD8AnUxWM{ZkeDyMf%bc>Xe~TfK$(Qxb1vXa;`jsPO@e>Bp(UpebmbNqz^fp}ecXSu2$K4!Bd_ zl}#ukhGn45jC`RkS?E3In7GL7({mj8`|NB48}CFEd29@4lXEt=x}i_)IE+ox_x+bl z0P?w6*@9gu*{e$e*9(NZ_X9$%2v~%Pn8k6_ars4pt4o2gCee`n;&m^@m@uLsr+eLa zcEoz==4$0n79FwVj?RF`_1FhzJ}9R#gc@Dc#)9FaK(q!@`{3`qXhorhbrq{8e37mT zx3|KPdJd)4eBajw@|ZO(>UNqwqcY3ei^OA&AP{-Rn6A(@X3A&XFZACkOIZJJwg^p6 zT5{GIgnv3SBXoi(zyw0XPpzm(#~{d!l^xyVdf|UNuH%5fQqtkT)^)+G8=2V)(*ktn zlt~Hb%pGp2Dp<%eLw@g8n^x5kS5}pP{JlfRdH1)a^44Z-WKb6Jld5xV!v+Dw=o?36 z>*)E0VoW*xBHGX&ypTftK~sc-&V;c?TU~R_ptQcUB9gNFmkjNe%c2$dqPsjJ2GTEs zs9_qiykt42D07=npAukw4T;DCbuh!cfg;j-MTYL9zWqH@T z!wI!PD0ZoNr-}V*Ecvbk5@o64W|qT3_h0;jrV0N&J{#b6c3uQsK3N1!E=^tpuJSklvWHP+N-K6tE!_(h;ZT@ zRa)*oa8GN;CrRce(m6Em=I?Kb{5mbSFXRtP+P~nDIZDtB7!i4X($2E8a6s{^ft`6p=Ri;a5#WHMyxYN9B6dQWlp-a$EP4l2|d?ks~tJ zxSsA9FJ&i%vYyVNge=S{AQih{Y&LEr*PVK&N^aIKSr{0htN9Rp9%$Nc34PivnZlh8xU((Rb{eGP^W@7pIb^_dvwM+F3q4~4jcfj0sQ}zQ!er#mw++=oZOZ-?yK_%97fv58`Z#9| zce-RCJ^*)LYsZL(l#8mWXQFRJW7uM81+glHyriftui~$bc2Y}?EDG7?A@2fxTF+R^ zWXdGIX$wj_LZ+3q`bM0%2bjE7dPl!$Vf1C3DJStZ?Q}Zsku@%&^g85ftI*DE%q$2E zf>d9`w0C@>#cR}FSCSKn`(AZFF(caJj=k4DUUBxN39V$x{^Y#MkQSOiRX3=bR)?op z7R#UP3cIE}+cizW=5UMKCLWBud*S5DHJ8yU_r3K{^0iZgpALtK?d=y-3c_ag>8Dkj z9Y3YGp`2>yEH#3vv(x}q+;JbfnC8w(_XP`s#8=RBN2}^6(WhF zfgecMI)gxK^*>t2|6?-q0;aK4m`TuLD6!mtC|I6BlW? zI&A5L*}pLK6&aKFZr%ZomU0RQ5D>Ky0&s8kuBk%KNdsh*rV^CNn9lqc1L@2QlNZ`f z(&LO$#W=(G#|o{;d39ILyQ}GI#TH53f~hzIntwCq1=<=FlVh12hT651;oSUC8K=ui zga(qE-T|_!#!<-2=%egWyg@a#sb`&t~$&e@)tO==E6M1tYX<6#XDhDXd*n1Coz`r9yQUOtgc;DtcBfGu;neuFVl2Zr#-|B?BJ6$!{sQ5r8|p^2hBnJ1!iu!$JSW{< zReCu4YTfsLk(!GjM#ijOwBPAl#)pgX|Xah~hYe1(;HlbW0<0H1;t zYC;rgY(cJkKVPdb66#XJaf>9=F?m1Jyw=sk%5;n;!*#nZ_UnawL+5YJW*;OxG$Y5C z;JdfuoD4+oH1+D z;)grel$=|e#AcexTF7LS@&iUZ@l&-m^jNM6eDJu$Ww*1 zddq*k!(SmM_;9T%LUQZ^k|>A)*O*zAX||T`{4aH*$pWg81)%1l9S$kp@X2ht#GZY#RN8?NlqK)0U%e^6cs8^$EXa$Zh&EzOSEbI6Wt@ zf6GI1$b?3)YixqpQs3lB+U#|ZW487mlYIx^YukGqy#uhzYwpWT&9pX%V)#4hd`J9x zRYGc??P)FdI9;}J*BPc;II%4d7G8RbzfBJYV^Z5Ct@D?>(wH|-=e+~a;LfqK!6uPZ z)DdF)hP?L2yvnO>Dg4c~_vhPf76BW?qN~{Q#haG+6P5}dq`GSO?EV6_FefMwvn{`Z_Lz;^F;8rj9_f*<@=)awsKYWQ z2&Op3zB4K#S&zm=jK}y&9dTShf}&m={yf?^v}y^G)(dv7N=~J=jFv_InYX&N4`X6} z@7&zUFlM^F*Z2}vqR&m;w6r$JkgV+5o=gz~C$Sbu z1}i^t8q5z+X2FyQYyzB-!q}_ATc!%t`O#puHUDvXTguq+8ni;6`HY*?uO_GZLxjU! zwCb_)iOaq+Tw4#g;*g8-+U+)|Mm-XD)ERQ2+tSxkpdID!U(p6>MAbEAA@efN&wa6y zT_mAI`ZSy{tyya0D&R{;jv1w|*rQIV2}IxL6Oi_moY1a{U`BfQkxa{G%7E z>`te}{SH`@Z@>6i!3i@Ssf~Wm1WNahCT~$YbIKd5gcmJgWfLt(o6p#i*#?xr zB!};_b3LZy%GP^%*>*>qSW|%YB0arye-#lVG6ukfCjF%Kzz=Z6?)tvpi8b?!6Y&5} z-eWfB{_d0W6-j1Dl72xpPB`=ru-;GVV4ko9s;!UPCFHM8;c#hl-7;z2>C)YqeZF* zockHGYTb13K?)z=_a>FRTJv)@HZVB8EMA&$SW6nwrTHFVTk1<{DgJ6QS~ZDVifD<} zM(K&%a5C+$#4QupH>21S0|z#aIU>-{k+ytx&27Y-2aeha`TV~WqSl=!9`-H@G^<}T%(xR_JJ-4+ zb5PU|2N6bII|9@68%be)D)K!m(#~TksZC2jt2;*ytmDroj|Dl^-9f8$py^4C^$y%Q zl>H(cTIjh0Qu$P#eYoCg|F_?*WMf0a+}2Ad_hNT1Y^;IyZTC`!zo=cvz4r;_fL#_? z@|<)mxo|`COtpnyd+1JXE?_IZTk9h^} zqV-4GSXdA>*t?YQkWlsWGX8q%JTGNh5c|`H}J4 zmI2O#b(3GFC?vE5wLIi%v^NN>TEIPZVNymFy=%m%jtQx8-n%IqYsW2liP3cBHWpeD)W2U8`kD&axi!*AiKGs7XloX7#Pb!h^&5#EUfb zp%X|p>nCvZod#lYsA*R5=(BeHX=BaZUJJ?p?ymcpco<%L?;o7|BATa zU(6BNGA!vQ1wdXAc7Z(-l_SAlG*%OGUm13^=CGMC5=74qX~(uQDSk0gd_Qw=K|)Q6 zpM9m{YT0F;sQGJ5z_8P|Q0+7k+f>fTZ^e25HG=~-5xZfrMQj@3(ah1a3$G>%`eK`s z^i#lQc#m-%3x{Ffw5Va7lfH$)3jKb2Q26Vq!W;y;Ipjf-sggiLMZ72`AX9kr7f>fY z(#&FT=?`EuzH}RKJ)d)b>Pi7QX_T3RPl7+F?Cn|}_Hz*_XtmZH28+H| zP5S|Cu{Nm+SYFV}j-w%o1vFJKUBa7QK!3UMN1@ zAxe8Fgx*jH)ym-VM5T|1T6}W|VTI?SM;Z^FQ-#MBU&<7Lmi55zk@6q$J=-sTNzA=a zrdL?m+(t~8J~s>d)P8*#ztNbqcrA{FzhjN9Y=-=NWIEHq@0dp;0iiAt7!AlXinTv; z*h1cg&F=px%m5n6h7l@;7_3y7Rs~w+B7P*NFg^kv5+abTCAqXVv{wIGUUgq2P9yBl z2$j#E(Ct#bk{JN#$7H4*%yc;7kGEU`Z%*lE_px87HB z@V4I2LU=Z5=L1^Jo)nZE8*`wDkHi9Mhwu7)-C1eNBG*bP7M}-=275uXO0OEJEH(pB zvR;$RBUeY3_jq%X)Q^ba`vnE}TwF-k|LCmD{~eoUlPtQX=?JeS>o_-@s*oqvm{c(Q z3K!{{yyHD+7TGvSSi|Ov)Y=>GyP-%;X~LcFaapALN#eGm4`@2@6ye3R5VawiucL|L zU%CMu;58&1hYsI04zk*klPpH181(&aOX2F0VKJJJ| z!%y#D$iZzEB7+xTd!`}CUy1~MyPFIKMz3t@_Jpl{{{vxuqq}Ku+LN9xRYXWo_aYW% z_A;LoHBH(=pB2k2Z#%HMeFv9u($H?B!cxZ^=ML{=DsqTDkD3W)8tE{=<|K_akHCtm z=?tol_I%EfPuS!p2R$tuSi9f)QqAvBkXX{GHI(9$0@(Au_Y{3(7&HDKxy6sXW9}m3 zafEhsz`jfFacK?}q1D)LZs|FL-Piee@JGx;D&~i9Zl*O`cA0+-k=A0wdB>B%))x#u zZo?2hD^&gb$0?!obp=T`u|yZw6)kPI5-#kn4ehH*1bJ8EdLn7tcL42>TYP!}!NeKr z2rW9S>47c5vAe-<3!O~U;(~WT%hupKfK8H%Y||gZYp-or0dfElaiyEUo6%!Ije8m$ zfYYQiJNcs-c`sJ`Rq^3b+-pn{+nXzzvE?Y z9*Om-BVZ1rXPrIqfxmrOk{Tr2GBtk9q=Kw1gtYp|7oQv&@=H?&{+c$jjRf%>z`IYc z{d=%H^+^j{`=?frwd)$o0>?5I(<_lDld>U2l4>_L$ptGf?Ru1~6kAxL(w~i35?t=& zn31j&iA0Nyxw9Lsrq#69L_0HZrpSxI(^Mk4EodZYXwDM7`fET)JxTprWz`1lRl}E@ z=jg(A{kAQ9JWoFon&Q6%OpGY#T6LB6HS@78)~d;g8QLsby||4>?9Iea6K88xcAr;U|y0({}2lt&6k%cNn*2O*IC`{alD?(?ZGxpM3R^G6fO~jZ$ znFxyfa(K8z(#;i7P|0AYcfbW+WF0$FnuC*s5N4DRhHIt$JW~m)P9N=vFm=z0Z#^*` z8f$Ia>W&$}a_|%JrmL$VZS7Tqy+ZYII>wH2anq9~PxGjd7aJ)c057v>vj2WMZErY` znK0*?3*EzIlXj1Jau`kaiQtvn?YGodf>ej?aX&jh{5&2>$-_UdB1Teg7rwwO>CHbw zcR-4$ADw|cy^5|zJAV!zL?1eKYMb_^RCTm_CEyak&8n{*Lo#2sj9V113i4go)ndO8 zq(08#7KEC3&?Zwqm(4|7yWBCEz{56lfut)QZP;(hbyaO+it6-{w&ML9ZKJsnrd~@S zr0Xas;`${fl{m0+7(Bf2Gd`5!Unkm2au-Z2cg@@hvvBWw9Ow1%zMGQO@P2olxy5(o z_?hrvwd55q!Rkk|RQimodr|&YsSYChsBT(&2kdyk(iAHAa5kezp}TS2RtEUN@^ zkjCza_=-%~0C%(=bDA%&@RHYLt1>aqL9bjSzMc~&&%dshD(t3vx)36NalPoh&JpJb zbs3vrM;k6=A*M~OZ-6~DlgBSw(izR%uL**qUI5-a&$j3?0TyU+Pz1G|1&i=KlE2Zt zU~o8CYt0@}`LLbLNVQma)zSWtLxQWXgFwD~*c1c8+PI`7EN{ui@#O7RFc)r%?rW-a z)=c??vfjco^F!*YyVzH}iRa~1mK53Ytyk}W*+R_@Q-lHGU!j5=N^>luhau{E3>JX@+}v#BYy;QwnVCfASTNVT+R zg_ZvNQ;MieI{%A-NiFyiknMM@Bb7OEj^VETBjFto@(#$4aZx|iEj`dMwsiAhJ053F zk(f47Wc&RN00HQDDTi3Rv~oKQbkn9V%A`JYJBv;i?%qJEyo<_3xd>>Kte*DNyd@QoTziJ>0NTMf^1A_cc5x-c|dQxwxd+1_k^XnghR2L+5R`V3c3ak$09<%xz^G!o8m zRyZqa+O2^psIKlg)*+Kty?2nHAZ}S>5kA)kC|vMchGT0GNj_4R{6%r%%pURuMkMGh zYa#*HfM~K=4_q?kJxOayC_yYWEB3`g1DQ{EjGn3VstO%3%p__3^EG?7RY7Fk(ZoE1 zHqn!_nfzza)vhqoS+6?z-d3dr5HXVlzpQcI_#t9(eEhTNtNyJ&Jv;|JT+=}9R*crH zGiq20klP@mXx_b-YRZF1sD3v70<8vev8CeKGZGPNg`a1koiPOY2{9n=Ri?paE+=V+ ztcW!c_(vA%#n!amG>kdU`k?LTu^h!SXE7E7PdvlUw_SMCcDCndmUK?A@G~ukZEHqE z2I)ug>Hl)N0+G$!`H>n%6b=GJhQi(I;Uv<9U>;quszo5@h;`W>!opRgSvrJW;`JMO zxgWpHFg>5}gx_B62n(TEJOg$0ckaP>V~?L#_*01ednvm?dAH2Rd7Fi~cYnZR*RQ#Or6Z430n zFZZWglqZWOA}}!1@Ra)sf4XQf)@2CM@+x!y3N9$D!i?J*C9N&PFWrJmgdmOf=0K_8ayb7BskdZe8eeoub< zoxRwF3>#PxM2maFDy&5g$;^>Go`m{fV_mfx8yX8{>AO#np!nTzD&PLo07_>zf?AJ4 zB$pzjF-XBBD~`Np2C7j@cjqNv-)2i75v(dmzmphD4*a;KYJBEm)x4aS2YW|J`q4RBPY^GB!B4-?#HzE91nM#oA8x4AHS+51OWnj;-M$`^9}zA&0?ad9k6$8g}KK zyu#*ap3FmXUMf`-D`GmD?fDVJvb(tTC|f|6mW>_B>ww44xFKm7e-7cjLF0idJc4%9 zV{1EkC8uklss5|%2{E;pcZcXx@oA?hsmV-H7M7+GSk`o(ZM|$BL$e|SucogZi%dHW zy%ENFZ1+`eY<@soYtiMVaVYU`?ImO#8{eYiI0K1&bY4(s1+YD6%y6r)b}PH+uF#pT zyApf*^xlFrn;<(_ZX!nB(xM-o$H^B{zdv?-6NV0Hc=g$=W0hW)nrbXRQolYLaCsp8 zAeS~Av^ayRkM*MQu%+mAwB{X_!REscX&R<0m3C#k35Q_tg-Y{&h?rYPCgdm!E`8uv z+SPMe+WObJ!a(mQH*L`%3yYSi?*k1872Ky0ka36vD6V_hgz4V5U5boL3(RA#9WhzJ ziP~pSv46AW=x~CNaPZ11xvr;LHTjN>1j{?XS;Q2i=13k!ep(rG6gKU)n?jfF7+V6m zB5r!XcgGu$V;PdQi?hd%wpID zrF~75xQ^tn!Q4gkcr-bb96y=KmCUwQFu^Sv|bU3@abQ{M7%XS;gy1`|NHVG>03yjQt(lFox~Uv>xETqDt{N5x z7W@BQt)r$kErN{&BeKoNv#5@V_uFsd^oCECiq^H9LYN2!Y6zG700p!A472Tos#&9sqAF-M!Ty{Dv9pl=7(b zX9)64$IdNK5u(zFJ(Rq;eo!58mk1{r#))#5ar;0i@6{Rutwqhd!cXO8xm_UXrM5oG zrw^(R3goIlOj*b(Czb!Xm5Ir^;L`zV2>eddh*nd01=xwRu7-dDZtkcW!MRz%nTn;q zY7O^$UU5^UTFse$uC`R?enr&VoSRQbkifH}Q7l6S4k)8zfZibM8~n}cfB_;_ zQe%F&o59L*j8A+owCUW}s0!-Hhb`+Vyx-e%!XoB_x~eO_O#ayZt$WAR^67qVONXe7 zfz6R@*zmFJ6A?jLg(4U&2%O97ISblQ*hI~n%=~N{o9q*1B1rIZ^hz6Z9q^#Xw-yZ>&Qb@RKUF?SX8HwgWm=>Daq z=y8TbYKODGW6C(qCe(ci{uwNfy8AntKbHyW)mv1-dXdNX*@`YM9Ice@jYaKo<3C(=@0ot3K!JB6F*0IKgGddH^2vjaZ^d(qO+`<&s-26Kd5ZR?g1be$iWhi_7&fgaLxzN6`0GZ#QTTx~~OB2rsK z(Az-}OG7TzsnqBvX5Vjm$47Sw0Fq5Bt5hl@=*7-Jzk36X1O2no&5J=T2Q4 zWF5^M^MT&p18Na!Bre~%uN1y_`&SW81C6D5_npkzM^(j0IZwxeu@-d)jHx# z2MQ)4^cUfpUAh!GbKm~K)WAS^{$q-Bmah=x2^#$QD!_{^?It>8gQTHJj{=$+_A;1Z z6>fhJ{*STIw0LZS0U^RZn&&c%Mz~?Uv7(K*E`V$q*&BhfzUe56nWVIR)F+hU<;!?A zcN$+ki=Gh*lRZxj1=vp>C0(1Q_o_$G)^sC5)(NX;-EkhPl?-czG4y!867;yxh+~O8 z>rZus9_Opzwkl$sEl#8=9x=x&@htdqB2-v;lx#rSH}vizf$E=f|_7th6|S!=x$ zN@I`n8bw4LJ6W+_@3D?jxUapL;~sZd0_}OeyV`2xWAjW7@Gv(U&i-U#jUS4EO%0SO z9+07g=EnB7$+i`xR=la5vXLS>_k_AvqvFafi|TaZVm|Vfem?%OIjl9-GjN!T&JL3! z-*j2cA;^+hFAec3P1w32_G{s;V~xNh?d~I24!>_pjZ8=-$-Yu=r&i5c!H6tjZ2Ije z8%51P>A*fnkqfo6vkmq_g6ljaJZgDI>tnDu?Spi|6+a`c5S z%L>o61&e3P>A1GUo8Eru@_1yoHJd+0;syzzl=_x`JXrtD4A7iHNS=9*|hl#rsijRV%idPf712ebY?hbPd_oeeNjRJa9tx z-Pp8$@DjU7!-SCjqE+LD-n!d2XCl%=lLCH)^?WgV5@BeK$$IQ5t$*9}9iWUIAe}-% za;~#VC8@sv@n;@}E+?vm`?RVN6w*7mDu0vRjQ%$g-;d+@T6%SyToJKZ;OAf}ZTI z2AdRFpiich(wi$FB(Jj}8iJLDEc+6~7$S!I;`^R$OB@yi&^J-|qA#>n!=49%L>Ahb z8zxcl^JvszI_^7k7RdH{0uetWlC;)3S>mOC%U!_@r@q3$w?4%jbQ+@}4?**!ng%>- z?mMd&C~XgL*}#m(UlA9*v448olkgkGDG|Os06U22%5%Cn-Zy)jtZVx+Q$lS6 zJ}i5*i96w=x%!Z6-O>{pV+!DS|L(92PcF*JOe@~Zfmjp*VAyxX(cFK!Xxp3C+NlhY z*Hnn`^0l}R)L(iUhsc<5`JjG;t884T8uug9FeaNp9dDVXARxO50pwSlTS0sh&5wr& zMw4k?rNIvj+9z2x2sCFzSjsLMw4TyUKhYF5Hkt~@R-LkeO(DyBAQ8d~U*T*2{yl*{ z?7TBaV~*rNM?XOs{M&SJ$gOW6PG8eC!x|@y;W`K5w@{=1s*_(Xb$Or+B4yRmDH!xf z7v`|3h7m|&yq>@W@sXYV^ON}rl13eY9f2OMuC>sS+L~p{6WB4uvg=v|^%b9BmW4=d z&LDCgLqbCSKPniNC7ez_W1E^o?%w8}|BL$ByzhcL--+#Da6Jb~d~C;PM$aC}km3Y* zmdcsu?1esIou;9)R|~9@qf5s#w|qPe7vPwyf0dVwaN68*AB(1)j@zS#HgrnN2GX(_ z>mVtq{JFk0#~NM5r_4-Qtg*)=8P>0&->D@*bwd6IlCSrj5a2~^B2TRmqUUNmdSS|7>1C_U@7Wk z4?*195li%dUu#|t+hm{FoqJmv_mSB<#fz~^<+j@hiln+gQD3kyW2V~tWWrcmRTw@k ze81rCa5hU%mrV!3%ghS>*HkqZ-m7}!TZ>mZ!hl;F1PFgq9%l!;ngPe*+`b%Te#ng4 zG|03mOz^2gx09uoS*-2FIOHU8RHq+!*x^xaw0N&VG~3o2QkIKHl_>4Fs7)cjF!CFg z+G%8NKcL+w(zv+azL8h;uYMhFoq(^|@Cwd?uU0Hd5?VM?0H=YErxN z|8d`8*Uje=sPN`|I#!x%Xi_**WcA>4mxiuvmm@Gj=}HZGHaq<(T;`g1H4E4%`J=o} zoG&&(oL@auY^H<6E`gt4+Qjn9oNh=HNBVOl-4V-`xEYRAviwJZP(zUSiDs?ww%N8+ z+~x8kU`!0+hJ;`tpW}BleFEeuXDL3DfZ&;J5nmHjDY=M#bO}9dP%3Se8l!t=0DD=~ z@|9L8c-0h6i4o1e-qBR1z6Tp!_?K`qV;{{5_irv*e?B@AVu70t-6x0G@JTuiuPyns z9diCBN2peMk;~$J#~b{C4SDlQ+sYDwMJnCF$O!63`^_@&oq?ezJrc~Lb{t&kHAW#t2H~65qC&MdTpdH;;eXsUjsBbd@A?iQ#nfDIlCh{ z9n7JvtyLtY*Dlud#g3j^8jcnOMZeqM5`gpx362bv_g0pEYou451G4C!r?nyg88@%* zfYv0()lF6UI-hUt!&B5Zf>^)SyrcBH@CxF4e)|CKs);ZMpcC6h-T~E|7qb3eE>qt` zBS}O*Vn>1hU9l>U}A>qq`JW#Cr{_=K! z{dvXyrZZk#kjy`h$d*0rY&u^8IJtNv`r7l1B zY)3cRPZ1Lz$H42e6TKLJj~{WzjrR1oUL;IhhM3zK+4*2`HPc(jvQD+KG#v~pFi8<` zh%*00DyD)qW-P!w930s4xpsA`6sF0awykX^G4aQ~tSEIfKnOMKsw=vL#e^xyIyR9N zn;>p|tiq2txeLnlflxfDhO(h{YGCIbuuyMy_Iad^14r0XxQNZFv7Po`>{k-ogtsOtLdP{~#qd;q2ld8J(BZeY@F|){J zt!+a79_T@p3O9i!MMW-wn{n_`^3w{xOhK}5s+;uAz(BxQ?w)*MH`19c7e=?OJbRH| zDefW8P}!%3%6;~FPk=9!Bz>=Q=N5?E)21kA2IF_Bdb0Kop%h9dhj#m7_Qefh*ROyY zW%ig;z~aRH&UrOx70u{R1kJ!y#IJVbN&~tk6GlVNeu{G|Opxkj+4s?P+jWVWTz)b_ zekmP9CHpxaez-gK7gmID`X)8Ap|oal3lLIi zuRVqNt>`J#*(cG1m4h5D{T72UwMC~PEsv^kf>^`B{oq)6g+|^CXPZ*+ptE&p6_x(6 z7TBf1Vcf28rzuI#)xP1+oX!L66G971_;fv?^q$Hg>fhkOPy|MVa_JyrmEM%rh?F#` zayXn#9GzNI&iXTZFDERqk;ZyplVNy+tp`mxl;gvvDO!3aGBn@K@20b>8sWWIyQfnlXA$_w?(ZfOxAi2C1mcQpv6hJSorH{J!}; znXpfqu^Id&9Xu>c>0~>9UxO;;{9Cf*jNCpaFv=|w+uD?adUp)6-4`ZTQ&x;mXyD`OE1o88mRRxF}xlfSR*J`%PQ%;`~`j>tWaY^?*HeMSd&hvO)Nuf!15|{U`=?e}8sC1UsFmz0$ z99vsm`4x89H3}*+i(@O#T3zKd5 zeX3vacI~N_Y!vEDUzI;j0!uv6;FJ~SD}%i+4(2Z9#IDMO`;vxju1@k|GO$iDx6>C3 z%sZ5*lDa9k074`P$1}$4E)h6kVlu-XV^8JczmZR*br0IL@vf1I9XR$s0(D5c6FH`{ za2@FBi$`uqUd!bUEC~%2p_Id1qfiw`l=<{mie;uyGyC)r zgz>{cj;9Gx)xn5S7A6zzK;iC-h z8^__^$Wzrg^irEDtFCD&>7ki^9n{uDoNi=%e0D6XYzyu+O>~kYk}zets3i*K0DrLj zYId_ff@a-z6u&gfCsd;L=)V;VzP_o&79WpZgu$M36Z1})NKRKMW>QX#GK3%EKdZS+ zse6_kB_bhxvK&N!;79EINM1KKN>=#aXy&|* zGR>QCQb>*U5eM0vNJMR{LO}oC(>oI}J>9pR0_8OOWk-1w3+KzfO(G1uc73P$@id~& z#RBlT#|HZ|T~*6MY61Am+EH(-g*Hx3`dnreIqYzk{?^hf<;wcd&W zVKlvPG^`?lwv+9JweaGs!JW%4lt)XNvuo$%tO8th!lg39VbgMO7G4jA8gQ!J-Y@*C+qP2e0!g|-xsG^GMTHqQaoFv}1YY!u)(|tVI%JtYYLM#^=O; zrEv2(%!YE`p^*~$YIq43;#1>ROj8p(8!TKz{{W#aj)Ql?-)%BB><|{g2>u)G zW6Se>l-&6X91QL7fK9rQz*2pvBYKlC^92K5H*Y(A=7HH@+#^M>iZV$Y^csH}9f?F7 zS;v_85Bz9nX&lC*$TcMM{{TVGk?#G%JS1gjw6bup_(i_!(&9|jlRXsgUBzM>5cx)g z^WD%^Tv)SaWGwkAVv04gN5^nIYG94Bq>g#U)r@|eWNEL=Z_b@p-{edFYT@+y&ZDNf z8i51Y0kr_Jr%($3I8re&ODNQEwK#{b8u5KSvzqNE3x!FpH;#Hyy8JaKfUL=HMiP8A zJcU%#Aa+aLmr@5R;qnIOi5k)-g@(IN^%a|YH;v^4em*~&^Ho#lUCy4h)8B0Z89=agL>ufn${%g#2Je^GD-qUzF8x`18yr<#Jh?mwK}lyv81K# z(MnrrU~gja>BFsC9zSu%zoRL0VeyOF{XNvR_TS~8>)WBP1;RFoSs^gQl4inl8n`(X>d$`sl!WDH5WtslwyO0l#clk9jfT0tcW-jAbed#QI&_A-8;T4*=}Hl1ocE< zd?mgW_MUwz$j9yN2nG}8Ha}s9Vuxu#9$O}UFOpr2Bd?`j)R%3-GUsa-!H2+Lf&Vwxwe5( zY;3d|@#d+=l44Dik-Fc6aiu$Iy|C6sEX=axJ03S<<>!S??E;ZQP{^%#?-g@tt5uAEN_;9AlinrZB)iMK+YE5fMq{{Xo$+I*ZW zUIQ*`JWC8_hbJ6UE4C7{AnvA+vO6j(flgxh&?u7 zq}&j1@1W7iXr3Z&EWTyw&X&NNX)0UKlCummd7215op5(3G%08im2Z~t&lTrJYIUp&R znj~rIjdTpadA{oNxDjXP_o_F^@A0lZlc+nk{2uEF@EJFt0ZM z04qPJ>#q6Xr5Gz>M!hd{O>eLk*R3j}Paxx0E9^T+*PW}K)?VA2S5ipff{qQS>+Gt- z6`8?*Fyfv7DisK0n6i)VR$XaqzU6@gFC*nHLP!4qDjm{a^EJXZI~zCrn^v)qqt$B@RJr+3RXLI#nk>*Gq`;IGQ&dF)a#||M;aE~HYLv>D~8)Iw}}~0!iuWO z0NwE+I{W>U(&NV5wvu#F%Hs5|bd_GwMw=W0$o#^OivH@Dv!uuthzQVVNb6w7Q&vtH zygiK+QC`=WQAHF56j4D0)pJU*MAEmyfU)-r+PgK8-t$C5(>kJgju+rSzlC}cG7)jY=KkuD zYTW^@WZ+HhZax&WlCYF2o;J6$i8V4gk{~y2^_t3g?f$h;Vn?Kt9SqHXU>qqyG_gp` zVtvxF{W#+#c7tuqZL1p6W!!~9+tAW8`i3x)#?umRj}?_y`C?Q3z>@T;4zS^)Ulo#vq zY{zr%O}Eo%7u{pdn8g6gklkDla8Xp{pZ>=LSZ=$M*4t^QR^F#l=lEKJV;VOwSkyp{ zskMfp_V!;&>NRCRr{WxK!;N*V{3tQ|&Iq3k<5E`IspoO1x4yFbW@BZ>VVo7pg?7xR z@vfi3y*%-$UpEdPZFs)pD)z4L9!1X5cH~^~jr0%hpxBlrng@ZjG7EbTFTSkA1>hUG zjYp3IQ|W^y_46ZYq;w*xNj&)wgJPa?{{Skhbv=4hAx`Om9&S94`kNO(>~&O69<9(< zn#}ZJNbzt+)Ju{0osOQPlg9r5b!qo5<@E#7fPoSpm*;Poo_clrD=iV{W*rU7cz7O^ zCcatHDfI%Wyvbp^<+%B4a~?(R&<)H-aK`vS(X`}x@Y0lcQ4pvbn#ShZd+RP6Z{U6CO=Ex6cKSm@HY z+;wB-Z|O@#9Fku@-8l1FoLZWRNTCQg0RVf2XHxXQ| z%Hi2-3gO1#$K63U9yQW}0kueAoY*NX{Y|9uEH9_NxNhGEq+u$)n+r17Z6nwPH8CI( z8poH7R0~QyG$zOVjt|@`bKCP%j-F-z0Bz!9$n3ccn8M`gsPIeI6Rs?1Gu+-7m-OQr z7Ga{_#M9mX0J)9nh>LXiZU+I(n#b3;<^TXpJWV~WKI2}UGwbiQV&kkV!im~e%a{kq zkb+onQPbN`q(EOw5^hIRL@^JQY!3nLrz6J!hV4Mnfa+_W`{w1Xb#(wzEI9P=r?G%l zGLyAHJ8jI0O%I}yG2+C9CxwMo6uzP;Q*T$`2chF!^D~y(2Q@sw8ixCq)G8e0x{vCJbjfesAdr;+Nd`$<#231%HqY?7AE8_(QVcTOIDHZ zsG^GZJmQKdpeUk>4o@2LJ$EUKfdzyy8kb!jxw@#q&pnoaf>ad;=9oRjuriFOZ$Os2<7do41 zS*YQkw-5;03g1p4HLXS$1a+VRQgo>lt|8oH>b62WMKUxL98AGh=iTkE75mQ*)W?e? zf~8KzBU`KW`zzTu(hcs$+hRfg05OjsDc~j9`;^jl_^_g3 zCQ6{Zw(>_B@h$m)76X~8`<8kt{WJ}>5$2F{XZ%cmmnyj=?R~2l!yTL_nDS}lBjbL9 zO$B7ZhmqYfi!lL7)ww9-1!pZ_vMbC>ua+=)a3~swxAR!~TxjZ=5zE^CHIAe+x z2?S?SK4bZ-FC>`Nh3rm(+^tOVVb^+dCTK9KrZhHESBnAhZd&v2W|7!vj@lk}9VzMZ zSSG>+$=uQ(iK{)9M{@IcI)y6UxV=THT9P1~%_XK;VD||q3wQEgo+j`F(rQ&3cZ1c*i z0%Lu+c^*Lgpg z)J=8IDv~CR#E1YSaceHLr*UZsOnB|(u{|{5df}UE zr-IW+^RR>)D%*MGtxPg)-6;W8E+fAIVXxa#u>Szkz4Y}O+qspsQ8E<;T<%ojqlZy? z-0uwLpk@)gYIWV>PY^xT-Y=FnmS3LxiR)FzyrMFTNjb3g6LQ~WGdTSt8012awynf4 zrx{uIGi$!&-;J+bB*>;)k_!-^sK3H5%CC+#5d~p(*Ix?lA(kK+Y(e;gXiwQogv0;Y Dd;~W| literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index 53aa17fcf..9726d5b33 100644 --- a/docs/index.html +++ b/docs/index.html @@ -111,22 +111,24 @@
- Preview + Preview
- - - - - - - - - - - - + + + + + + + + + + + + + +
-

500 幅动画图解、12 种编程语言代码、3000 条社区问答,助你快速入门数据结构与算法

+

500 幅动画图解、14 种编程语言代码、3000 条社区问答,助你快速入门数据结构与算法

@@ -284,6 +286,14 @@
Zig, Rust
+
Reviewer: Gonglja @@ -347,7 +357,7 @@

贡献者

-

本书在开源社区 140 多位贡献者的共同努力下不断完善,感谢他们付出的时间与精力!

+

本书在开源社区一百多位贡献者的共同努力下不断完善,感谢他们付出的时间与精力!

Contributors diff --git a/docs/index.md b/docs/index.md index 402b9b2af..14fa0271f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,9 +1,5 @@ ---- -comments: false -glightbox: false -hide: - - footer - - toc - - edit - - navigation ---- +# Hello 算法 + +动画图解、一键运行的数据结构与算法教程 + +[开始阅读](chapter_hello_algo/) diff --git a/en/README.md b/en/README.md index 342255564..fb59c81af 100644 --- a/en/README.md +++ b/en/README.md @@ -6,7 +6,7 @@

hello-algo-typing-svg
- Data Structures and Algorithms Crash Course with Animated Illustrations and Off-the-Shelf Code + Data structures and algorithms crash course with animated illustrations and off-the-shelf code

@@ -57,13 +57,13 @@ If you find this book helpful, please give it a Star :star: to support us, thank > "An easy-to-understand book on data structures and algorithms, which guides readers to learn by minds-on and hands-on. Strongly recommended for algorithm beginners!" > -> **—— Junhui Deng, Professor of Computer Science, Tsinghua University** +> **—— Junhui Deng, Professor, Department of computer science and technology, Tsinghua University** > "If I had 'Hello Algo' when I was learning data structures and algorithms, it would have been 10 times easier!" > > **—— Mu Li, Senior Principal Scientist, Amazon** -## Contribution +## Contributing > [!Important] > diff --git a/en/docs/index.html b/en/docs/index.html new file mode 100644 index 000000000..9e72ce177 --- /dev/null +++ b/en/docs/index.html @@ -0,0 +1,367 @@ + +

+ + + + + +
+ +
+

+ Data structures and algorithms crash course with animated illustrations and off-the-shelf code +

+ + + + + Dive in + + + + + + + GitHub + +
+ +
+ + + +
+
+
+ + +
+
+ Preview +
+ + + + + + + + + + + + + + +
+

500 animated illustrations, 14 programming languages, and 3000 community Q&As to help you quickly get started with data structures and algorithms

+
+
+ + +
+ +
+ + +
+
+

Endorsements

+
+
+

“An easy-to-understand book on data structures and algorithms, which guides readers to learn by minds-on and hands-on. Strongly recommended for algorithm beginners!”

+

—— Junhui Deng, Professor, Department of computer science and technology, Tsinghua University

+
+
+

“If I had 'Hello Algo' when I was learning data structures and algorithms, it would have been 10 times easier!”

+

—— Mu Li, Senior principal scientist, Amazon

+
+
+
+
+ + +
+
+
+
+
+
+ + + +

Animated illustrations

+
+

It's crafted for ease of understanding, ensuring a smooth learning journey.

+

"A picture is worth a thousand words."

+
+
+ Animation example +
+ +
+ Running code example +
+
+
+ + + +

Off-the-shelf code

+
+

Featuring multiple programming languages, all runnable with a single click.

+

"Talk is cheap. Show me the code."

+
+
+
+ +
+
+
+
+ + + +

Learning together

+
+

Welcome discussions and questions with open arms.

+

"Learning by teaching."

+
+
+ Comments example +
+ +
+
+ + +
+
+ + + + + + + +
+

Contributors

+

This book has been enhanced through the collaborative efforts of more than 100 contributors. Thanks for their invaluable time and input!

+ + Contributors + +
+
+
\ No newline at end of file diff --git a/en/docs/index.md b/en/docs/index.md index d1195ac22..59eb61d7a 100644 --- a/en/docs/index.md +++ b/en/docs/index.md @@ -1,156 +1,5 @@ ---- -comments: true -glightbox: false -hide: - - footer - - toc - - edit ---- +# Hello Algo -
- -
+Data structures and algorithms crash course with animated illustrations and off-the-shelf code -

Hello Algo

- -

Data Structures and Algorithms Crash Course with Animated Illustrations and Off-the-Shelf Code

- -

- - GitHub repo stars - -   - - GitHub all releases - -   - - GitHub contributors - -

- -

- - - Dive In - - - - Clone Repo - - - - Get PDF - -

- -
-

The English version is brewing...

-

Feel free to engage in Chinese-to-English translation and pull request review! For guidelines, please see #914.

-
- -
-
-

Quote

-

"An easy-to-understand book on data structures and algorithms, which guides readers to learn by minds-on and hands-on. Strongly recommended for algorithm beginners!"

-

—— Junhui Deng, Professor of Computer Science, Tsinghua University

-
-
-

Quote

-

"If I had 'Hello Algo' when I was learning data structures and algorithms, it would have been 10 times easier!"

-

—— Mu Li, Senior Principal Scientist, Amazon

-
-
- ---- - -
-
-
-

Animated illustrations

- -
-

Easy to understand
Smooth learning curve

-
- -
- -
-

"A picture is worth a thousand words."

-
- -
- -
-
-

Off-the-Shelf Code

- -
-

Multi programming languages
Run with one click

-
-
- -
-

"Talk is cheap. Show me the code."

-
- -
-
-
-

Learning Together

- -
-

Discussion and questions welcome
Readers progress together

-
- -
- -
-

"Learning by teaching."

-
- ---- - -

Preface

- -Two years ago, I shared the "Sword Offer" series of problem solutions on LeetCode, which received much love and support from many students. During my interactions with readers, the most common question I encountered was "How to get started with algorithms." Gradually, I developed a deep interest in this question. - -Blindly solving problems seems to be the most popular method, being simple, direct, and effective. However, problem-solving is like playing a "Minesweeper" game, where students with strong self-learning abilities can successfully clear the mines one by one, but those with insufficient foundations may end up bruised from explosions, retreating step by step in frustration. Thoroughly reading textbooks is also common, but for students aiming for job applications, the energy consumed by graduation, resume submissions, and preparing for written tests and interviews makes tackling thick books a daunting challenge. - -If you are facing similar troubles, then you are lucky to have found this book. This book is my answer to this question, not necessarily the best solution, but at least an active attempt. Although this book won't directly land you an Offer, it will guide you through the "knowledge map" of data structures and algorithms, help you understand the shape, size, and distribution of different "mines," and equip you with various "demining methods." With these skills, I believe you can more comfortably solve problems and read literature, gradually building a complete knowledge system. - -I deeply agree with Professor Feynman's saying: "Knowledge isn't free. You have to pay attention." In this sense, this book is not entirely "free." To not disappoint the precious "attention" you pay to this book, I will do my utmost, investing the greatest "attention" to complete the creation of this book. - -

Author

- -Yudong Jin([krahets](https://leetcode.cn/u/jyd/)), Senior Algorithm Engineer in a top tech company, Master's degree from Shanghai Jiao Tong University. The highest-read blogger across the entire LeetCode, his published ["Illustration of Algorithm Data Structures"](https://leetcode.cn/leetbook/detail/illustration-of-algorithm/) has been subscribed to by over 300k. - ---- - -

Contribution

- -This book is continuously improved with the joint efforts of many contributors from the open-source community. Thanks to each writer who invested their time and energy, listed in the order generated by GitHub: - -

- - - -

- -The code review work for this book was completed by codingonion, Gonglja, gvenusleo, hpstory, justin‐tse, krahets, night-cruise, nuomi1, and Reanon (listed in alphabetical order). Thanks to them for their time and effort, ensuring the standardization and uniformity of the code in various languages. - -
- - - - - - - - - - - - -
codingonion
codingonion

Rust, Zig
Gonglja
Gonglja

C, C++
gvenusleo
gvenusleo

Dart
hpstory
hpstory

C#
justin-tse
justin-tse

JS, TS
krahets
krahets

Java, Python
night-cruise
night-cruise

Rust
nuomi1
nuomi1

Swift
Reanon
Reanon

Go, C
-
+[Dive in](chapter_hello_algo/) diff --git a/en/mkdocs.yml b/en/mkdocs.yml index c5603bbec..03a645e2d 100644 --- a/en/mkdocs.yml +++ b/en/mkdocs.yml @@ -64,7 +64,7 @@ nav: # [icon: material/shape-outline] - chapter_data_structure/index.md - 3.1 Classification of data structures: chapter_data_structure/classification_of_data_structure.md - - 3.2 Fundamental data types: chapter_data_structure/basic_data_types.md + - 3.2 Basic data types: chapter_data_structure/basic_data_types.md - 3.3 Number encoding *: chapter_data_structure/number_encoding.md - 3.4 Character encoding *: chapter_data_structure/character_encoding.md - 3.5 Summary: chapter_data_structure/summary.md @@ -93,25 +93,25 @@ nav: - Chapter 7. Tree: # [icon: material/graph-outline] - chapter_tree/index.md - - 7.1 Binary Tree: chapter_tree/binary_tree.md - - 7.2 Binary Tree Traversal: chapter_tree/binary_tree_traversal.md - - 7.3 Array Representation of Tree: chapter_tree/array_representation_of_tree.md - - 7.4 Binary Search Tree: chapter_tree/binary_search_tree.md - - 7.5 AVL Tree *: chapter_tree/avl_tree.md + - 7.1 Binary tree: chapter_tree/binary_tree.md + - 7.2 Binary tree Traversal: chapter_tree/binary_tree_traversal.md + - 7.3 Array Representation of tree: chapter_tree/array_representation_of_tree.md + - 7.4 Binary Search tree: chapter_tree/binary_search_tree.md + - 7.5 AVL tree *: chapter_tree/avl_tree.md - 7.6 Summary: chapter_tree/summary.md - Chapter 8. Heap: # [icon: material/family-tree] - chapter_heap/index.md - 8.1 Heap: chapter_heap/heap.md - - 8.2 Building a Heap: chapter_heap/build_heap.md - - 8.3 Top-k Problem: chapter_heap/top_k.md + - 8.2 Building a heap: chapter_heap/build_heap.md + - 8.3 Top-k problem: chapter_heap/top_k.md - 8.4 Summary: chapter_heap/summary.md - Chapter 9. Graph: # [icon: material/graphql] - chapter_graph/index.md - 9.1 Graph: chapter_graph/graph.md - - 9.2 Basic Graph Operations: chapter_graph/graph_operations.md - - 9.3 Graph Traversal: chapter_graph/graph_traversal.md + - 9.2 Basic graph operations: chapter_graph/graph_operations.md + - 9.3 Graph traversal: chapter_graph/graph_traversal.md - 9.4 Summary: chapter_graph/summary.md # - Chapter 10. Searching: # # [icon: material/text-search] diff --git a/overrides/main.html b/overrides/main.html index 4e2c3a831..34d38843e 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -6,7 +6,7 @@ {% elif config.theme.language == 'zh-Hant' %} {% set announcements = '紙質書(簡體中文版)已發行,詳情請見這裡' %} {% elif config.theme.language == 'en' %} - {% set announcements = 'The paper book (Chinese version) published. Please visit this link for more details.' %} + {% set announcements = 'Feel free to engage in Chinese-to-English translation and pull request review! Please visit #914 for details.' %} {% endif %}