From c142c5c72b959f7794608efa229c3b080fb80f0b Mon Sep 17 00:00:00 2001 From: Federico Claudi Date: Sun, 5 Feb 2023 19:10:19 -0500 Subject: [PATCH] v2.0 roadmap (#174) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * init * Pulling Abstract Trees into 2.0 (#198) * CompatHelper: add new compat entry for WordTokenizers at version 0.5, (keep existing compat) (#171) Co-authored-by: CompatHelper Julia * Stack traces (#179) * styling * now excludes other installed packages + fmt and tests * small improvements ot hidden frames * format and docs * small fixes * fmt * kwarg func call fmt * show each error line code * covergage * stacktrace formatting * traces rendering improvements * test fix * new text reshaping function from chatgpt * fixed tests * cleanup * cleanup * bump * bump * bump * prompt init * small fixes to repr and error * fixed small repr bugs * removed deps * wip errors * method error kwargs call * parsed kwargs calls in stackrace * fixes * method error edge cases * bump * bump * bump * fixed textlen bug for orphaned tags * Update Project.toml * Update Project.toml * errors with no backtrace are now shown * logger doesn't cut msgs * CI fix * error msg panel now always shows * reworked logs rendering code * msg reshaping * refactored stacktrace code + further logs improvements * fixed bug with markdown rendering * Link renderable development (#180) * bump * bump * working on making Link work * functional link? * fixing them errors * fixed behavior of hidden frames in stacktrace and docs * fixed bugs * bugs fixed and more test * bugfix * tests fix * tests fixing * tests fix * tests fix * Fix #181 (#182) * small fixes * bump * `Prompt` (#175) * prompt init * small fixes to repr and error * fixed small repr bugs * removed deps * wip errors * bump * bump * bump * bump * prompt wip * bump * prompt almost finished * added tests and docs for prompt * bump * coverage and CI * docs fix * Update _error_messages.jl * Annotations (#185) * init * more extensive precompilation * small fixes for error IO * 204 method invalidation at startup ops * bump * working on annotation * added style * bump * disabled precompilation * new code reshaping function * new annotation system * tests for annotations passing * fmt * more tests * bump * bump * ci fix * bump Co-authored-by: Federico Claudi * Create Invalidations.yml * Create unused_dependencies.yml * Update Invalidations.yml * Update Invalidations.yml * Update CI.yml * Update CI.yml * Coverage - adding more tests (#186) * increasing test coverage * fixed bug with markup tags including newline * test coverage * bump * bump * bump * bump * bump * CI fix * CI fix * CI fix * CI fix * bump * Update CI.yml * bump * refactored tree * CI fix * docs * Update unused_dependencies.yml * ci fix * Update Invalidations.yml * removed fillin(segments) * Update CI.yml * fmt * bump * removed error message functionality, using base * bump * fix_markup_across_lines (#188) * fix_markup_across_lines * tests passing * fixed small things * bump * wip for fix_ansi_across_lines * fixed nested style tags * reshaping with ANSI and markup works well * fmt * bump * bump * bump * removed unused funcs * docstring * small fixes * bump * Update CI.yml * Working on pre-compilation (#173) * init * more extensive precompilation * small fixes for error IO * 204 method invalidation at startup ops * bump * cleaned up precompilation * removed deps * bump Co-authored-by: Federico Claudi * CompatHelper: add new compat entry for AbstractTrees at version 0.4, (keep existing compat) (#189) Co-authored-by: CompatHelper Julia * bump * no stdout in precomp (#191) * no stdout in precomp * ignore precompilation code in coverage * finished re-factoring tree * CI fix --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: CompatHelper Julia Co-authored-by: Rémi Vezy Co-authored-by: Federico Claudi * Live (#199) * Live first push * bump * bump * pager almost ready * pager ready * making progress with menu * making progress with menu * hacky but working * reduced flicker * progress on making progress a Live * redirect tsdout * bump * test * introspection fmt + error fmt * bump * bump * CompatHelper: add new compat entry for WordTokenizers at version 0.5, (keep existing compat) (#171) Co-authored-by: CompatHelper Julia * Stack traces (#179) * styling * now excludes other installed packages + fmt and tests * small improvements ot hidden frames * format and docs * small fixes * fmt * kwarg func call fmt * show each error line code * covergage * stacktrace formatting * traces rendering improvements * test fix * new text reshaping function from chatgpt * fixed tests * cleanup * cleanup * bump * bump * bump * prompt init * small fixes to repr and error * fixed small repr bugs * removed deps * wip errors * method error kwargs call * parsed kwargs calls in stackrace * fixes * method error edge cases * bump * bump * bump * fixed textlen bug for orphaned tags * Update Project.toml * Update Project.toml * errors with no backtrace are now shown * logger doesn't cut msgs * CI fix * error msg panel now always shows * reworked logs rendering code * msg reshaping * refactored stacktrace code + further logs improvements * fixed bug with markdown rendering * Link renderable development (#180) * bump * bump * working on making Link work * functional link? * fixing them errors * fixed behavior of hidden frames in stacktrace and docs * fixed bugs * bugs fixed and more test * bugfix * tests fix * tests fixing * tests fix * tests fix * Fix #181 (#182) * small fixes * bump * `Prompt` (#175) * prompt init * small fixes to repr and error * fixed small repr bugs * removed deps * wip errors * bump * bump * bump * bump * prompt wip * bump * prompt almost finished * added tests and docs for prompt * bump * coverage and CI * docs fix * Update _error_messages.jl * Annotations (#185) * init * more extensive precompilation * small fixes for error IO * 204 method invalidation at startup ops * bump * working on annotation * added style * bump * disabled precompilation * new code reshaping function * new annotation system * tests for annotations passing * fmt * more tests * bump * bump * ci fix * bump Co-authored-by: Federico Claudi * Create Invalidations.yml * Create unused_dependencies.yml * Update Invalidations.yml * Update Invalidations.yml * Update CI.yml * Update CI.yml * Coverage - adding more tests (#186) * increasing test coverage * fixed bug with markup tags including newline * test coverage * bump * bump * bump * bump * bump * CI fix * CI fix * CI fix * CI fix * bump * Update CI.yml * bump * refactored tree * CI fix * docs * Update unused_dependencies.yml * ci fix * Update Invalidations.yml * removed fillin(segments) * Update CI.yml * fmt * bump * removed error message functionality, using base * bump * fix_markup_across_lines (#188) * fix_markup_across_lines * tests passing * fixed small things * bump * wip for fix_ansi_across_lines * fixed nested style tags * reshaping with ANSI and markup works well * fmt * bump * bump * bump * removed unused funcs * docstring * small fixes * bump * Update CI.yml * Working on pre-compilation (#173) * init * more extensive precompilation * small fixes for error IO * 204 method invalidation at startup ops * bump * cleaned up precompilation * removed deps * bump Co-authored-by: Federico Claudi * CompatHelper: add new compat entry for AbstractTrees at version 0.4, (keep existing compat) (#189) Co-authored-by: CompatHelper Julia * bump * restored to old LiveInternals * small improvements * simple menu * working on help message * working on help * added multi select menu * bump * help tooltip working * small fixes * pager with liner numbers and scrollbar * tab viewer refactor * improved key controls * refactor * more widgets and improvements * tabviewer improvemens * fixed scrollbar * fixed introspection * compositor accepts fractional values * added apply_style to ren and removed extra style resets from boxes and panels * removed apply style for renderables and working on app * menu can be horizontal * added gallery * refactor * small fixes * RGB example * inspect re-worked * refactor * bump * reverted to master progress bar * tests passing * tests passing * refactoring controls * no stdout in precomp (#191) * no stdout in precomp * ignore precompilation code in coverage * working on controls * debug mode and working controls * small imrpvoements * removed live internals from widgets * all widgets play through app * bump * small fixes * working on responsive app size * working on resposive * pager improvements * tictactoe * small improvements * tests fix * bump * widget internals * transitions inferred from layout * wip * all widgets work * added help msg * help msg * bump * finished re-factoring tree * CI fix * added test * CI fix * bump --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: CompatHelper Julia Co-authored-by: Rémi Vezy Co-authored-by: Federico Claudi * working on docs * bump * Fixing known v2.0 problems ahead of release (#200) * fixed logs problems * bump * fixed layout in repr functionality * fixed err msg not showing up in progress * added option to expand stackatrace width * CI fix * CI fix * CI fix * CI fix * CI fix * CI fix * CI fix * working on docs * bump * docs * docs fix * merged --------- Co-authored-by: Federico Claudi Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: CompatHelper Julia Co-authored-by: Rémi Vezy --- .gitignore | 1 + Project.toml | 2 + README.jl | 4 +- docs/src/adv/errors_tracebacks.md | 7 +- docs/src/api/api_live.md | 13 + docs/src/layout/compositor.md | 9 +- docs/src/live/app_intro.md | 122 +++ docs/src/live/intro.md | 5 + docs/src/live/keyboard_input.md | 38 + docs/src/live/widgets.md | 118 +++ docs/src/ren/panel.md | 8 +- docs/src/ren/tree.md | 84 ++- examples/live_renderables/app_layout_only.jl | 26 + examples/live_renderables/example_app.jl | 92 +++ examples/live_renderables/pager.jl | 41 ++ examples/live_renderables/simple_menu.jl | 29 + examples/live_renderables/tic_tac_toe.jl | 179 +++++ examples/progressbars.jl | 9 +- examples/tree.jl | 25 +- logo.png | Bin 427694 -> 0 bytes src/Live/abstract_container.jl | 44 ++ src/Live/abstract_widget.jl | 117 +++ src/Live/app.jl | 535 ++++++++++++++ src/Live/buttons.jl | 191 +++++ src/Live/gallery.jl | 80 ++ src/Live/help.jl | 88 +++ src/Live/keyboard_input.jl | 62 ++ src/Live/live.jl | 96 +++ src/Live/menus.jl | 385 ++++++++++ src/Live/pager.jl | 213 ++++++ src/Live/widgets.jl | 235 ++++++ src/Term.jl | 28 +- src/_compositor.jl | 25 +- src/_errors.jl | 2 +- src/_inspect.jl | 60 +- src/_repr.jl | 28 +- src/boxes.jl | 6 +- src/compositors.jl | 34 +- src/console.jl | 9 +- src/errors.jl | 8 +- src/highlight.jl | 17 +- src/introspection.jl | 166 +++-- src/layout.jl | 19 +- src/logs.jl | 73 +- src/markdown.jl | 1 - src/measures.jl | 6 +- src/panels.jl | 20 +- src/renderables.jl | 3 +- src/repr.jl | 38 +- src/segments.jl | 15 - src/theme.jl | 28 +- src/trees.jl | 409 ++++------- test/06_test_box.jl | 6 +- test/08_test_panel.jl | 4 +- test/09_test_layout.jl | 14 +- test/10_test_inspect.jl | 12 +- test/11_test_theme.jl | 13 +- test/13_test_logs.jl | 29 +- test/16_test_tree.jl | 158 ++-- test/19_test_repr.jl | 22 +- test/20_test_compositor.jl | 10 +- test/26_test_live.jl | 385 ++++++++++ test/__test_utils.jl | 4 +- test/runtests.jl | 1 + test/txtfiles/annotations_1.txt | 14 +- test/txtfiles/annotations_2.txt | 44 +- test/txtfiles/annotations_3.txt | 44 +- test/txtfiles/annotations_4.txt | 48 +- test/txtfiles/annotations_5.txt | 4 +- test/txtfiles/annotations_6.txt | 28 +- test/txtfiles/automatic_repr_1.txt | 11 +- test/txtfiles/automatic_repr_2.txt | 13 +- test/txtfiles/automatic_repr_showme_1.txt | 28 +- test/txtfiles/backtrace_1.txt | 27 - test/txtfiles/backtrace_2.txt | 86 --- test/txtfiles/centered_titile_panel_7.txt | 6 +- test/txtfiles/centered_title_panel_1.txt | 4 +- test/txtfiles/centered_title_panel_2.txt | 4 +- test/txtfiles/centered_title_panel_3.txt | 4 +- test/txtfiles/centered_title_panel_4.txt | 4 +- test/txtfiles/centered_title_panel_5.txt | 4 +- test/txtfiles/centered_title_panel_6.txt | 4 +- test/txtfiles/compositor_2.txt | 24 +- test/txtfiles/compositor_4.txt | 48 +- test/txtfiles/exptree_expr_1.txt | 31 +- test/txtfiles/exptree_expr_2.txt | 33 +- test/txtfiles/exptree_expr_3.txt | 29 +- test/txtfiles/exptree_expr_4.txt | 34 +- test/txtfiles/exptree_expr_5.txt | 19 +- test/txtfiles/exptree_expr_6.txt | 39 +- test/txtfiles/exptree_expr_7.txt | 42 +- test/txtfiles/exptree_expr_8.txt | 20 +- test/txtfiles/link_panel_1_1_1.txt | 2 +- test/txtfiles/link_panel_1_1_2.txt | 4 +- test/txtfiles/link_panel_1_1_3.txt | 2 +- test/txtfiles/link_panel_1_1_4.txt | 2 +- test/txtfiles/link_panel_1_1_5.txt | 8 +- test/txtfiles/link_panel_1_2_1.txt | 2 +- test/txtfiles/link_panel_1_2_2.txt | 4 +- test/txtfiles/link_panel_1_2_3.txt | 2 +- test/txtfiles/link_panel_1_2_4.txt | 2 +- test/txtfiles/link_panel_1_2_5.txt | 8 +- test/txtfiles/link_panel_2_1_1.txt | 2 +- test/txtfiles/link_panel_2_1_2.txt | 4 +- test/txtfiles/link_panel_2_1_3.txt | 2 +- test/txtfiles/link_panel_2_1_4.txt | 2 +- test/txtfiles/link_panel_2_1_5.txt | 8 +- test/txtfiles/link_panel_2_2_1.txt | 2 +- test/txtfiles/link_panel_2_2_2.txt | 4 +- test/txtfiles/link_panel_2_2_3.txt | 2 +- test/txtfiles/link_panel_2_2_4.txt | 2 +- test/txtfiles/link_panel_2_2_5.txt | 8 +- test/txtfiles/link_panel_3_1_1.txt | 2 +- test/txtfiles/link_panel_3_1_2.txt | 4 +- test/txtfiles/link_panel_3_1_3.txt | 2 +- test/txtfiles/link_panel_3_1_4.txt | 2 +- test/txtfiles/link_panel_3_1_5.txt | 8 +- test/txtfiles/link_panel_3_2_1.txt | 2 +- test/txtfiles/link_panel_3_2_2.txt | 4 +- test/txtfiles/link_panel_3_2_3.txt | 2 +- test/txtfiles/link_panel_3_2_4.txt | 2 +- test/txtfiles/link_panel_3_2_5.txt | 8 +- test/txtfiles/markdown_2.txt | 2 +- test/txtfiles/markdown_3.txt | 42 +- test/txtfiles/mts_repr.txt | 10 + test/txtfiles/panels_constructors_1.txt | 12 +- test/txtfiles/panels_constructors_2.txt | 12 +- test/txtfiles/panels_layout_macro.txt | 36 +- test/txtfiles/panels_layout_macro2.txt | 36 +- test/txtfiles/panels_layout_macro3.txt | 2 +- test/txtfiles/panels_layout_macro4.txt | 6 +- test/txtfiles/panels_layout_macro5.txt | 12 +- test/txtfiles/panels_layout_macro6.txt | 12 +- test/txtfiles/rend_text_shape_i.txt | 8 - test/txtfiles/repr_T_struct.txt | 4 +- test/txtfiles/repr_rocket.txt | 13 +- test/txtfiles/repr_rocket_2.txt | 13 +- test/txtfiles/repr_rocket_2_show.txt | 16 +- test/txtfiles/repr_rocket_struct.txt | 38 +- test/txtfiles/reshaped_rend_with_markup_1.txt | 10 +- test/txtfiles/reshaped_rend_with_markup_2.txt | 10 +- test/txtfiles/reshaped_rend_with_markup_3.txt | 20 +- test/txtfiles/reshaped_rend_with_markup_4.txt | 20 +- test/txtfiles/reshaped_rend_with_markup_5.txt | 20 +- test/txtfiles/reshaped_rend_with_markup_6.txt | 20 +- test/txtfiles/reshaped_text_16.txt | 18 - test/txtfiles/reshaped_text_17.txt | 15 - test/txtfiles/reshaped_text_markuo_1.txt | 4 - test/txtfiles/reshaped_text_markuo_2.txt | 4 - test/txtfiles/reshaped_text_markuo_3.txt | 7 - test/txtfiles/single_widghet_app_1_1.txt | 20 + test/txtfiles/single_widghet_app_1_1_help.txt | 20 + .../single_widghet_app_1_1_nohelp.txt | 20 + .../txtfiles/single_widghet_app_1_1_print.txt | 8 + test/txtfiles/single_widghet_app_1_2.txt | 20 + test/txtfiles/single_widghet_app_1_2_help.txt | 20 + .../single_widghet_app_1_2_nohelp.txt | 20 + .../txtfiles/single_widghet_app_1_2_print.txt | 8 + test/txtfiles/single_widghet_app_2_1.txt | 20 + test/txtfiles/single_widghet_app_2_1_help.txt | 20 + .../single_widghet_app_2_1_nohelp.txt | 20 + .../txtfiles/single_widghet_app_2_1_print.txt | 8 + test/txtfiles/single_widghet_app_2_2.txt | 20 + test/txtfiles/single_widghet_app_2_2_help.txt | 20 + .../single_widghet_app_2_2_nohelp.txt | 20 + .../txtfiles/single_widghet_app_2_2_print.txt | 8 + test/txtfiles/small_panel_title_1_1_1.txt | 2 +- test/txtfiles/small_panel_title_1_1_2.txt | 2 +- test/txtfiles/small_panel_title_1_1_3.txt | 2 +- test/txtfiles/small_panel_title_1_2_1.txt | 2 +- test/txtfiles/small_panel_title_1_2_2.txt | 2 +- test/txtfiles/small_panel_title_1_2_3.txt | 2 +- test/txtfiles/small_panel_title_1_3_1.txt | 2 +- test/txtfiles/small_panel_title_1_3_2.txt | 2 +- test/txtfiles/small_panel_title_1_3_3.txt | 2 +- test/txtfiles/small_panel_title_1_4_1.txt | 2 +- test/txtfiles/small_panel_title_1_4_2.txt | 2 +- test/txtfiles/small_panel_title_1_4_3.txt | 2 +- test/txtfiles/small_panel_title_2_1_1.txt | 2 +- test/txtfiles/small_panel_title_2_1_2.txt | 2 +- test/txtfiles/small_panel_title_2_1_3.txt | 2 +- test/txtfiles/small_panel_title_2_2_1.txt | 2 +- test/txtfiles/small_panel_title_2_2_2.txt | 2 +- test/txtfiles/small_panel_title_2_2_3.txt | 2 +- test/txtfiles/small_panel_title_2_3_1.txt | 2 +- test/txtfiles/small_panel_title_2_3_2.txt | 2 +- test/txtfiles/small_panel_title_2_3_3.txt | 2 +- test/txtfiles/small_panel_title_2_4_1.txt | 2 +- test/txtfiles/small_panel_title_2_4_2.txt | 2 +- test/txtfiles/small_panel_title_2_4_3.txt | 2 +- test/txtfiles/small_panel_title_3_1_1.txt | 2 +- test/txtfiles/small_panel_title_3_1_2.txt | 2 +- test/txtfiles/small_panel_title_3_1_3.txt | 2 +- test/txtfiles/small_panel_title_3_2_1.txt | 2 +- test/txtfiles/small_panel_title_3_2_2.txt | 2 +- test/txtfiles/small_panel_title_3_2_3.txt | 2 +- test/txtfiles/small_panel_title_3_3_1.txt | 2 +- test/txtfiles/small_panel_title_3_3_2.txt | 2 +- test/txtfiles/small_panel_title_3_3_3.txt | 2 +- test/txtfiles/small_panel_title_3_4_1.txt | 2 +- test/txtfiles/small_panel_title_3_4_2.txt | 2 +- test/txtfiles/small_panel_title_3_4_3.txt | 2 +- test/txtfiles/small_panel_title_4_1_1.txt | 2 +- test/txtfiles/small_panel_title_4_1_2.txt | 2 +- test/txtfiles/small_panel_title_4_1_3.txt | 2 +- test/txtfiles/small_panel_title_4_2_1.txt | 2 +- test/txtfiles/small_panel_title_4_2_2.txt | 2 +- test/txtfiles/small_panel_title_4_2_3.txt | 2 +- test/txtfiles/small_panel_title_4_3_1.txt | 2 +- test/txtfiles/small_panel_title_4_3_2.txt | 2 +- test/txtfiles/small_panel_title_4_3_3.txt | 2 +- test/txtfiles/small_panel_title_4_4_1.txt | 2 +- test/txtfiles/small_panel_title_4_4_2.txt | 2 +- test/txtfiles/small_panel_title_4_4_3.txt | 2 +- test/txtfiles/small_panel_title_5_1_1.txt | 4 +- test/txtfiles/small_panel_title_5_1_2.txt | 4 +- test/txtfiles/small_panel_title_5_1_3.txt | 4 +- test/txtfiles/small_panel_title_5_2_1.txt | 4 +- test/txtfiles/small_panel_title_5_2_2.txt | 4 +- test/txtfiles/small_panel_title_5_2_3.txt | 4 +- test/txtfiles/small_panel_title_5_3_1.txt | 4 +- test/txtfiles/small_panel_title_5_3_2.txt | 4 +- test/txtfiles/small_panel_title_5_3_3.txt | 4 +- test/txtfiles/small_panel_title_5_4_1.txt | 4 +- test/txtfiles/small_panel_title_5_4_2.txt | 4 +- test/txtfiles/small_panel_title_5_4_3.txt | 4 +- test/txtfiles/small_panel_title_6_1_1.txt | 4 +- test/txtfiles/small_panel_title_6_1_2.txt | 4 +- test/txtfiles/small_panel_title_6_1_3.txt | 4 +- test/txtfiles/small_panel_title_6_2_1.txt | 4 +- test/txtfiles/small_panel_title_6_2_2.txt | 4 +- test/txtfiles/small_panel_title_6_2_3.txt | 4 +- test/txtfiles/small_panel_title_6_3_1.txt | 4 +- test/txtfiles/small_panel_title_6_3_2.txt | 4 +- test/txtfiles/small_panel_title_6_3_3.txt | 4 +- test/txtfiles/small_panel_title_6_4_1.txt | 4 +- test/txtfiles/small_panel_title_6_4_2.txt | 4 +- test/txtfiles/small_panel_title_6_4_3.txt | 4 +- test/txtfiles/small_panel_title_7_1_1.txt | 4 +- test/txtfiles/small_panel_title_7_1_2.txt | 4 +- test/txtfiles/small_panel_title_7_1_3.txt | 4 +- test/txtfiles/small_panel_title_7_2_1.txt | 4 +- test/txtfiles/small_panel_title_7_2_2.txt | 4 +- test/txtfiles/small_panel_title_7_2_3.txt | 4 +- test/txtfiles/small_panel_title_7_3_1.txt | 4 +- test/txtfiles/small_panel_title_7_3_2.txt | 4 +- test/txtfiles/small_panel_title_7_3_3.txt | 4 +- test/txtfiles/small_panel_title_7_4_1.txt | 4 +- test/txtfiles/small_panel_title_7_4_2.txt | 4 +- test/txtfiles/small_panel_title_7_4_3.txt | 4 +- test/txtfiles/small_panel_title_8_1_1.txt | 4 +- test/txtfiles/small_panel_title_8_1_2.txt | 4 +- test/txtfiles/small_panel_title_8_1_3.txt | 4 +- test/txtfiles/small_panel_title_8_2_1.txt | 4 +- test/txtfiles/small_panel_title_8_2_2.txt | 4 +- test/txtfiles/small_panel_title_8_2_3.txt | 4 +- test/txtfiles/small_panel_title_8_3_1.txt | 4 +- test/txtfiles/small_panel_title_8_3_2.txt | 4 +- test/txtfiles/small_panel_title_8_3_3.txt | 4 +- test/txtfiles/small_panel_title_8_4_1.txt | 4 +- test/txtfiles/small_panel_title_8_4_2.txt | 4 +- test/txtfiles/small_panel_title_8_4_3.txt | 4 +- test/txtfiles/termshow_1.txt | 14 +- test/txtfiles/termshow_10.txt | 26 +- test/txtfiles/termshow_11.txt | 694 +++++++++--------- test/txtfiles/termshow_12.txt | 109 --- test/txtfiles/termshow_2.txt | 13 +- test/txtfiles/termshow_3.txt | 120 ++- test/txtfiles/termshow_4.txt | 118 +-- test/txtfiles/termshow_5.txt | 110 +-- test/txtfiles/termshow_6.txt | 74 +- test/txtfiles/termshow_7.txt | 20 +- test/txtfiles/termshow_8.txt | 13 +- test/txtfiles/termshow_9.txt | 28 +- test/txtfiles/termshow_panel.txt | 6 - test/txtfiles/tree_1.txt | 6 - test/txtfiles/tree_1_1_1.txt | 8 + test/txtfiles/tree_1_1_10.txt | 2 + test/txtfiles/tree_1_1_11.txt | 2 + test/txtfiles/tree_1_1_12.txt | 7 + test/txtfiles/tree_1_1_2.txt | 8 + test/txtfiles/tree_1_1_3.txt | 10 + test/txtfiles/tree_1_1_4.txt | 23 + test/txtfiles/tree_1_1_5.txt | 20 + test/txtfiles/tree_1_1_6.txt | 8 + test/txtfiles/tree_1_1_7.txt | 7 + test/txtfiles/tree_1_1_8.txt | 8 + test/txtfiles/tree_1_1_9.txt | 26 + test/txtfiles/tree_1_2_1.txt | 8 + test/txtfiles/tree_1_2_10.txt | 2 + test/txtfiles/tree_1_2_11.txt | 2 + test/txtfiles/tree_1_2_12.txt | 7 + test/txtfiles/tree_1_2_2.txt | 8 + test/txtfiles/tree_1_2_3.txt | 10 + test/txtfiles/tree_1_2_4.txt | 26 + test/txtfiles/tree_1_2_5.txt | 20 + test/txtfiles/tree_1_2_6.txt | 8 + test/txtfiles/tree_1_2_7.txt | 7 + test/txtfiles/tree_1_2_8.txt | 8 + test/txtfiles/tree_1_2_9.txt | 26 + test/txtfiles/tree_1_3_1.txt | 8 + test/txtfiles/tree_1_3_10.txt | 2 + test/txtfiles/tree_1_3_11.txt | 2 + test/txtfiles/tree_1_3_12.txt | 7 + test/txtfiles/tree_1_3_2.txt | 8 + test/txtfiles/tree_1_3_3.txt | 10 + test/txtfiles/tree_1_3_4.txt | 26 + test/txtfiles/tree_1_3_5.txt | 20 + test/txtfiles/tree_1_3_6.txt | 8 + test/txtfiles/tree_1_3_7.txt | 7 + test/txtfiles/tree_1_3_8.txt | 8 + test/txtfiles/tree_1_3_9.txt | 26 + test/txtfiles/tree_2.txt | 9 - test/txtfiles/tree_2_1_1.txt | 8 + test/txtfiles/tree_2_1_10.txt | 2 + test/txtfiles/tree_2_1_11.txt | 2 + test/txtfiles/tree_2_1_12.txt | 7 + test/txtfiles/tree_2_1_2.txt | 8 + test/txtfiles/tree_2_1_3.txt | 10 + test/txtfiles/tree_2_1_4.txt | 23 + test/txtfiles/tree_2_1_5.txt | 20 + test/txtfiles/tree_2_1_6.txt | 8 + test/txtfiles/tree_2_1_7.txt | 7 + test/txtfiles/tree_2_1_8.txt | 8 + test/txtfiles/tree_2_1_9.txt | 26 + test/txtfiles/tree_2_2_1.txt | 8 + test/txtfiles/tree_2_2_10.txt | 2 + test/txtfiles/tree_2_2_11.txt | 2 + test/txtfiles/tree_2_2_12.txt | 7 + test/txtfiles/tree_2_2_2.txt | 8 + test/txtfiles/tree_2_2_3.txt | 10 + test/txtfiles/tree_2_2_4.txt | 26 + test/txtfiles/tree_2_2_5.txt | 20 + test/txtfiles/tree_2_2_6.txt | 8 + test/txtfiles/tree_2_2_7.txt | 7 + test/txtfiles/tree_2_2_8.txt | 8 + test/txtfiles/tree_2_2_9.txt | 26 + test/txtfiles/tree_2_3_1.txt | 8 + test/txtfiles/tree_2_3_10.txt | 2 + test/txtfiles/tree_2_3_11.txt | 2 + test/txtfiles/tree_2_3_12.txt | 7 + test/txtfiles/tree_2_3_2.txt | 8 + test/txtfiles/tree_2_3_3.txt | 10 + test/txtfiles/tree_2_3_4.txt | 26 + test/txtfiles/tree_2_3_5.txt | 20 + test/txtfiles/tree_2_3_6.txt | 8 + test/txtfiles/tree_2_3_7.txt | 7 + test/txtfiles/tree_2_3_8.txt | 8 + test/txtfiles/tree_2_3_9.txt | 26 + test/txtfiles/tree_3.txt | 11 - test/txtfiles/tree_4.txt | 12 - test/txtfiles/tree_5.txt | 9 - test/txtfiles/tree_6.txt | 8 - test/txtfiles/tree_expr_1.txt | 23 +- test/txtfiles/tree_expr_2.txt | 25 +- test/txtfiles/tree_expr_3.txt | 21 +- test/txtfiles/tree_expr_4.txt | 26 +- test/txtfiles/tree_expr_5.txt | 11 +- test/txtfiles/tree_expr_6.txt | 31 +- test/txtfiles/tree_expr_7.txt | 34 +- test/txtfiles/tree_expr_8.txt | 12 +- test/txtfiles/trim_renderables_2.txt | 16 +- .../txtfiles/widget_buttonsmenu_1_1_1_(1).txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_1_(2).txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_1_1_b.txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_1_2_b.txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_2_(1).txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_2_(2).txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_2_1_b.txt | 9 + .../txtfiles/widget_buttonsmenu_1_1_2_2_b.txt | 9 + .../txtfiles/widget_buttonsmenu_1_2_1_(1).txt | 5 + .../txtfiles/widget_buttonsmenu_1_2_1_(2).txt | 10 + .../txtfiles/widget_buttonsmenu_1_2_1_1_b.txt | 5 + .../txtfiles/widget_buttonsmenu_1_2_1_2_b.txt | 10 + .../txtfiles/widget_buttonsmenu_1_2_2_(1).txt | 5 + .../txtfiles/widget_buttonsmenu_1_2_2_(2).txt | 10 + .../txtfiles/widget_buttonsmenu_1_2_2_1_b.txt | 5 + .../txtfiles/widget_buttonsmenu_1_2_2_2_b.txt | 10 + .../txtfiles/widget_buttonsmenu_2_1_1_(1).txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_1_(2).txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_1_1_b.txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_1_2_b.txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_2_(1).txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_2_(2).txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_2_1_b.txt | 9 + .../txtfiles/widget_buttonsmenu_2_1_2_2_b.txt | 9 + .../txtfiles/widget_buttonsmenu_2_2_1_(1).txt | 5 + .../txtfiles/widget_buttonsmenu_2_2_1_(2).txt | 10 + .../txtfiles/widget_buttonsmenu_2_2_1_1_b.txt | 5 + .../txtfiles/widget_buttonsmenu_2_2_1_2_b.txt | 10 + .../txtfiles/widget_buttonsmenu_2_2_2_(1).txt | 5 + .../txtfiles/widget_buttonsmenu_2_2_2_(2).txt | 10 + .../txtfiles/widget_buttonsmenu_2_2_2_1_b.txt | 5 + .../txtfiles/widget_buttonsmenu_2_2_2_2_b.txt | 10 + test/txtfiles/widget_gal_1_1_1.txt | 20 + test/txtfiles/widget_gal_1_1_1_b.txt | 20 + test/txtfiles/widget_gal_1_1_2.txt | 1 + test/txtfiles/widget_gal_1_1_2_b.txt | 20 + test/txtfiles/widget_gal_1_2_1.txt | 40 + test/txtfiles/widget_gal_1_2_1_b.txt | 40 + test/txtfiles/widget_gal_1_2_2.txt | 1 + test/txtfiles/widget_gal_1_2_2_b.txt | 40 + test/txtfiles/widget_gal_2_1_1.txt | 20 + test/txtfiles/widget_gal_2_1_1_b.txt | 20 + test/txtfiles/widget_gal_2_1_2.txt | 1 + test/txtfiles/widget_gal_2_1_2_b.txt | 20 + test/txtfiles/widget_gal_2_2_1.txt | 40 + test/txtfiles/widget_gal_2_2_1_b.txt | 40 + test/txtfiles/widget_gal_2_2_2.txt | 1 + test/txtfiles/widget_gal_2_2_2_b.txt | 40 + test/txtfiles/widget_inputbox.txt | 5 + test/txtfiles/widget_multiselectmenu_1_1.txt | 3 + .../txtfiles/widget_multiselectmenu_1_1_b.txt | 3 + test/txtfiles/widget_multiselectmenu_1_2.txt | 3 + .../txtfiles/widget_multiselectmenu_1_2_b.txt | 3 + test/txtfiles/widget_multiselectmenu_2_1.txt | 3 + .../txtfiles/widget_multiselectmenu_2_1_b.txt | 3 + test/txtfiles/widget_multiselectmenu_2_2.txt | 3 + .../txtfiles/widget_multiselectmenu_2_2_b.txt | 3 + test/txtfiles/widget_pager_1_1_1.txt | 20 + test/txtfiles/widget_pager_1_1_2.txt | 20 + test/txtfiles/widget_pager_1_2_1.txt | 40 + test/txtfiles/widget_pager_1_2_2.txt | 40 + test/txtfiles/widget_pager_2_1_1.txt | 20 + test/txtfiles/widget_pager_2_1_2.txt | 20 + test/txtfiles/widget_pager_2_2_1.txt | 40 + test/txtfiles/widget_pager_2_2_2.txt | 40 + test/txtfiles/widget_placeholder.txt | 5 + test/txtfiles/widget_simplemenu_1_1_1.txt | 3 + test/txtfiles/widget_simplemenu_1_1_1_b.txt | 3 + test/txtfiles/widget_simplemenu_1_1_2.txt | 3 + test/txtfiles/widget_simplemenu_1_1_2_b.txt | 3 + test/txtfiles/widget_simplemenu_1_2_1.txt | 1 + test/txtfiles/widget_simplemenu_1_2_1_b.txt | 1 + test/txtfiles/widget_simplemenu_1_2_2.txt | 1 + test/txtfiles/widget_simplemenu_1_2_2_b.txt | 1 + test/txtfiles/widget_simplemenu_2_1_1.txt | 3 + test/txtfiles/widget_simplemenu_2_1_1_b.txt | 3 + test/txtfiles/widget_simplemenu_2_1_2.txt | 3 + test/txtfiles/widget_simplemenu_2_1_2_b.txt | 3 + test/txtfiles/widget_simplemenu_2_2_1.txt | 2 + test/txtfiles/widget_simplemenu_2_2_1_b.txt | 2 + test/txtfiles/widget_simplemenu_2_2_2.txt | 2 + test/txtfiles/widget_simplemenu_2_2_2_b.txt | 2 + test/txtfiles/widget_text_1_1.txt | 3 + test/txtfiles/widget_text_1_2.txt | 1 + test/txtfiles/widget_text_2_1.txt | 3 + test/txtfiles/widget_text_2_2.txt | 7 + 448 files changed, 7285 insertions(+), 2349 deletions(-) create mode 100644 docs/src/api/api_live.md create mode 100644 docs/src/live/app_intro.md create mode 100644 docs/src/live/intro.md create mode 100644 docs/src/live/keyboard_input.md create mode 100644 docs/src/live/widgets.md create mode 100644 examples/live_renderables/app_layout_only.jl create mode 100644 examples/live_renderables/example_app.jl create mode 100644 examples/live_renderables/pager.jl create mode 100644 examples/live_renderables/simple_menu.jl create mode 100644 examples/live_renderables/tic_tac_toe.jl delete mode 100644 logo.png create mode 100644 src/Live/abstract_container.jl create mode 100644 src/Live/abstract_widget.jl create mode 100644 src/Live/app.jl create mode 100644 src/Live/buttons.jl create mode 100644 src/Live/gallery.jl create mode 100644 src/Live/help.jl create mode 100644 src/Live/keyboard_input.jl create mode 100644 src/Live/live.jl create mode 100644 src/Live/menus.jl create mode 100644 src/Live/pager.jl create mode 100644 src/Live/widgets.jl create mode 100644 test/26_test_live.jl delete mode 100644 test/txtfiles/backtrace_1.txt delete mode 100644 test/txtfiles/backtrace_2.txt create mode 100644 test/txtfiles/mts_repr.txt delete mode 100644 test/txtfiles/rend_text_shape_i.txt delete mode 100644 test/txtfiles/reshaped_text_16.txt delete mode 100644 test/txtfiles/reshaped_text_17.txt delete mode 100644 test/txtfiles/reshaped_text_markuo_1.txt delete mode 100644 test/txtfiles/reshaped_text_markuo_2.txt delete mode 100644 test/txtfiles/reshaped_text_markuo_3.txt create mode 100644 test/txtfiles/single_widghet_app_1_1.txt create mode 100644 test/txtfiles/single_widghet_app_1_1_help.txt create mode 100644 test/txtfiles/single_widghet_app_1_1_nohelp.txt create mode 100644 test/txtfiles/single_widghet_app_1_1_print.txt create mode 100644 test/txtfiles/single_widghet_app_1_2.txt create mode 100644 test/txtfiles/single_widghet_app_1_2_help.txt create mode 100644 test/txtfiles/single_widghet_app_1_2_nohelp.txt create mode 100644 test/txtfiles/single_widghet_app_1_2_print.txt create mode 100644 test/txtfiles/single_widghet_app_2_1.txt create mode 100644 test/txtfiles/single_widghet_app_2_1_help.txt create mode 100644 test/txtfiles/single_widghet_app_2_1_nohelp.txt create mode 100644 test/txtfiles/single_widghet_app_2_1_print.txt create mode 100644 test/txtfiles/single_widghet_app_2_2.txt create mode 100644 test/txtfiles/single_widghet_app_2_2_help.txt create mode 100644 test/txtfiles/single_widghet_app_2_2_nohelp.txt create mode 100644 test/txtfiles/single_widghet_app_2_2_print.txt delete mode 100644 test/txtfiles/termshow_12.txt delete mode 100644 test/txtfiles/termshow_panel.txt delete mode 100644 test/txtfiles/tree_1.txt create mode 100644 test/txtfiles/tree_1_1_1.txt create mode 100644 test/txtfiles/tree_1_1_10.txt create mode 100644 test/txtfiles/tree_1_1_11.txt create mode 100644 test/txtfiles/tree_1_1_12.txt create mode 100644 test/txtfiles/tree_1_1_2.txt create mode 100644 test/txtfiles/tree_1_1_3.txt create mode 100644 test/txtfiles/tree_1_1_4.txt create mode 100644 test/txtfiles/tree_1_1_5.txt create mode 100644 test/txtfiles/tree_1_1_6.txt create mode 100644 test/txtfiles/tree_1_1_7.txt create mode 100644 test/txtfiles/tree_1_1_8.txt create mode 100644 test/txtfiles/tree_1_1_9.txt create mode 100644 test/txtfiles/tree_1_2_1.txt create mode 100644 test/txtfiles/tree_1_2_10.txt create mode 100644 test/txtfiles/tree_1_2_11.txt create mode 100644 test/txtfiles/tree_1_2_12.txt create mode 100644 test/txtfiles/tree_1_2_2.txt create mode 100644 test/txtfiles/tree_1_2_3.txt create mode 100644 test/txtfiles/tree_1_2_4.txt create mode 100644 test/txtfiles/tree_1_2_5.txt create mode 100644 test/txtfiles/tree_1_2_6.txt create mode 100644 test/txtfiles/tree_1_2_7.txt create mode 100644 test/txtfiles/tree_1_2_8.txt create mode 100644 test/txtfiles/tree_1_2_9.txt create mode 100644 test/txtfiles/tree_1_3_1.txt create mode 100644 test/txtfiles/tree_1_3_10.txt create mode 100644 test/txtfiles/tree_1_3_11.txt create mode 100644 test/txtfiles/tree_1_3_12.txt create mode 100644 test/txtfiles/tree_1_3_2.txt create mode 100644 test/txtfiles/tree_1_3_3.txt create mode 100644 test/txtfiles/tree_1_3_4.txt create mode 100644 test/txtfiles/tree_1_3_5.txt create mode 100644 test/txtfiles/tree_1_3_6.txt create mode 100644 test/txtfiles/tree_1_3_7.txt create mode 100644 test/txtfiles/tree_1_3_8.txt create mode 100644 test/txtfiles/tree_1_3_9.txt delete mode 100644 test/txtfiles/tree_2.txt create mode 100644 test/txtfiles/tree_2_1_1.txt create mode 100644 test/txtfiles/tree_2_1_10.txt create mode 100644 test/txtfiles/tree_2_1_11.txt create mode 100644 test/txtfiles/tree_2_1_12.txt create mode 100644 test/txtfiles/tree_2_1_2.txt create mode 100644 test/txtfiles/tree_2_1_3.txt create mode 100644 test/txtfiles/tree_2_1_4.txt create mode 100644 test/txtfiles/tree_2_1_5.txt create mode 100644 test/txtfiles/tree_2_1_6.txt create mode 100644 test/txtfiles/tree_2_1_7.txt create mode 100644 test/txtfiles/tree_2_1_8.txt create mode 100644 test/txtfiles/tree_2_1_9.txt create mode 100644 test/txtfiles/tree_2_2_1.txt create mode 100644 test/txtfiles/tree_2_2_10.txt create mode 100644 test/txtfiles/tree_2_2_11.txt create mode 100644 test/txtfiles/tree_2_2_12.txt create mode 100644 test/txtfiles/tree_2_2_2.txt create mode 100644 test/txtfiles/tree_2_2_3.txt create mode 100644 test/txtfiles/tree_2_2_4.txt create mode 100644 test/txtfiles/tree_2_2_5.txt create mode 100644 test/txtfiles/tree_2_2_6.txt create mode 100644 test/txtfiles/tree_2_2_7.txt create mode 100644 test/txtfiles/tree_2_2_8.txt create mode 100644 test/txtfiles/tree_2_2_9.txt create mode 100644 test/txtfiles/tree_2_3_1.txt create mode 100644 test/txtfiles/tree_2_3_10.txt create mode 100644 test/txtfiles/tree_2_3_11.txt create mode 100644 test/txtfiles/tree_2_3_12.txt create mode 100644 test/txtfiles/tree_2_3_2.txt create mode 100644 test/txtfiles/tree_2_3_3.txt create mode 100644 test/txtfiles/tree_2_3_4.txt create mode 100644 test/txtfiles/tree_2_3_5.txt create mode 100644 test/txtfiles/tree_2_3_6.txt create mode 100644 test/txtfiles/tree_2_3_7.txt create mode 100644 test/txtfiles/tree_2_3_8.txt create mode 100644 test/txtfiles/tree_2_3_9.txt delete mode 100644 test/txtfiles/tree_3.txt delete mode 100644 test/txtfiles/tree_4.txt delete mode 100644 test/txtfiles/tree_5.txt delete mode 100644 test/txtfiles/tree_6.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt create mode 100644 test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt create mode 100644 test/txtfiles/widget_gal_1_1_1.txt create mode 100644 test/txtfiles/widget_gal_1_1_1_b.txt create mode 100644 test/txtfiles/widget_gal_1_1_2.txt create mode 100644 test/txtfiles/widget_gal_1_1_2_b.txt create mode 100644 test/txtfiles/widget_gal_1_2_1.txt create mode 100644 test/txtfiles/widget_gal_1_2_1_b.txt create mode 100644 test/txtfiles/widget_gal_1_2_2.txt create mode 100644 test/txtfiles/widget_gal_1_2_2_b.txt create mode 100644 test/txtfiles/widget_gal_2_1_1.txt create mode 100644 test/txtfiles/widget_gal_2_1_1_b.txt create mode 100644 test/txtfiles/widget_gal_2_1_2.txt create mode 100644 test/txtfiles/widget_gal_2_1_2_b.txt create mode 100644 test/txtfiles/widget_gal_2_2_1.txt create mode 100644 test/txtfiles/widget_gal_2_2_1_b.txt create mode 100644 test/txtfiles/widget_gal_2_2_2.txt create mode 100644 test/txtfiles/widget_gal_2_2_2_b.txt create mode 100644 test/txtfiles/widget_inputbox.txt create mode 100644 test/txtfiles/widget_multiselectmenu_1_1.txt create mode 100644 test/txtfiles/widget_multiselectmenu_1_1_b.txt create mode 100644 test/txtfiles/widget_multiselectmenu_1_2.txt create mode 100644 test/txtfiles/widget_multiselectmenu_1_2_b.txt create mode 100644 test/txtfiles/widget_multiselectmenu_2_1.txt create mode 100644 test/txtfiles/widget_multiselectmenu_2_1_b.txt create mode 100644 test/txtfiles/widget_multiselectmenu_2_2.txt create mode 100644 test/txtfiles/widget_multiselectmenu_2_2_b.txt create mode 100644 test/txtfiles/widget_pager_1_1_1.txt create mode 100644 test/txtfiles/widget_pager_1_1_2.txt create mode 100644 test/txtfiles/widget_pager_1_2_1.txt create mode 100644 test/txtfiles/widget_pager_1_2_2.txt create mode 100644 test/txtfiles/widget_pager_2_1_1.txt create mode 100644 test/txtfiles/widget_pager_2_1_2.txt create mode 100644 test/txtfiles/widget_pager_2_2_1.txt create mode 100644 test/txtfiles/widget_pager_2_2_2.txt create mode 100644 test/txtfiles/widget_placeholder.txt create mode 100644 test/txtfiles/widget_simplemenu_1_1_1.txt create mode 100644 test/txtfiles/widget_simplemenu_1_1_1_b.txt create mode 100644 test/txtfiles/widget_simplemenu_1_1_2.txt create mode 100644 test/txtfiles/widget_simplemenu_1_1_2_b.txt create mode 100644 test/txtfiles/widget_simplemenu_1_2_1.txt create mode 100644 test/txtfiles/widget_simplemenu_1_2_1_b.txt create mode 100644 test/txtfiles/widget_simplemenu_1_2_2.txt create mode 100644 test/txtfiles/widget_simplemenu_1_2_2_b.txt create mode 100644 test/txtfiles/widget_simplemenu_2_1_1.txt create mode 100644 test/txtfiles/widget_simplemenu_2_1_1_b.txt create mode 100644 test/txtfiles/widget_simplemenu_2_1_2.txt create mode 100644 test/txtfiles/widget_simplemenu_2_1_2_b.txt create mode 100644 test/txtfiles/widget_simplemenu_2_2_1.txt create mode 100644 test/txtfiles/widget_simplemenu_2_2_1_b.txt create mode 100644 test/txtfiles/widget_simplemenu_2_2_2.txt create mode 100644 test/txtfiles/widget_simplemenu_2_2_2_b.txt create mode 100644 test/txtfiles/widget_text_1_1.txt create mode 100644 test/txtfiles/widget_text_1_2.txt create mode 100644 test/txtfiles/widget_text_2_1.txt create mode 100644 test/txtfiles/widget_text_2_2.txt diff --git a/.gitignore b/.gitignore index c95af7ef3..a2632ce82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +scratch.txt *.jl.*.cov *.jl.cov *.jl.mem diff --git a/Project.toml b/Project.toml index 3a2ba5137..614b7e821 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ MyterialColors = "1c23619d-4212-4747-83aa-717207fae70f" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" SnoopPrecompile = "66db9d55-30c0-4569-8b51-7e840670fc0c" Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -40,6 +41,7 @@ StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [targets] test = ["Random", "StableRNGs", "Suppressor", "Test", "TimerOutputs"] diff --git a/README.jl b/README.jl index d62c01588..e968ff0cc 100644 --- a/README.jl +++ b/README.jl @@ -1,7 +1,7 @@ using Term import Term.Renderables: Renderable import Term: rint -import Term: typestree, inspect +import Term: inspect using Term.Layout import Term.Measures: height @@ -172,7 +172,7 @@ lorem1 = TextBox(_lorem; width = 62, fit = false, padding = (0, 0, 0, 0)) lorem2 = TextBox(_lorem; width = 42, fit = false, padding = (0, 0, 0, 0)) expr = :(2x + 2π / θ) -tree = Renderable(sprint(typestree, Float64)) +tree = Renderable(sprint(Tree, Float64)) dendo = Renderable(sprint(inspect, expr)) renderables_info = TextBox( """{bold bright_blue}Renderables types{/bold bright_blue} diff --git a/docs/src/adv/errors_tracebacks.md b/docs/src/adv/errors_tracebacks.md index bd05a902c..3f7bfc7aa 100644 --- a/docs/src/adv/errors_tracebacks.md +++ b/docs/src/adv/errors_tracebacks.md @@ -48,4 +48,9 @@ import Term: STACKTRACE_HIDDEN_MODULES, STACKTRACE_HIDE_FRAMES STACKTRACE_HIDDEN_MODULES[] = ["REPL", "OhMyREPL"] # list names of modules you want ignored in the stacktrace STACKTRACE_HIDE_FRAMES[] = false # set to true to hide frame, false to show all of them -``` \ No newline at end of file +<<<<<<< HEAD +``` + +======= +``` +>>>>>>> 5af6831f4379fc6bbb39622d06c91a17dcbac183 diff --git a/docs/src/api/api_live.md b/docs/src/api/api_live.md new file mode 100644 index 000000000..7a6f96825 --- /dev/null +++ b/docs/src/api/api_live.md @@ -0,0 +1,13 @@ +# Live +```@meta +CurrentModule = Term.LiveWidgets +``` + + +```@index +Pages = ["api_live.md"] +``` + +```@autodocs +Modules = [LiveWidgets] +``` \ No newline at end of file diff --git a/docs/src/layout/compositor.md b/docs/src/layout/compositor.md index 0c6c5c39f..ec71e00e6 100644 --- a/docs/src/layout/compositor.md +++ b/docs/src/layout/compositor.md @@ -1,4 +1,4 @@ -# Compositor +# [Compositor](@id CompositorDocs) We've just seen how you can use `grid` to achieve nice layouts very easily. That's great when you have a bunch of renderables of the same size and you want to crate a simple layout. If you want to get fancy using grid is not trivial: ```@example compositor @@ -90,6 +90,13 @@ Compositor(layout) easy peasy. +Some of you might argue: but this way I need to know exactly what size each element has to have in order to fit in the available terminal real estate... that's annoying! Nope, just use `Float64` as dimensions values to specify that you want to fill that fraction of the available space: +```@example compositor +layout = :(A(20, $(0.75)) * B(20, $(0.25))) +Compositor(layout) +``` + + ## Compositor content Some of you will be thinking: "this is all well and good, but I don't want to just show place holders I've got actual content!". Fair enough, so let's add some. diff --git a/docs/src/live/app_intro.md b/docs/src/live/app_intro.md new file mode 100644 index 000000000..1a5d3b07e --- /dev/null +++ b/docs/src/live/app_intro.md @@ -0,0 +1,122 @@ +# App + +The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples + +### A first example +We start with a simple example: an app that only shows one single widget. a `TextWidget` displaying a bit of text. + +```@example app +using Term +using Term.LiveWidgets + +app = App( + TextWidget(""" +The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples +""") +) + +``` + +Easy. Now to *use* the app you'd call `play(app)`. This starts an interactive session in which the app continously refreshes its display and reacts to user input until the app is exited by pressing `q` or `Esc`. +Unfortunately we can't do that here in the docs, but we can use `frame` to see what the app would look like +when we start it: + +```@example app +frame(app) +``` + +!!! tip "Ask for help" + Press `h` while using `play` to interact with an app to display a help tooltip. + +### Layout +Ok, one widget apps are not that useful. +When adding more widgets you'll eventually have to specify how to lay them out. Essentially you want to specify the space taken by the app as a whole (the width and height in the terminal) and then within that you need to specify the size of each +widgets and where they are located (e.g. widget A is to the left of B and A,B together are above C). + +To specify the layout you need to use an `Expr` like the one used for ['Compositor'](@ref CompositorDocs) content. +The expression is made of elements like `a(h, w)` where `a` is the layout element's name and `h,w` are the height and width of the element. +Note that `h` has to be an integer (the number of lines spanned by the widget) but `w` can be either `Int` (number of columns) or `Float64` with `0 < w < 1` to specify the fraction of the available space that should be used. + +For example: +```julia +:r(10, 0.5) +``` +says that the widget `r` should take up 10 lines and half of the available width. + +In addition to elements, you can use `*` and `/` to specify the relation between elements: `*` means "to the side of" and `/` means "above". +Combined with parenteses you can get some pretty complex layouts. For example: + +```@example app +layout = :( + :(( a(10, .5) * b(10, .5) )/c(10, 1)) +) +``` + +With a layout in mind you can start creating your app. +Eventually you'll need to provide some widgets too, but if you just want to check the layout (and maybe tweak it) you can +create an empty app with placeholders to visualize the position of each widget: + +```@example app +App(layout) |> frame +``` + +Note that you can always specify the `width` and `height` of the app. If you don't, the app will try to use the full terminal size. + + +!!! tip "Responsive layout" + If you use a `Float` to specify your layout elements size, the app will automatically resize the elements when the terminal + size is reduced. If you also want your app to expand to fill in the whole terminal is the terminal is enlarged, you can use + `expand` keyworad argument for `App`. + + + +### Adding widgets +To create an app with multiple widgets, you'll need the layout info as shown above and a `Dict` with +the widgets you want your app to display. The keys in the `Dict` need to match the layout elemnts names. +For example, to create an app showing two pieces of text. + +```@example app + +layout = :(a(25, .5) * b(25, .5)) + +widgets = Dict( + :a => TextWidget("""To create an app with multiple widgets, you'll need the layout info as shown above and a `Dict` with +the widgets you want your app to display. The keys in the `Dict` need to match the layout elemnts names. +For example, to create an app showing two pieces of text. +"""; as_panel=true), + :b => TextWidget(""" + The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples +"""; as_panel=true) +) + +App(layout; widgets=widgets) |> frame +``` + +Note that one panel is dim while the other is not, why? +That's because the app considers the first widget to be 'active' and the brighter color signals that. +Different widgets show that they are active differently, but generally they use colors to signal to the user that they are +the currently active one. This is important because user input's (like key presses) will be passed to the currently active widget. +For example, if you have a widget that is a button and it get's pressed by using `spacebar`, then pressing space +will only work if the button is active. + +To change the currently active widget you can "navigate" through the app using arrow keys. +`App` analyzes the `layout` of the app to infer the relative position of the wedgets and set up the navigation accordingly. +To test this, use `play` on the app we just created and then left/right arrow to change focus! +(Don't forget to use `q` to exit the app when you're done) + +Sometimes you want different ways to specify which widget should be active, either by using an arrow key or by pressing a specific key. +You can pass `transition_rules` to `App` to use your own set of rules. `transition_rules` should be a `Dict` with `KeyInput` types as key and a `Dict` of pairs `Symbol => Symbol`. The interpretation is that the symbols indicate the current and next widget to be active when the key is pressed. For example: + +```julia +transition_rules = Dict( + ArrowRight() => Dict(:a => :b), + ArrowLeft() => Dict(:b => :a), +) +``` +implements the transition rules from the example above. diff --git a/docs/src/live/intro.md b/docs/src/live/intro.md new file mode 100644 index 000000000..95783f311 --- /dev/null +++ b/docs/src/live/intro.md @@ -0,0 +1,5 @@ +# Live widgets + +Allright, making fancy terminal graphics is all good and well, but a bit boring isn't it? Wouldn't it be nice to have something more dynamics. Something that updates over times and maybe even reacts to users input? Well, that's what live widgets are for. Live widgets are a way to make your terminal application more interactive. They are a way to make your terminal application more dynamic. They are a way to make your terminal application more fun. + +Let's go. \ No newline at end of file diff --git a/docs/src/live/keyboard_input.md b/docs/src/live/keyboard_input.md new file mode 100644 index 000000000..06ae27199 --- /dev/null +++ b/docs/src/live/keyboard_input.md @@ -0,0 +1,38 @@ +# Keyboard input +Apps can capture input from the user by reading key presses and passing them to the active widget. + +Each widget must have a `controls` attribute with a dictionary mapping keys to function. +The keys of this dictionary can take one of two types: +- `Char`: a single character. Used to map a "letter" key to a function. For example `q` generally quits the app and `h` displays help. +- a `KeyInput` type like `ArrowLeft()` or `HomeKey()`. These are special keys including the arrows, page up/down, Esc, Del and SpaceBar. + + +The values of the dictionary are functions. The function should have a signature: `fn(w, k)` where `w` is the widget they are assigned to and `k` is the key that was pressed. +For example in `Pager` you can use `ArrowRight, PageDownKey` and `]` to scroll down so a function is defined as: +```julia +next_page(p::Pager, ::Union{PageDownKey,ArrowRight,Char}) +``` + +and with similar functions the `controls` for `Pager` are: +``` + +pager_controls = Dict( + ArrowRight() => next_page, + ']' => next_page, + ArrowLeft() => prev_page, + '[' => prev_page, + ArrowDown() => next_line, + '.' => next_line, + ArrowUp() => prev_line, + ',' => prev_line, + HomeKey() => home, + EndKey() => toend, + Esc() => quit, + 'q' => quit, +) +``` + +there's no restriction to which/how many control functions you should have and how they should affect your widget. +However having `quit` is generally a good idea or the user can't quit the app while that widget is active! +Different widgets will have different controls. +A widget's controls are only activated if the corresponding key is pressed while the widget is active. \ No newline at end of file diff --git a/docs/src/live/widgets.md b/docs/src/live/widgets.md new file mode 100644 index 000000000..38fd49f8e --- /dev/null +++ b/docs/src/live/widgets.md @@ -0,0 +1,118 @@ +# Widgets + +Widgets are the building blocks that `App`s are made of. +A widget is generally a single piece of content with a specific function (display text, act as a button...). + +## Predefined widgets +`Term` comes with a bunch of widgets you can already plug into your applications. +If you want to develop your own, read below. + +### TextWidget +We've seen this already, it's the simplest widget: just show some text. + + +```@example widgets +using Term.LiveWidgets + +TextWidget("Hello world!") |> frame + +``` + +unlike other widgets it doesn't have a whole lot of options, just gives you the +choice of showing just text or a panel: +```@example widgets +TextWidget("Hello world!", as_panel=true) |> frame +``` + +### InputBox +This widget is a bit more complex. It's a text input box. It's a bit like a `TextWidget` but it also allows the user to type in it. +When this widget is active, any key press get's captured and displayed as text in the widget. +As usual things like Space Bar, Enter and Del add spaces, new lines and delete characters respectively. +Make an `App` with an `InputBox` to see how it works! + +### Buttons +```@example widgets +Button("Click me please!") |> frame +``` +You can specify the color of the text and the button. You can also pass a `callback`: a `Function` that gets called +when the button is pressed. + +Normally, when pressed, a button will change its color to indicate that it has been pressed and then revert to its +original style. If you want something that acts like a toggle switch, use `ToggleButton` instead. + + + +### Menus + +The idea is simple, provide the user with some option and let them choose one. +```@example widgets +SimpleMenu(["Option 1", "Option 2", "Option 3"]) |> frame +``` + +the user can use the arrow keys to navigate the menu and press Enter to select an option. +Selecting an options quits the application and returns an integer with the index of the selected option. +`active_style, inactive_style` can be used to set the style of the currently active options while the user +navigates the menu. The `layout` options lets you choose if you want the options to be displayed horizontally or vertically. +If you want the menu elements to stand out more, you can use `ButtonsMenu`. + + +If you want to let users select more than one option at once, use `MultiSelectMenu`. It shows a checkbox like display and +users can use the space bar to toggle the state of the checkbox. + +### Pager +A pager is a widget that lets you display a lot of text in a scrollable window. +```@example widgets +Pager("This is a pager. It lets you display a lot of text in a scrollable window."^300) |> frame +``` + +You can use various keyboard inputs to navigate the pager (arrows to move up and down and to page up and down, Home and End to go to the top and bottom of the text respectively). + +You can specify the size (height and width) of the pager and if line numbers should be shown (useful to display code): + +```@example widgets +Pager("This is a pager. It lets you display a lot of text in a scrollable window."^300, height=20, width=20, line_numbers=true) |> frame +``` + + +### Gallery + +A `Gallery` is somewhat inbetween a widget and an `App`. It's a container for other widgets. +Only one widget at the time is displayed in the space taken by the `Gallery`. + +```@example widgets +g = Gallery( + [TextWidget("Hello world!"), TextWidget("Not shown")]; + height = 25, width=60, title="My gallery" +) |> frame +``` + +Use arrows to change which widget is active. + + +## Defining widgets +All widgets are subtypes of the `abstract type AbstractWidget`. +A new widget type needs to be defined as a `mutable struct` and it needs to have two obligatory fields: +```julia + internals::WidgetInternals + controls::AbstractDict +``` + +`WidgetInternals` is a struct that contains the state of the widget. It keeps track of thigns like the size +of the widget and the three callback functions `on_draw`, `on_activated` and `on_deactivated`. +These are optional functions that are called when `frame` is called on a widget or when the widget is activated or deactivated. +The activated/deactivated functions can be used to change the appearance of the widget to signal to the user that the widget is active or not. + +`controls` is a `Dict{Union{Char, KeyboardInput}, Function}` that says how keyboard inputs should be used: it maps a keyboard input to a function that gets called when that input is pressed if the widget is active. + +Other than these obligatory fields, the `struct` needs to have anything that the widget needs to work. + +Two obligatory methods need to be defined for the widget to work. +`frame(w::MyWidget; kwargs...)::AbstractRenderbles` is the function that gets called when the app's display is updated. The renderable that is returned is what gets displayed on the screen. +`on_layout_change(w::MyWidget, m::Measure)` says what should happen when the app gets resized. The `Measure` is the new size of the widget. +Usually it's enough to do something like: +```julia +on_layout_change(t::TextWidget, m::Measure) = t.internals.measure = m +``` + + +To get an idea of how to define a widget, take a look at the source code of the widgets that come with `Term`. \ No newline at end of file diff --git a/docs/src/ren/panel.md b/docs/src/ren/panel.md index bffa31747..8b5cf59c5 100644 --- a/docs/src/ren/panel.md +++ b/docs/src/ren/panel.md @@ -88,17 +88,15 @@ You can justify the panel's content to `:left, :center, :right`! ``` And style the title and subtitle, or the whole background too: ```@example panel -import Term: highlight_syntax, apply_style, do_by_line, fillin - -syntax_with_bg(t) = do_by_line(ln -> apply_style(ln, "on_red"), fillin(t) |> highlight_syntax) +import Term: highlight_syntax Panel( - syntax_with_bg(""" + highlight_syntax(""" function show_off(x) print(x) end """); - background="on_red" + background="on_black", fit=true, style="on_black" ) ``` diff --git a/docs/src/ren/tree.md b/docs/src/ren/tree.md index 68550e0ce..77bb2c4c8 100644 --- a/docs/src/ren/tree.md +++ b/docs/src/ren/tree.md @@ -19,7 +19,6 @@ As you can see, the starting point is a `Dict` with `key -> value` entries which If you have nested data, just create nested dictionaries! ```@example tree - data = Dict( "a" => 1, "b" => Int64, @@ -32,41 +31,82 @@ data = Dict( print(Tree(data)) ``` -Easy! [`Tree`](@ref) has lots of options to allow you to style it as you like: +Under the hood, `Tree` just leverages [AbstractTrees.jl](https://github.com/JuliaCollections/AbstractTrees.jl) to handle tree-like data structues, so anything that is compatible with that framework will printed as a `Tree`. + ```@example tree -print( - Tree(data, - title="my custom tree", - title_style="red", - guides_style="green", - guides_type=:boldtree - - ) -) +# expressions +Tree(:(print, (:x, :(y+1)))) |> print + +# arrays +Tree([1, [1, 2, [:a, :b, :c]]]) |> print + +# and more! ``` -And of course trees behave just like any renderable so you can create layouts with them: -```@example -import Term: Panel, Tree +Essentially `Tree` work's with `AbstractTrees` to just produce stylized output. + +!!! tip `Tree` is not a *tree* + `Tree` is an `AbstractRenderable`, it is **not** a datastructure for handling tree-like data. It's only meant to be used to *display* trees in your terminal. As such you can't do operations like finding children of nodes or getting a subtree etc. All of that should be done with `AbstractTrees` and `Tree` is only there to display the output + + +As per the note above, `Tree` is a `AbstractRenderable` type so it playes well with other renderables in term. + +```@example tree +import Term: Panel + data = Dict( "a" => 1, "b" => Int64, - "deep" => Dict( - "x" => 1, - "y" => :x - ), + "c" => (1, 2, 3), +) + +_tree = Tree(data) +_info = Panel("This is a panel\nYou can use it to explain\nwhat the contents of the\ntree are!"; width=30, height=_tree.measure.h, subtitle="description") + +print(_tree * " " *_info) + +``` + +### Styling +Easy! [`Tree`](@ref) has lots of options to allow you to style it as you like. +The style is set by the [`Theme`](@ref ThemeDocs). + +```@example tree +import Term: Theme +using MyterialColors + +# create a new theme editing the tree style +theme = Theme( + tree_mid = blue, + tree_terminator = blue, + tree_skip = blue, + tree_dash = blue, + tree_trunc = blue, + tree_pair = red_light, + tree_keys = yellow, + tree_max_leaf_width = 22, ) -tree = Tree(data) +print( + Tree(data, + theme=theme + ) +) +``` +`tree_max_leaf_width` sets the max width of the display of each leaf while the other values set the color of different elements of the `Tree`. In particular `mid`, `terminator`, `dash` refer to the lines (or guides) of the tree. +And since we're talking about `guides` you can also use different ones +```@example tree print( - ("\n" / tree) * " " * Panel(tree; fit=true) + Tree(data, + guides=:asciitree + ) ) ``` -!!! tip "Entries order" - Used `OrderedCollections.OrderedDict` instead of `Dict` if you want to specify the order of entries in the `Tree`. +there's a couple named guides style, but you can customize things even further using an `AbstractTree.TreeCharSet` if you wish. + ## TypeTree As you know, Julia allows for hierarchical types structures. Trees are for visualizing hierarchical data structures. So... diff --git a/examples/live_renderables/app_layout_only.jl b/examples/live_renderables/app_layout_only.jl new file mode 100644 index 000000000..a2e86fd32 --- /dev/null +++ b/examples/live_renderables/app_layout_only.jl @@ -0,0 +1,26 @@ +using Term +using Term.LiveWidgets +install_term_logger() +install_term_stacktrace() + +LiveWidgets.LIVE_DEBUG[] = false # set to true show extra info + +""" +Example on how to create a simple app without any specific content, +just to specify the widget's layout. +""" + +layout = :((r(10, 0.5) * g(10, 0.5)) / b(10, 1.0)) + +app = App( + layout; + expand = true, + help_message = """ +This is just an example of how to create a simple app without any specific content. + +!!! note + You can make apps too! +""", +) + +play(app) diff --git a/examples/live_renderables/example_app.jl b/examples/live_renderables/example_app.jl new file mode 100644 index 000000000..e76111354 --- /dev/null +++ b/examples/live_renderables/example_app.jl @@ -0,0 +1,92 @@ +""" +This example shows how to create a small app. + +We'll build a "color picker": the use can input three +numeric values for RGB and the resulting color gets displayed. +A button lets users select a random color. + +The app is made of a "panel" showing the color, three InputBox +to capture the RGB values and a button. +These are the steps: + +1. define layout +2. create widgets +3. create transition rules to shift focus between the widgets +""" + +using Term +using Term.LiveWidgets +using Term.Consoles +import Term.LiveWidgets: + AbstractWidget, KeyInput, ArrowRight, ArrowLeft, ArrowUp, ArrowDown, set_active +import OrderedCollections: OrderedDict +import Term: apply_style +using Term.Compositors + +# ------------------------------- app elements ------------------------------- # +# create some widgets +rgb_visualizer = TextWidget("") + +R = InputBox(title = "R value", style = "red", title_justify = :center) +G = InputBox(title = "G value", style = "green", title_justify = :center) +B = InputBox(title = "B value", style = "blue", title_justify = :center) + +button = Button("random"; color = "light_slate_grey", text_color = "white") + +widgets = OrderedDict{Symbol,AbstractWidget}( + :A => rgb_visualizer, + :R => R, + :G => G, + :B => B, + :b => button, +) + +# --------------------------------- functions -------------------------------- # +function get_color(ib::InputBox) + text = something(ib.input_text, "0") + text == "" && (text = "0") + + color = try + parse(Int, text) + catch + error("Failed to parse $text as a color") + end + return color +end + +# define a callback function to update rgb_visalizer at each frame +function update_visualizer(app::App) + r = get_color(app.widgets[:R]) + g = get_color(app.widgets[:G]) + b = get_color(app.widgets[:B]) + + viz = app.widgets[:A] + + viz.text = + "(r:$r, g:$g, b:$b)" / apply_style( + join( + repeat([" "^(viz.internals.measure.w - 4)], viz.internals.measure.h), + "\n", + ), + "on_($r, $g, $b)", + ) +end + +function set_random_color(::Button) + app.widgets[:R].input_text = string(rand(0:255)) + app.widgets[:G].input_text = string(rand(0:255)) + app.widgets[:B].input_text = string(rand(0:255)) +end + +# ------------------------------------ run ----------------------------------- # +# create app and visualize +layout = :(A(22, 0.4) * (R(6, 0.6) / G(6, 0.6) / B(6, 0.6) / b(4, 0.6))) +app = App(layout; widgets = widgets, on_draw = update_visualizer) + +button.callback = set_random_color + +play(app); + +# TODO on highlight stuff + +nothing diff --git a/examples/live_renderables/pager.jl b/examples/live_renderables/pager.jl new file mode 100644 index 000000000..fc8541af7 --- /dev/null +++ b/examples/live_renderables/pager.jl @@ -0,0 +1,41 @@ +import Term: load_code_and_highlight +using Term.LiveWidgets +import Term.Consoles: console_width + +""" +Simple example showing how to load a file's content and highlight the syntax to then +use a pager to view it in the terminal. + +Multiple pagers are visualized via a Gallry widget. +""" + +import Term.LiveWidgets: LIVE_DEBUG +LIVE_DEBUG[] = false + +filepath1 = "././src/live/abstract_widget.jl" +filepath2 = "././src/live/gallery.jl" + +gallery = Gallery( + [ + Pager( + load_code_and_highlight(filepath1); + height = 40, + title = filepath1, + line_numbers = true, + width = console_width() - 6, + ), + Pager( + load_code_and_highlight(filepath2); + height = 40, + title = filepath2, + line_numbers = true, + width = console_width() - 6, + ), + ]; + height = 50, +) + +app = App(gallery) +play(app; transient = true) + +#TODO pager update tot lines, line number... diff --git a/examples/live_renderables/simple_menu.jl b/examples/live_renderables/simple_menu.jl new file mode 100644 index 000000000..8c07ed3ba --- /dev/null +++ b/examples/live_renderables/simple_menu.jl @@ -0,0 +1,29 @@ +using Term.LiveWidgets + +println("Please choose a menu type:") +retval = + App(SimpleMenu(["Simple", "Buttons", "MultiSelect"]); height = 3) |> LiveWidgets.play +print("\n\n") + +# get the selected menu style +mn = if retval == 1 + println("\n This is an example of a SimpleMenu") + SimpleMenu(["One", "Two", "Three"]; active_style = "white bold", inactive_style = "dim") +elseif retval == 2 + println("\n This is an example of a ButtonsMenu") + ButtonsMenu( + ["One", "Two", "Three"]; + active_background = ["green", "white", "red"], + active_color = "bold black", + inactive_color = ["green", "white", "red"], + layout = :horizontal, + ) +elseif retval == 3 + println("\n This is an example of a MultiSelectMenu") + MultiSelectMenu(["One ", "two", "three"]) +end + +println("\nPlease choose an option:") +retval = LiveWidgets.play(App(mn; height = mn.internals.measure.h); transient = false) + +print("The menu returned the value: $retval") diff --git a/examples/live_renderables/tic_tac_toe.jl b/examples/live_renderables/tic_tac_toe.jl new file mode 100644 index 000000000..13dd91161 --- /dev/null +++ b/examples/live_renderables/tic_tac_toe.jl @@ -0,0 +1,179 @@ +using Term +using Term.LiveWidgets +using Term.Compositors +import Term.LiveWidgets: Esc, quit, ArrowLeft, ArrowDown, ArrowRight, ArrowUp +import Term.Style: apply_style + +""" +More advanced example of how to build a function with +a bunch of additional functionality and customization +compared to usual usage. + +The app allows the user to play tic tac toe and to read +some instructions about the game. The tic tac toe "gameborad" +is made of cells. These cells gets highlighted when activated +and the user can choose to place an X or an O in the cell. +""" + +# set layout with cells' 3x3 grid and a pager by the side +h = 9 +h2 = 3 * h - 1 +layout = :( + ( + (A($h, 0.15) * B($h, 0.15) * C($h, 0.15)) / + (D($h, 0.15) * E($h, 0.15) * F($h, 0.15)) / + (G($h, 0.15) * H($h, 0.15) * I($h, 0.15)) + ) * Z($h2, 0.55) +) + +""" +The board's cells are TextWidgets, define some function +to change the widget's text when the user draws and x or a o. +""" + +""" +write a X made of multiple line of characters +""" +x = RenderableText( + """xx xx + xx xx + xxxx + xxxx + xx xx +xx xx"""; + style = "red", +) |> string |> rstrip + +o = RenderableText( + """ oooooo + oo oo +oo oo +oo oo + oo oo + oooooo"""; + style = "blue", +) |> string |> rstrip + +""" set widget's text""" +set_text(widget, text) = + if text == 'x' + widget.text = x + else + widget.text = o + end + +""" +Define some functions to show when a cell is highlighted +""" + +function on_cell_highlighted(cell) + cell.panel_kwargs[:style] = "whie on_gray23" +end + +function on_cell_not_highlighted(cell) + cell.panel_kwargs[:style] = "dim" +end + +""" +Define keyboard controls +""" + +button_controls = Dict('x' => set_text, 'o' => set_text, 'q' => quit, Esc() => quit) + +""" +Create a widget for each cell +""" + +widgets = Dict{Symbol,Any}( + map( + c -> + c => TextWidget( + ""; + controls = button_controls, + as_panel = true, + on_activated = on_cell_highlighted, + on_deactivated = on_cell_not_highlighted, + padding = (1, 0, 0, 0), + justify = :center, + style = "dim", + ), + (:A, :B, :C, :D, :E, :F, :G, :H, :I), + )..., +) + +widgets[:Z] = Pager(""" +Tic-tac-toe, also known as noughts and crosses, +is a simple two-player game that has been enjoyed +by people of all ages for many years. The game +is played on a 3x3 grid, typically made up of +a pencil and paper or a game board. Each player +takes turns placing their symbol (an "X" or an "O") on +the grid, with the goal of getting three of their + symbols in a row, either horizontally, + vertically, or diagonally. + +The origins of tic-tac-toe are uncertain, but it +is believed to have originated in ancient Egypt, +Greece, or Roman times. The game has been played +in various forms throughout history and has been known +by different names in different cultures. The game +was known as "tic-tac-toe" in the United States in the +early 20th century, and it became popular in the 1930s. +The name "tic-tac-toe" is thought to have come from the +sound that people made when they made the X or O marks on the game board. + +Tic-tac-toe is a simple game that can be played by people +of all ages and skill levels, making it a popular pastime +for families and friends. The game is often used as a tool +for teaching basic strategic thinking and problem-solving +skills to children. It is also a popular game +to play in the classroom as an educational tool. + +In the 20th century, tic-tac-toe was adopted as a game +for computers, and the first computer game of tic-tac-toe +was developed in 1952. Since then, it has been used as +a benchmark problem for artificial intelligence research +and has been widely used to teach computer science +students the basics of game theory and artificial intelligence. + +Tic-tac-toe has evolved over time, and it's now possible to +play it on smartphones, tablets, and computers. There are also +many variations of the game, such as 3D tic-tac-toe, and +games that use a larger grid or more symbols. + +In conclusion, Tic-tac-toe is a simple but challenging +game that has been enjoyed by people for centuries. It's a +game that's easy to learn but difficult to master, making it +a popular pastime for families and friends. The game's simplicity +has also made it a popular educational tool and a benchmark +åproblem for artificial intelligence research. +""") + +""" +Define a custom set of transition rules +to specify how to move between cells +using keyboard controls. +""" + +transition_rules = Dict( + ArrowDown() => Dict(:A => :D, :B => :E, :C => :F, :D => :G, :E => :H, :F => :I), + ArrowUp() => Dict(:D => :A, :E => :B, :F => :C, :G => :D, :H => :E, :I => :F), + ArrowRight() => Dict( + :A => :B, + :B => :C, + :D => :E, + :E => :F, + :G => :H, + :H => :I, + :C => :Z, + :F => :Z, + :I => :Z, + ), + ArrowLeft() => + Dict(:B => :A, :C => :B, :E => :D, :F => :E, :H => :G, :I => :H, :Z => :A), +) + +app = App(layout; widgets = widgets, transition_rules = transition_rules) +play(app; transient = false); + +nothing diff --git a/examples/progressbars.jl b/examples/progressbars.jl index 233205c67..a55166e34 100644 --- a/examples/progressbars.jl +++ b/examples/progressbars.jl @@ -1,6 +1,7 @@ using Term import Term.Progress: ProgressBar, start!, update!, stop!, with, @track, addjob!, render import Term.Consoles: clear +using Term.LiveDisplays tprint(hLine("progress bars"; style = "blue")) @@ -21,7 +22,7 @@ for i in 1:100 update!(job) sleep(0.01) i % 25 == 0 && println("We can print from here too") - render(pbar) + LiveDisplays.refresh!(pbar) end stop!(pbar) @@ -29,7 +30,7 @@ stop!(pbar) Or with multiple jobs """ -pbar = ProgressBar() +pbar = ProgressBar(transient = true) job = addjob!(pbar; N = 100) job2 = addjob!(pbar; N = 50) job3 = addjob!(pbar; N = 25) @@ -40,7 +41,7 @@ for i in 1:100 i % 2 == 0 && update!(job2) i % 3 == 0 && update!(job3) sleep(0.01) - render(pbar) + LiveDisplays.refresh!(pbar) end stop!(pbar) @@ -62,7 +63,6 @@ with(pbar) do update!(job) sleep(0.01) i % 25 == 0 && println("We can print from here too") - render(pbar) end end @@ -193,7 +193,6 @@ import Term.Progress: SeparatorColumn, ProgressColumn, DescriptionColumn, Downlo FILESIZE = 2342341 CHUNK = 2048 nsteps = Int64(ceil(FILESIZE / CHUNK)) -@info nsteps mycols = [DescriptionColumn, SeparatorColumn, ProgressColumn, DownloadedColumn] diff --git a/examples/tree.jl b/examples/tree.jl index 798b6cff6..0ee1ae561 100644 --- a/examples/tree.jl +++ b/examples/tree.jl @@ -6,7 +6,7 @@ The easiest starting point is a `Dict` object with the info we want to show in the tree """ -import Term: Tree +import Term: Tree, Theme data = Dict("a" => 1, "b" => Int64, "c" => [1, 2, 3], "d" => "a b c"^100) @@ -17,22 +17,23 @@ print(Tree(data)) """ print("\n\n") -for guides_type in (:standardtree, :boldtree, :asciitree) - print(Tree(data; title = string(guides_type), guides_type = guides_type)) +for guides in (:standardtree, :boldtree, :asciitree) + Tree(data; guides = guides) |> print end # set the colors! print("\n\n") -print( - Tree( - data; - title = "my colors", - title_style = "bold red", - node_style = "blue underline", - leaf_style = "green", - guides_style = "red dim", - ), +theme = Theme( + tree_mid = "green", + tree_terminator = "green", + tree_skip = "green", + tree_dash = "green", + tree_trunc = "green", + tree_pair = "red", + tree_keys = "blue", + tree_max_leaf_width = 44, ) +print(Tree(data; theme = theme)) """ Tree can handle nested data too! diff --git a/logo.png b/logo.png deleted file mode 100644 index e6c46e63705f9580bb8fd79c835cceda314d172a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427694 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%0AW3Zek}`MNDS22~ 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

^M{?aDsPsU_|9E&dKZd5c1& z0E5nVKP$BL604>ua_fpjN=1J({JWmvKcv7|0sp5GSmK@=m0ss}MOLXv31~GXB~bAY zeOawU3uxN7$X9%p$H3UIu0h|IphRyjg#W1kMh)*jwWjhuA-eN&Dyas5MJmq#^N1nR zaztuC+4*iZ0uKnJd#(Pu^TB`Q*0L#p-j}K+C_nq()ml(8)hjdnA4nD2AAhOi|NGaa z(isS&|B%!Mp(NNra)ksyVc?t62e`{#^UJH7GvHJeTNxsSse`_{YH^ z4CMivv;MLKkX)jnz6;SnIc093?%>&XjElP0f8H6mWe@O+|8Kz~N(A|Lr&XTk!0RUU zylo2Qlxef!{GUCe#6^8as(>m;{O@7-&(8isy~u-7FaD28)xSGsHZcPHn`=fAz!OT{ zzC64CKYM1x22fkC)hSVxpZ{YR{x;00;culyjrJe=ga7^k=WOY9cPhL~SLY}SDH_Tc zGA~xKeG%Vcukc*qjn->$>*h*vh3Y$MO>UKCL@slkert1LJ^y(so+0dmD+cW_#cye*KYSzw z&Hp)cqM*)2A-%6k&#EdC1hMquM`BsbLmA@IY0mHNAtDU0-sfpO--&eE?0mQ9Gwhk< z!>=9QAC(mOLVp`#HJI;c#>gqyd#{VG^(D_N#IYP?Sfe{MG=x4O37`|SA|Ir`q@|(F z5uKV`e^eJf6FXFrf{or!$ z+S7KTN<=>e98Ju7rwI7UY+g${T$5~B_I+UnBuxo?6k`r#Tk%8uW-CXx`3Z%W@^`9F z@cwAvJ-(q#xoH)&{;wVZ0i^zCrjOcGxGq|87c7?bQC3Xc@%vsZBE}9+jnajx5w%}& z#RB#ROn$s>WTprR$HEE5lai;QbG<_h1$@m?%u z;s6Z=Ci`ON{w!D4}u;Tpj#irEzYu} zqhUtkLIIP~)J1^&u4cGb%~S9KENVt^O3_b`7rvA(eVtSMM~95_zv++**wLG|tox2n zp}5FvbJY?}EP5MYk|UCkq?_F7Nqp6k#gV~{TYH?3 zn40cEEeSba&+|Ri-K66$FWI5sCsc2A;zr2MZgI;Y)3|THo4?KxSfi4S;$FwZ;BssxMnvNFTaP98Z~VTx(*iL? z$yI?u&X1ORFSDQX{o?nMJG%(A{_gp|*n6v}xPrf1Fu1$BI|O%kcY?b+!QI{6H8{cD zHCP9C*WeN$cw@Ku-*0B_T{CNa^E6NMLesrYcU7ILI`y-?_p+c3vo&YwYPfm#JfGsn zI=r5*gmppMdKNX_V>4ANuVM+*bGox2QLL#2`S%4od}=nz-&|?VEZ)WB1xw%>JIw$>=k!=dvixJ- z?mbbb!#rED4qx+YEA)WivAwQAS9beUNw5L*wsW3ev&?s{cjwn3&Vrd4v56>ZcIy0W zqE(CJuXtE%DZXVQDeI|IH`9cZ;v5OQICNeDc>U+kN06gvuA96C&deL!A6?fkq&d$$ zysn^PmNtzipw*8VI^r8%e!QF;JhnphyDh(n2ALu6QSUUJg3H|FC&sR4HtvQ1$cIL# z&2|Dqw%@Ll$F^Wc+D$F{&6k)+T>do{B+bKieeRZSSu>(`bVn>g7(}biWG8lfN8kC5 z=!HXVj+z~ySYegTm=+hV-sYrf03A0N=8KhcDcR{%pZLq;X@^f#zW)0je^r$z$fnU% zQmO;NvMICq+`9$=A)Ly(x<6am+GIdN^!l$ycF#xW%oNk_%2FPls?O00SuCn@a&o0@ zZBlgxo#fxXVa?C2!392#v!D4k5~r9NFE1?tTB|e5;GG*uuawhO3k@TNwimEvmrI%{ zA#^UPyu;_0HfbFWxl7+)O{#=FRb0xyrlj2W55L^2bsi_qUr$9BCGS?m;$3&D#G_~mW(<0$0$-Qh^fYP+*JsJLx05It$JdtmHFL*GUa8MI09} z(cuODN=VHE+)@%HrX0KkHaAxpdKpZ#A{;ff%sZT??=BagCmnwXU;0k_ZM`l$k)d3>8f~Q#cApQiudZCq6Shxn zT&q-D`c=EH|2(9FTe}){N4yGGJ>< z2fOofXjbx=-t>WJS^p!@2J^|{)jJk8r2CwbE5*_}BNH5?G`9-K;u#y6Xab zLv;-Oz%aFMvG`#;uF3gQccmZIV2_C*okz%km##AuQWcM~C)~Pw4-V)&!YElF)y-h; zvw*LLzJ{m?sh2Oi4w(_FuuQ6RmbYliu`zWt^<8_+~qNnbj7DefUFj%+c0DMxY>XGlx9fDB;?_ZNq1*5vH{;A?9=+6XVk9iL-;}5G-cysnrhRj2MIcBQREdcz8JR zd&$n?Zx2*TdiacHl$7er^$+EP+ZiQ!SJz#u%}#Sr-u2qsh#8dD%xf1Qx!UffAo1_e z`)cqyddst;AWnkw)sT83qdsM5$T+rYbW}=v>jG=E|NC4D2)SKVHLPnZ@P>fkJGR)# z+lWlGNuzJR>wVMICkvoUGR1UY(tSf8e%|fKd+O?b8q-OcO^K*=nJFyY|0N6?Zd;*x z!Mt|IPpAEqMp+SQC~{%zkdjlvU*@u7RMxwn;p#m;77TxXYJsuq{h>G9Dx1PCwjyzA z>yVLS)?MmyWmMWLz*3ioCvP#l@R4gS3^Z5COZPS6_6HR9tIBb|%BdlQ9uqfCc)s;R z>ve_pGlYuVBUya;j1)xLd>U>4lXVFtM5VB|*r3VELrx8||F%sZ1i^-QqUh$lW}dw` z45+z|mI5@T` zO>c$NZY~)H68lqXnz3MaDkH!9a#30_{b;}r1tC)qYLd7U=RkYYOrms%76JtqWPkXg z$SkEklC^yEg5TWM3JdTYZgfuZ?NmuIAz6s1S^sCD{e{*J(LeZHhMuiZ8l2+X(QzR8 zMV{1LSoaTIpV}7(;>W zf(lC$((;JRB%BM!{J-zWDK!__CR4Uo$UGP4s(s+@KWzNs0kcT6l0D64rLOMltP!O@ z-eD!LcNNHyhOaI|RcXG0biqcFYB_e{mc$zV)3(1I(nIJQ(=n|C&OGU19-?I&Tmr{W zOzu#HWMhd&^FW6)WB8zoPi$teJhb7(X%UH^IQBE5+LGK@8Z@VDb zwO^6Jg}Rk9S#xCG3?&%m`ExcRAiTD>Im3%5!Wf|))P9WE=4JG``tW@?)(VIfRg$Cx z&6B7`%9yjeQPWM%#qv%EB7RKGPuro-$cMe$Qw{{;#;CCgsHq7UcHbn)44k8)Sk|7H z8@m9#2Y1f@#lz>Uc>l->tv&sOd{hF8p8)Di86bp-K9|3%k>H=cMe<*5sTph#_9Ir( zaF@u~-f z{jcj_(waR2KqLe<5w&-{;e?+!61q)?1E(>=o2Ny%5Fu?_YLjP&76Q)Q0r+TK&70XG zY#kTzoQd9?fKt1&$Zkw_2|7=zH4F{s7%K*N7p^_FbeXU}2)EQU>C!d5JoCBr< z_H2-O#%O0o_~pRq{Xm}#T-V?ffIP3veiRg@$wSb9>o$Qo+?EuNEtpp~3&EBX+ippO zkk9za9j?^NHuTFtj@5T2@(K`bCS6ui^7v9wS*hJ-?=NMkJp_y=Sef*mbaS$`Wm`LI zwww_i1**{z4PH+6Nuj-*>_H4ExK&t~n~yJ76sA8TV9V3kn>&gG^AAPb77kQR{4#?WpnJV3O)YfA9xx<6 ziX7PucX5P$7Tszy!KD+FMabF@BINiBeoovlzYxs{#>Mj_GPIypkTB=!4-K;;$Zg#>`3c>{20VO@*9^2u^b#L=v~CxshJ~i zdwglRXLWwN4)^BQm+JL5=s5mX_`3Cdc})f5F9(S1;O-Mgje-^W2!etQ{?Sa1gnGvmB*UX{weCgbFgK2Pl`Ye@UL#^?A(|$HkyC!V-C%DfS-%+RSuOHTNLb;nTF$$`ef$}#VB&Un? zzZ?2gxBr8ZD3WhB+h+}mNOIU>Y2!V~g52-z-1q4_Wb^gybg8H~j|}GCtJ))V5eR$ZVJ2>S~mFY*UI z&Wpj(sDA!y3rfR8YYy{}xmepXt2^3_JjawjkWog4HKO_^)vm@NsHgwDj9^+NUrsT4 z)+0V7N0RMR#1?XKPGYus?+%H5y^z7}|KqCMn8gp3MWon`Q89;*PpHyiQQ|Md8K!9& z$X{^ix6@vv8Uls%8VJv57AY1>h!A_+XkkM5ua7w*C>IPNADaZGp`cOEhqLKSXMCv@ zV^D}DV`if9*Wd-_wO-?F_vQs^$MKDPvAbDT zS7)zlNSkEaA$+YTJ((A`IHsrGrn$(#Q3CYe>0Q(07eb0f@!=!=-OYOKFiBFMOFh}& zlRY$2e=YK0`aRaW7tMZ*_hyZBL1CWgK#;YfZ9h@4(6A)r-71wl3XItJ95m076toE< z4Vb@yRbb_hnIfDC@VFy9^_|jSC(ypT8ZJ=mjA=HLp`1Ag_IQNL!^ZlNMAc4Q1uxu_F-FKBF+CE-+s&lF@>OSODlJ?6nt8K`^O6)r8Q zoA+keZ4?$0eA|<@|6uM5hee2Y<}~D?;vDlF+&(Iwt*bCz^8k4JIeyoNdAIREVyUCl z#<5V&M)|5KGo1!?y%)GBcIht{n`;SNG83i0{Xr*YN7nXm=1VQ#f3%R_OLNX{QG^1D z`doz;X%m9-WY~=Kqu(ueD=^QRaekFser0rGw9Ebv=36?#P4f>kl01gu?~{xnE!{ok z$hoHX28X^R^7!kBnH&iD6m65ibxPj?Y5flg{cpt1Z-~xw0kcFnehbaUou>Ou0Y>cp zh~f8a4Nu(B@$Pdw(yP~5pn@DH(yy3_Nc-nh#y6h&+}MA7*dUj42gH(>Wg2sW(r+N` zZO1cPUxNH={29dgeup-~8``IHy!Y9U{deH*>A6pEx4=1jc{r#}(0L2Q{op-30!dY! z*rIJKKxjV|+6-M*r6Nq*LSM;to%)HaIU)NVTY^bHfjmTiq}jKr2R7po%yU})h2miP$ehJ+Q?>#(}0CR`P z{i#ka?8N+4A{At1|381OU?$(dmPIF_AFl&Ecbe;YO~Q<$782@(kB7&VLoaPNb>4as zorp=#a|_QLC z2DY%muV;^~25k;wolJ2gza`QZxKI3~*cAqtm(GYu@nL_>vmAD39OrQz^6ppeGj9FG z=nwqY%zA`2wnz05s$5y|#psO^o(AW^r?ojzzhS(4)9%~w%l98Ykz)xS#J&+j2Ew1; z-B-{EG8Niy{D}Ll;P)W)xET0-|H#ZYfC2lwfrY)#)A0CxypwHSi*i+n7kUOpO`)yE z9y9E*!s4vulse@*7l%@1YK1~7h&_#M?ZWSB5%5Q9vaaqQwpVJZdQx&>$hz@ad||NQEbhNfoL#;j`~1rDUK_pb*Klg&YDFA1R4PHWQcF%heJ zSuE-?8Ylp&#-a$iUo5Y+bPgU1czV}cYxhKn8H*SQ0inXdfs4&Z87fX;PEqI2uFE+u zJi@lhm&yMgKNQzh?v@DPH#u71jHcFwu7SsanLg&HzOA6Tx@Uv}Hcd`EGvd==bA2q5 zcUAh``W>V~zX~cVOL@B2WBKK`d90O0m%x>eB%e%96r3;Cx1s68Fhc@O){OoqxqbY0 zhBSjH!gl+Jl)yuo+ok%l=27l3@UQcr1QG6MG+11z1{sveW}wEh>Hv|a!rzCZmTirw zoD0dNE?@ODCoE9A$-QHnJL(PDNq5RH4bQ(iIEX?ioC}F*zI!%&JypCr#XHh4#s-Q5?WO zA6k#?=#wN7ANg-F=}WmXM{Y)H;wG1qNj>)tDMH)f_tC<2D%!an7+@<;xzQkcmStcg zOMc#G3+e++P0#$-+;T+wzwZZr?iAA3;)p-8l4w8tM`ef44k8fD-8A+df&5{^{>oHJAtSNa5i7;S0L?_K=ewfJxiw2}%qlxtF41 zD#}L@6~m@~F4}(ouf}Wtua7!XY&FbwCbkqkH3d=Kij!(0)@GNhx-M)|Al#h~g{8Q4 z`-s;I-{UR(YF>kNC6iRw3|U=c=QFa-)i~FKZGQG;gK;O`fFc;=lo+-~YnVH>Qf+Ps zd3!)CNq16Bs9j96DWW|?{slq6T>nq4yW{6cudhZiFS$3HIZuegxI(gZB6Z92YtM0GXjr`2 zGXdJ>|qL0LRmtBfgeBLzJi^@;UDxdzgJ7`tDI|cyj0L zfRM{rQ15pUg})~(1<$MBjJef)gZy+52#)mq`c|bAavOV`pN2;^Z;}VY(HK!7IX4Tt z!R#660@^W!g2V*<4_4|nXiKCLlaXO7uP*(hmBhWSsvSUqwhTrClcwwb$m_Rg`6o-( z^=uHiB5T0Gc(Tdcp?5v=OduJ|uBS4HyuNC|a(w-sz+$rlZhm{4jN~FfOR3;#k?ePECAVtu-AkOPZSQeRh?f0ItQR8uTRHz&y`APLLk8RGZ{(N=KW#6FT;9Ghf>jLQC$CqdP8*wSW zRLEX>Vm0`{=5KoQo&i#MGK9ds^s0Hp6FUqftpkF@2Z*&lKYj;i)LqiPBB&AmQvH=f z^X6(D{6d$oMof38!(RXAdlvE@H($-!3cCQ4${2THS#PGj)qL@W63%UZG{377@E*86>`hswutKc75 zo}LaxxJEuMagF$=L2t0^VZN^mWNtY%&$&=)DEyhW+Il=|S5TxIx|c?x{!5nRvZj?(y(<8vbqUy!>0O2O{3INxL&+IFq$VL%2pbA zybH}ZgXqI_r@{?|a{}1qyH-#95f}JmS=#b*4$o!()~)%5-(J>0RzhBTnNdGOMg%`v9u&e`*&dE>aV za6vON#A{j5NRv5{y}6q(R^njFrbV6}SggQS6CR&)+MpR?fPPG&2ag@1jhbHEzY-#j ze-WOgcr{X@S9)X`xy|1TL!WCSdxS z{OS`*Ic`~J6%%B;GuwhrQSHYMx5=!PFwuqG;^gEU9X*=3Jq98=gE-9_%1lHz^s8!U zGf{-SW>)`Ri(!{r%q@d35~mnryn{@O%!W<+ntQ}h;o(CdIZY7c%gFyZ+_meNqSh^= zR@(v_%Kk^dT#7~0x-ph4R>OnelTgFZqcesF9;5V!H4+C%{tQsQBX?T9Gni4f@-I%4 z3$sygmzU(Hg%Agl*n{n9*p}j3C&YY0aisknA z`0+<|n$Z1u0YwW=*T?h+Rr6S zYM@Q*1pFy%DW_#-P1gM6$%GmU!LI?f*S$)$C>?gMXFMl2W{ZW|7yF6%2V(5o!eV5? zXj1)0PE2PB`g~^KCrao&0f@==F(rE1xD%u&<_J;U4BDV`^?H6FMgbBAvSOUBo(+m2 zpQS{LtvYmapC9rdL9u$WI+pA|l7`x-eF%lfm}f}KMnT`qwieG23bEhdojVx==#5~O zmqkGA0jjk1$f5W0#+~-wKi_i_^3g7L=g|Kb_JAtj%g4;NFH3u}`Bq3KrM2W-6eitO z?_!GXw(mymgU3Z~{?j(l>qU!;%Y&kC>#>i!&B|xJUDww8s<)j<+FP{+ozCa`jBL?> zSfdCyC0O#nR01~qHyv(vWlJo8t5ZQPJyTiKt1bH>uHuaUx8lCz1`YWb5hpQ`XrIS5 z>#&SFSBZ!Xz=)`C5eAB)LrN-E5_04ClZLe_JDnYL%ed^YdjEC|X2teX&~4}}>^LO) znL-Oba4f>ks?xtOu!=`UZuqBllv>If7aWS*_+57@W)~N;h1rY14xcWU;T~<@Hzi?lZ9G44^cA8nsEt9Cjf3xAsckYMbAk z8a(LRmTYs!Hc1}=0Gw(^4xu$J_c^A2S<%L)8s8}bY9IX3X=PUVYN+=)_o&nNrJ7#Q z-+*o(wH{MSXydcm_@@e{3VA0AE~z7|cDU0d?Yvf|ySBM^NN`T#XB!@@J%oB-*?2Y4 z`h}B-D`8}}r^DAcf6TQ{qPoVqX1XQdh)BE@{U4in6AzbQdCbWDA}(ZY;^R;)ob5YN zI_jz-oieSOfSN)C|Ae?s3HYm=fE>))qoZBSo66`Pqt3zk^cgiO9gh*}_52cV^b!lq zP@Pk-PxDsFicLDUgPxk$A+O~}zJ>vP8lk&8UH8(RUhg%C_#CU&tL!mb^vs4mN!^}~ zfD-9dw9wLK5E7NmYg`47-x1vHun_}to=T~>VD4@rqc-I(4$=GHQ}V@Xn`E6)ziqbL zn|}K{Q=CPatco4YnO3ciRm)%Y*ESEw9s0DV)5@Cg5|g!m-$pfCqI{%sQfrg}_O7Gf zL^J#BCj!$)t*D6HnNM`pVx(ha7VBROb_Fyrkozm50 zMpZJTazZhTZhcB61YbClB;F!~wT}j;N{mRiCK?e)HSnIcKcMjn0}#KzUz*556O4+nAAu1Z1Zy1 zyU$F@#;_HwaJI;fzEN8v-SAE3kNhP-0!YkYrQdlOIUH!>H-{0pzfE0uux{olCpoe}xVA zHK74-_-*#8PnL13oU?&~_GEaD?e=8FeIaejL)hqOFl#{cH=lJ-`{4m=^cY-(@wFt>8DKZU_@Fu@m@4nLrM2iFE8 z#{IeolTQ~l9_?1xbFy=`6tH#qsd<7aF@B_wPWo-`SdXTbR+qGK!CC2Hb|#|-D{-gl z@ySDx`x_-qK0J<$9}wcBC2vkJByAodr);bxy!lpEdMuk1>r?!InDWTbpmZbhB8)Z< z&i$5WE;N(71wV_@exT-6=LUeluyH&DySAA|i9GUaNQ-Cwi8n9!=O-!IA~um6Z?S$- zp<~BffHKxuR_53H`z2s!LGbGrs3f&Ux4nFaY$5h+Iyl$g#Lx1!?m5x+75d8f9B+6( z427e7&IhCAZpo^}v$4Bt66`dDsT@#i9nv#2Y)^#|Q+}MHFue)%XY_4+Rl)j&_CsbE|4`bJ)>IXSE%f4q)gExG z3sE56re~F^u@7YT8UT|xhUL7t#4Y_nGKnyInt-jqzv7GU!9OdS6i37`N9$4izM3rV zV*EiYF($rF8^`9kEvD0G8;?oqZObHc$CQ-C>v^P6;mKwi0GP*`&74UZ3m|`kj=D>) zmW`?B7!E`zb$htlVvJmhjDF#&%h@{r&4yj$xP~LuY76@&}k~}z|t{6N}ZQ47uG(Nsh=)@-b zJxuLV)+;8a9*kJN&i5Asww4DqUiWuR?a)#}$-x}d^bFY>?Jby`QsUsgzQrsqE8C>B zBDV32w(VGz{)Hcv(Yycprh9UwrAt7qsO)Dpse5*%<>}C9B(HC8aQ|3c=ikqULkeKH zX}Y}Td@E*}lpmEC!!+tro|LE7m(z3w1Dfvd5kw~sJ!rMQO28d#ZQv=v(l4q1E~Tno(;!Wjw!xOd6248n!4A&zgaau4&{9-e%9d$^ zox7xrkv(EfuKqTkWS;`bW#Mo!a$+)L8s0#2TeSjw1Ro{louw(|UnrjVV4;^&sk`qQXv zBsiRxt(#tW2Nucj*Do^l+Tj2l*?Hi`SA{z__b z!CB;)uEH$zQad~$vRr=xE{ph}sOju(kp|!_HKJbecCn`3fm+b%Fp<2SJvF9&rS5<@3sl-i{e!PZEPkZJLF^Z zA8AB@0i4TbZH;ccb%6MpRU5@wMep9iG>L$DR7*=smP{ZYnb(D83>u)H7|yIhWTRk2 zX;InNEaLm|0II~z?fc~h%jho{@eQ#M1G9<3aW2rtUM}^XHTy84v>U1!Na~3)w;J{y zsbfz181Sztcr`s0wo5N9wF1PtzLeeoi15Cc=9c!;z{~{oFABd(%6#t^=%3-kdYUx2 z=DNE{_Vbvn9Oyj4IkbNH$oMI~12w&d(j~Td{0of*_0r3wBYjQljAT269UNdX^S4n6 zO33xtiKFZ7p|oR)nZ8K%<3na?&idzAKl5LJqnGUcXlI*-v&v%o;y+SZWs0>2yI20oQUymUK zU{I{(JLF`i#tvM1_dx=F+fi>z7{DI0e(B})XIq!-zW}&|0y*b)n8*I!=TOj{;6w#( z)Q#Q&m{NKP+w9>SZO)efnBI~-)Gac?adT^$Q>v?`{q_kd#I2lgZ~M6UZ+zha`C|Q} zFE2~f-V=`UQ>=mg_DY#<>-)IPA=ybg&UfdG*G-Rh z#r;NY`tUt_={p&@q146=Fequ2SE4LSY2>r9s4B(V{%i$Ioy@Hz8|1sSVU=l@UTyn* z(SGfJDQ$9)qI029t1O~Y+9)|?W^t~hLx%FCs=#lQ9ek^`Q+RBW;2YtiMN?|)MG}19 zlK0Yl=_34TyeE7SvwL3yRKS<=a!I4&^`rja5LTmQ&df``kGl(ZIu`GW4y%9Um0EQ= zv$gOdTa$n2Cm*D2*0y`UIB#Fj8qcc;Hv&#6lM)4K^FPY@^XcMB+dVKFkma`}DI3CXDa)ph&>juWZUWCy zZR8O|URJ6J)%*U*#~+QP}x53swdwb;`;G%(H65_E#=M zaP=(mhm_*&Q(sqzmp)wF%9xXDB!|r)#O6#6P&@umTyGw@S|{;6Y`%%YfO5nZ=sMkI z!?tN*LaFqr*6r{sIG#F?%VCPdk#@x{>#p9>QNHr~QIFoJbjlUsht|#;OiAH4x#J#s zh7i=Q$ky)_Ko2d{`XLM%%5zW1B{PR_JRE0h)EK;0dS;V0ELnQ!NX#~B`33t1hAh+Axq^a4T-$=%sgs)*m z;-LTKU78xeNU+mxRY54wpnP_=F1>&vZMx!4zy)}M!%!5?N4pn~L}Fi|QOdKg6ZQw< zLh>It>6?3}{0Q#@qZFh#79=*}$jq-KVROr>*|~00$m1AsI*(4C@ASBDdUpJXY}3v} zdm~P~+QMNf-cB{593golN$LKc+KVu+@jN-cqe1ix7x>uPo2iZvDYM;_Na-}!of6}# zL+c=Z`7qhYZn4|_k!qfhgKu7a^jkG)|KqEBJ2T|;V{X$I_YW%o{)go*A&RY2-i_q# z&i5VFIjmwKU!dB8=8<(F#E5Of(HSe9c)#J6?F4@kr#JB#xoX{%^B}O^v4HdKXK%oK z*Oni>DhXs{Kr}hH+@ds^{zMD~ z!Y^~1k)7}=@g5;M{4r#8<^biIu-B+ZsDS8S8TXsYwC?jrdLJRRwz*6X6LXfUZ%rE^ zO1-CA(rwUYacSeui>zj^@NYl=JtFYk+f<&{NFzOtN)I3ehgEg_4X!O^v2UzvHq>rI zHP;Rgz{@5#MVa!QR_E87t#UdL(0vOLNcM+;qS=twGkURzv5uV=7wOhuRlrQ@tUT*2^$-j14Z$$(YN(W(!V3B>}+MXWXv7pjS0N*sL0XZOa9~-^j<=QNxywmQI9+)UVnCz z>A{sAgC4bZwa4uV!YV`v1Ii1MpFD5!<#TEJrp>eRtFv&sRrZ#~A-{V>m41(dXp|4O zD+vEXp?Z~}kO3Fi={umFxbv2Dl9@o5a=Xp((RIUZpGQFXE>3CvpmqLlEYBOkyezpM zk2aokr~UmdG>^|)p=TDtitJgyWzkxv;d`S(77t*2K2IQEQKDNbD625?MT@lR;>-9> zgMcqk!sBZ5t5&@sd<-8Apx=1Vl!95@!6$ym=mnb6#9*JMvzne^kK;*a zx=(RxR#%bS63Bmq)o$f&%_KUU-gdlVthc@W(Gfo2Yqujx^V#&p3qfP|0wLUtY zru^fo!)*;{>7!q{PaAD`fiDSZccvHHawrK3KZV|#Rrbpp@A@!9{H$D74;FVHP2~-0 zIRyHcroNRuZ8%r5=nC>O@x)BT5@F78e{`o^y;jc!)6f|;?4hKv`#KaU{w)~Lg!5po zRAC!SDYdEcrTZ2cnD$%nBdz@3n6@7s?oJ?AlfX2W-q}r0gVA?|Qf%W)+?PY#!qb(E z59QzOA8U6Ek^Eo{uB5%zkncjnJ9^XaMa<>G@5F5Q{fKif=`j6BXUzeskmRBw(LkBm zGgAYqvu@bD?Q+;BG_P6-L7)g5>y^5-cRQ3txFGkp9k0?;v|@_aeqqmv<@SdAS(9^& zI|gk{&YHe&{xEtdgl$3*wQV9l8!j4Bs%sOCs~y_CpW6B!A16pKt*+00){+>X3yoU0 z-;)8C9@-68-+o5aN=4S{ul{ozSx#*DW_qrbfTIMt`tR)x&7)Ae(TClB%XJm_rET5g zM})(S4Z{UNx2kG1&@rf@ogTaw7vw-~P>-QbrL}@(%SQfePI4;|fGd-^fMhs7EM!iR zLY;H(IHKIgT_Yr|%9r}}s?>W+cv7pS#Kg(BwF; zJldW-dCJ_bn=VUoIl(jFrRgdN)2dkYV>)QQjP$+}V-QN%ihufw8a`k5HA;*NP9V9I zBgJ{XU=BqXA>QpI;L*)wfA$!G1cJRL@hfJx{Y>o5ducbf0id5 zQT0k$hG6k~mJzM0Bn)Ogwq@L6fv3&~QFh6n&}h%*U6n?7B1owUVtxj4CMoC>LKnPM z7aj@Ql4hVJNQU(0($k{J=pnp`Gf}iCHOy-9Wmj~yGYG_c+X9R?==76)xY+)hn7qr0 z2axdo7?PBSFz2Q+EfDZ#d_>FsIQv!$QkDap%$db!2%b03(p}$XkQ^RFmw;6afQYi< zj^4hYo@jbMqpL|CTBLxRwibOSC4{;xG&oz+3Rz{Q>!hGbAd>8UEHV%txU(CbY#Vn< zX}G_4S5sFvOPP1^(>&;2A{MrDexoBqPP^$$7;b!fIVJ^Mc9ZV;^TTMn(|;9U9m1?dw1r4B{K23&Ljr9y>l7oB^=Zvht87)3OZa=v zF8E@BNu(e8QaKRzygoJ%wIKFawtnz)pRssDi_${^_|%{IjeW-gx*u|HeBCb%QAbEs z@tmEQh4iK_QwG=1R}m4H9yzaw!f^UBu zQzoomH_~~>h*Nd4nH!{c8S2Y7TngY}Ttxfd_CS2S7g6J8BPG3&hH%!0ET#tpS=(QK zSHSMhJ)#2cOPOR?%EwnQtT_B?&K{{BfT3QD$EzXQ{{WhQWYpWbGNr7_u4OLJho+i;2x48Er6 zOYQXklbzHMjfqeNdi46f)W*q_W0Vq^#F4@!Gzz=TMhDMr!|aj#<)PCPBhOIXQ{pA| zec9rzi&Wynh~+!<8UoqxPU4F@;)`F%D>@Sjn2Se!t?eN^@I>~Ts5@dqZzZ1#%TXb@ zoPV^yyCNl3qI{#p8Wunx?$wdKfZcp(c*=05Uaq^^AVElYO1Eo(|i%m z#=I%GOHJ|1ho~0rFLY6xfJMP?Y#vI>i}=+<@m)y(Wy-teykr62ES*&*jp;&bmh^h@>$i?@WP$bHe%muO(ciDm<$CF6)vXqJEDZS=6gave*w}EG z^Po-@SoV@2_NIpGT#u$R5pl@3Y?{lD$_Q86r9nEp$TqoL3b^hc*fJl_Q9U%QBtJPg z$zX8nwg5o=-%+kRz1xzs0?;NyS zU$VhlOr=QGlF{)TcLMW^4meSFeFso1`8~*3FAZWnl-6(k43Lrs6-{H^c^jzgm>XJB z!qpQmbJufzB{k7^NM&B}8lHSjx$1gcBUw;0eK^;nh@|F!M<7V zU9?GBHxCpXQx3%zqS$jiu0!cJ8fz;y3QQTbdQ`;el3Ua&9H@gpy^mME!s7=flB3dn zn!7RDIA;v1J5aNC*pdSgB2J`dYeZ5b7D{%a;Io#pgIE2IfhXRL3mHCl_0xMelDQFG z4m?LJ#s~mW#nQeBlCjZcyj8x9(6&|PT+L3q{&Lf}3mgbvv3rD^<8mXDHQQh&FDTl!zqt@NbquIBg!dC=l)$-{2 zc0#IrDc0nzSIB=K1PPL!%Nppa8qHZ$h z=&Xt)No*0NLz4nm7c2Ks%T{I^Dfc8fskr^}rX=}KPwJ1ADDkjd3c!{+n1)iRGSZ1= zDjU}I3%Or5M<$hqgy2}d;kq)sV(}^$%om4mlV0@9XrhYb+$yt~lhSWU#7n6YAt^~I z3V#C`c2GyEk|bCGIye-(=d*3&?ozB3nibiuamM8oq-9{wW~h6431K~pHOjSc8E&vG zTjDTMAb2?)H2WB#$08&}hpQtZ3*SK+MpKNeL=2}H`3liP2Q_Z?^g+$0i3%&mJ?`5S zCs+?~Yl77-r0w^y(2dFAllyP=bJi?2QTj471($=#-AY&rlF-dB&&RPNbrw$dja028 z7tpML_&qa|kA)=9pkN-M{hq100ocHlHzjE}ic`97GY`wvjpLkMT<4hy)^utbiQTn9 z+|w-60xL>*PG@-r^mk#&Wq9EoE2S+LbaNbdjQ>REDd$FH#e!2 zf}X!Pj)GMp3{cEtCXvyEVzZq7qBh1v|BfU&#`VrW5ACF-y*2A4sd=fHIfyXF5S+O$ zxNqr~_0R-CXR@ZcZGu{7Euj zj<*I?v2)F{!#rGZq4PSLovqZ9-0f$=m7L=N9GT;!m_>yvjXqB1AW~c0|MrAa|17*e z`LYUM{Jxp39=y>(5Tq2=nREgexAw(p1b_Jz_5AkY0hc=ZHC!Ws^8s5T?`o%89+_m5 zWEN0Sd&sa{HNqm>rR3<%g~zLL&>}wgX>(r))vO zLmmNyn*;r{qM4KfjlxHjbb zB%92v4~+58GWPSDWcKkVV0y_d1WE?z=XB5CYmf?I9e`+0f8eKETzZ(%bhb6#VFP#C zE{#tn4bkt;)M1cQCzDf0Qq{lgcWInm8HMJLjdw3)oOH4C3;J)ZFjL}^1P6%Dmsi36 zGo-q}8GXcmSz7p`;d>JtgnrMOB~5i^_N9pnZ3XsDs#vHFY-NxRoE4OY2jYU&PSJw1 zN`3wdQ8(ot6C~RLzvV8k84gKfVRq5An~y&SuPQzu^JQxEZ<47s8Bm_uBMg&;Tf|$B z81h`#==JV&TKpF=z@~PH6`2P`(EDO{wiuQcJSK>|2o@Ez-pm@1(<&3e#@8kEDL{c* zedT)OufZTYNGO=bD3W;P)5=>}*sy|L$=Ttg(Y#3KBLg}5Ky!B&Jp3Q{`H#+Opha!C83~oE%WFe55<^E+zg^u5R zG|GTPcJ*}cCNbIP6)7sr>9+%7M*mO|^Z;72FOiu&qLY=3(SYbn<^SyLtRN^Tazz|q zvQ;bLugzjZB}qyNI(Z_)q?l>J{qaEqdAYl@ImQZ3`s^_}elMyxWaZUNX^Cjp1KGNj zi-xV=SgyWG)ZXYFM_KmoB=gmi?#MN^)`MGS(r89XU!d3??gWUU@0oh&lKECbC3NTa z7V2MrU1c;CNK7zE(!S4I0)1O8;g2Y?Ouhfv;2$3!_wR6Vpb3N%c;>t7_?)DUf^8vI z9^3fLuimI!ypzLCyxcI>=B}8Q?Uv@P8ssK+6y(Rh=yXtCau0qfv~6n1O~EFh0fABF zC>7>paQ}i_M^X&SQ@Hnb%iKY&ilE6*f`*+qX#anv%Kp=aA(1}#=VXB^_aO_`efF%b zqFos=p^1AYV<&SRjhXM#3I6UZHmN1;pemz4x`=L!L{<3CB64(Lf{p4?_lLRQWO76JuDMUxB0#mP1P;GlOfeW^FUzK$Olny?oIje#kS|AVo&jEZaPwnY;lNN|S)r?B7- zg}ZxjcY-^?J-8JXT!T9Sf(HpMK~gvbcXxk_{q1wwdFQ^??)ybGC~DPObIdV^^xj8r z#AdcW-^T1jFi;LzZ%g{Uq9#ykag?r`j{OdS*vA!vWnWI`TQjfUOzNd#+%~JErCW(Q zz~*}K0s^+MDaj@1!g&ah!l}R`?vSh5RfrU>e%WjWLK5>L61j4~`&OuCy)G4^QW#Rr zhc#sl4E&UZ?%%28Kp+%3&v(~shcSeZq$JRvKYz{+XP%QXxU1g8(5DzqPEKvAVO$=l zmE?>2dYcs~dW%6TmS{s^qc+2iJ0LEWO1rVaS1h|}OcX3mlV%mwsBBgzEOU)+^+ZDM zv`5expj$J_&fz-iI9F>|PQ=?LbksNdYju4%=S6!WqGCh=lZ=;;Ig zSdMR{%4Np#qw?06F4->G;Zh{l<)Mmp>l35)_s^wf78Zj?`U{&o3BhM&jg7t%0tJY! zuLC#fHG6oQb?z?rX%Ns4k^v<_6RF{0Cat~pCI;M3X6 za#Y8aJSO7HSIev2t)&NIRDvXHT9Fr@AwpviMtuFUDA#Hgu=2_;ht_d~|8tL$8T7!@ z7gAygxBI1OIU!Fh41s!gp}Lb}VzyfCE)c@q^Cd1mFjRugY?dVrZ0Gg+2ymsaQ@A`@ zO{;br3S=rdbO=|62|Zy~!^5e}Ff*6Jm^)}N!lroAA0`*NFal>Zb0`y?b3cpAoC)9tdd(;nzT?Yb`yqtOOn zJSVD#eWq$CQRfdekQsBpmBBmJppkLWuH#6hk(q+cv{KyrZrTSms{U+5?`Bj}nc_VA zK@QT#1T>;m;lE!F&x&@wJC<6mKAPXdfvd#80xUyJv;ZF`Q1IpXXDJyzXX>S~I6>so zIV9lG7$7JE9-sN?R5h<CQVn~^LzQn|T92o!HUg-?X zjPU&2DgO5DTl4vgG&a8n@jC|{@qwZ-_DfHp=jA+vOXxp#GI}DLiP-Bn)x#`m_#=PV)hR> zkXZXuZ>a<`+~U4|2*erYERu1AG{1u3krO9%LS0U7CSaSrw^OD?{ip;4)FflxF^XXl zE1`Oo1K0=Y!S+^XQWsT2Lx(K1y92s>zgN(1g80WC$>=1J9p)K50T$1zi&B1{&xTd{ z?Vw~_ToJogUqZ0!*OAXIu_$50Rdjq;FM+b7`(oKuL09hY-oM{S&ET%- zBY8W6AxFOa9sqsxk45os=>9zJd{WgmVB&T#NF5rwa?#b}m+t#ZBB&G$?-HFB5B4Ni z%H~Iku5BsvoxTZp4SO<{MtckUR^A?=quBoMtk?Qjp*dse5W(cCUE zv*{hy$xi?0pL*WyjNRMEz+ez~W^^oi^!|A&4Z>M-6I_QV{NqeMtMyn89*CcfczYv2V zQyVH<)VDp**Kr(6=h8Nax^z35&yIG)7Yo+*GgL0!vpRu(sAvU-S+mX#BI94805e~u z_;!gC*zvN*h{y38;(#)Z4H`hwdyBL~>VMN0&wAy>zMN@}^$K!RJ2XWT_YDj3rbqbV z@;Jvd3(W_@^SIl8ym|KRd~$l4fX6|IY`4?;5}d~EZ_Jk;e@RPU=QfP)2qO>S{)-YG zD(TA;^0>CHb$Q?w+H3i;3jj9V7)lS6l{Fl1D_&C&f~ zKgT~YitN3NB3RBN!b{eTLAOJ8OZYt7%&0_E>UBetQZ~8rp)4W6;&@|m~WQN3;@-Mu~cR|iSw+hYMncE@mU-3)(hBO@cgLt7REfYCt-OMFd) zlYF>^2j20y>FgdIy6U%t`_HozVtr}9-tzMDims(W)O|=qlku6$%!NP(V_Ceoj;>CX z0A8WL&S-Tl*KOP~+Vk~IMNNf4s{ueDnj3pc9>x#l6D1MyBd|(2?lh;@kh8Zx;X9eD zFV+&u_=Ymp<+jf~1n32hKET^wkPtN3D1JrVm~yU;S|wc)TS$my+&rnJwezvG3wr5234(nI#~sMK$oz_`@V z-%lK8*$%AZ9C50}IzE2wSj2-&<=yz)_KSy?S}EJ4Z{XV3>D1_4D61FO5yK@~k!>aV z^p<^Hn${ODyMAV_!%q_qCve~;c4KR6`KTLl$JABCO$YNDINZ>I!Rx^lRHG2idTq!& zOfT53`bn~G`amHWdiPgIs~+#(?wgx6g>v4LMcs6FN)wY;Bilr^ACYO{<9wK3``aVU zTtL>u{3SzRbM-2q_+9>Ta9mvA;NlNUkvdW^` zxJl-Zb8osYdE9xYq0sN;lf?Pin9zN0TegW~C{csWPp7r5nEg7_`;-9F;M53UkgxyS zGq0-h`YvONlVr>l*R92lKYlT9KDeD4p$-g5M5U5D^U<3i>-yi3m~BnCi$B2~z-cud zF|s$UzH4_psyJAx7nA;QZ8q3vALAh$KK_+=_|HMI99f%(1H$U#z{nuqu|Md1o7tLM z$o0v#>rM#mEM?+)QKGxIHChq9Nw3Ax;L0f4^;Mm%*EXyeSK{}^Az&(nyumA*YdD#; zZ^Ig22fWJBgqnlR`mZWQj}N8mm-B{T=AM^S8qt#7((6^V%Ey?r@yagSz26hn%dlET2^G+!Rf1hkLj7s`qvr zi2!tj)I)~{*#iqREKzI0K|Y7P9118wG%F)XZN%E?g5Hl+0R&m2=*O%g@S`FPZWfOs zMd#G}h9DrC5Pzv9V2a`0qW)JBISZJ@a;&6l>{KzA+|`+djQv6uvAbA9n1HGW$;3%V zz&qB)lm=;M$$Q$`v1lksSEK*D^+m$kt{UcQC(7dVhXfPFn4iIU-4C z{g;OKWJ{#*%1iJ2w~NGJ*vi9E+!uZudwZ-Qe!W&_ZD54XTkSAeK-ZWH#9u%wK!R>& z*LF4|^vpf*R}YCzmN0QQ+|{7XEKPZ>_d`Sc5U<}xjb6K#_9O;wi|ef{rFPej2OgGe ze{3L`yY2?=J&v6{EvJTMYQ~dtPoF*2!J5C!UDn{WGcsC zm$XqEqhVxRx=4f2U-|Jy+>QHRdZ!7VkLH3?+Q$St@2?D<@g{zak{uGNKiyXQ(WtF_ z#XM`Q6nZ2pRwPOESiT<+w_3P2UlOOdEN6bUr>OU4%g?R@9S62$A@Wk$kW_Lt$L@SK z+F+3RY)L-&nc$h-Ix`d^5AvY93&yBF;v#{ zeqvDyopi@3g0zFQPbrgu9)P;dVowDlT&)s2@=7yBB%Jyf0$%g=c$e7}r{H@a-ezOt z_0gc!KIf8lKZ2-pLBB0kDUcfeDBg3PwJJI7GKzzP_pTWfYYe0kql!rTo;6Sh)MYj9 zDnnKXOOo4a6~Pg~D*Iq>@i^x0l3FMqyheqd=|(+8?ck+^R4=BHxsr5Nb~e*~Ev0!^ z(66nfo>~>>$cQ)xy-w?FDX`#8wrT4kUANN|No@o6^P+<2B0hr-k#xxDwg&WPR_ z$+DbhKBpFXQm651{gB%;a$)=r-JsTQ8Wf%kE4T?b^V{j$Xha>z4M2rK*!9I3w%oki z|DORy%Txy2PkK*MZW-rJBbe5PW_9a0G07s(ob=>pGTg*=jKbz&roABt)o-_$PdCGt z3q$U+)}N9!`_&3h4I;P@#?iJ zT~__$ewVspE%83LM;ZQs(*jFO?>=t~Opt{Lp@_q>-(B82bh3dO&Eu~9pY~S}@+X<~ z`I%eYpBUVcVCRiO=m&WqGTUR>@G8CGV_fZKN@Y?h!TfqPELt7pFShrYme4r$jMsDR zYs8+JI3qHW5LRi@WiAdzzg#hVL_JM7zeOIXA4vQuV=2CkyrHtL((5ogI3Wc~Sdb58 zLMT0NZv)Rkqi6>!lr(?gJa5mwkqc>7=~yC4TifVv0>yz6mtL#zM35W3enbfk8mZqy zT0}sTl)y^IV^pS~XScKginY?LeUS9&RQSab zI@atYyk*9eWg8v6@Pi6P$Sgb9e>=8P;Dd}we>lidh$m$hPiB~VIRFkDQAIMK{y539 z4!>&qgS4pA0UpxG{sG^n9xc9T+vmeq`Jr(EKHCqx$TLvg<2DB(0^8QSJcA!sb45#4 z=N(mk+p&aI+ThuDWDaM+pY}iUxq!@?gM%iZncT9>6Dr~+$);wY2Oo^zPy(5!v**-- z!@mqknDaN#)-ODbeLu|4uO){D->m~OWM-I|!MlzS-UzSOcBkmIel*06g2iwzZ~eUn z2e`b^5|{EC0m!MIgS!l&EOx>xOOR)Qn8Q*_6JJi!{M!AO^&A1qY|o~`^>%5?J;Dlq z*@0Q)d+o>kA!#XX0_~aGhxmZ;FID`=1M2tVu@d|d7{-A785Z0$+fWLjc~~N(?B8_eoaM!mPg3?|5k4+7+Qe)Pw0uSRjOT zyIxW*!y-AkH{aFm7Ts07$~SzWWZAE+#wE>W^yLzCte}=-0UM)4_yAav5fo=W3c8^6H|I7qE%lt!#Nwn2*iLDp=9PrnANuu>U7 zbYZBZ5uh4V@?zFW@eIg8!;oG4_IR$T{hw`5YSi{n(ARJAYc)AdN1mj2e_idh<_{~x zRC8{$&7klY4(FH(Hkg;7){e(JK;*?{&guT(t;)Ex#TaU0o=&JuAQoRrPd9jcoLdB1 z9Ykqtq@tS*>-|w6i!CY@ep|)Jc|-qZCi&X znz+_P`IJGowEKWo7%f_d-f&~?iVDF*>7s`*Wqx*s=r*Ar{?$%!T5eu@iQ`m*Ueuu$ zPT-OXcUsK`$5X5}KGo61_^+F>Sa@Ki<@t;3IpeP5Me}+D)9+R1nf3BPez)lj?_tL} z*B$v;VHPP;O+}{F@cP=$(VY54@6G1N1f}-9Js^Y5{jX>6vltnCQctuCrzk#>e^T7u z5RSj{2~!r`JL!5nEIV)S#JhWp&bC}-A{bM{%#@M;p#aHFxUh{wis$=~F5gJ$dXY|X za`zHE!_WTD=EaVp1BuKoxzT!;rtao1G*Dza5>k32aW|Ce6vZK7u?a&v=TF~XZpxa< zyH?l1xmns$G2%w|ZfFdmoiDoXdp+C3pvrx6Th#OG;YRkK7g3GS9w>`cr&ZLW^IX?1 zlKFm^>uCqT9D4onBA5Q9`iDDxK_ZcR{n9S!cM*qt7Br*Y8qu}NuS*oEaQzrd4s%bI z@5@*>QU)+0eecc}_o!{(h&H z7=EdvoK5}&htH*k)L}CPGSloj8HMC-k4tX{86>&XX6}xb79@v)L1t3#hNkx|f<8i4 zHOM{v(3)RSkf-(s{-wek-)Pq$Pa7&Za2CIxx;-Oz#*DxD{`N9Up|??vqh38MN1uET z!2C4hw4z|K(s@7e|K+J^>LSLP?yv}HQMX_ILCuGmb&o-yn878cQN8f0eV=QNyqrYH zcb5C7U~MPm4EbhPZ+7%ktokmRic%>qB;S?Eak=w;OAfnhNqc2CH_u1f**VhbM?A{m zU`Wx`6}PPqLi$5^nI#;ryWxqpDTQwN_qd|xK8(AR0xS4zQo)5^jM1qTh-K@(YW#DxkL^3J9``ACd7(!bm-3S>e(MVs9x!&N zSzi088Iy}^E+l7}^&4VERzM0E&;HJgDWPziub`;t5iM@jkzX}E@>Vu8^bFkE_>98a zU^6Cn*a6^T(69u6#>(55>S7lMP=)&sdkkCh1X8FFO#1jb6#KV&Ma?b+>S?T;u z5^favpx1`aSLkf0;KL+nIJJrr>QS7~eM~~{&PbZ^WekXyikE=gPGUiK=4MV!T%bTh z==NZS8j{IVGaaOSzqRk5KCt!8Z}+QSXEqqy-tYVm{_H8nJd#QD-<&Fp%jgPfZ6)pa zsub0cXA2Oy`Go^~%}ZG}=DWg=SxquyD#|=&(Jy_GjmOr8-OT_US-@Ny?+$xPgMzzP z>37XGTFBVj%fD&(LEzmaGh;;<%ct-$+Ys+8MM#W8Cq9`eU7ENj)!K;Y;caLXfxKIQ@arhlXDlL(U`nDht9UVy43$npMi-;zi`$l;MSK;e6Y7kG*G z7Hdo|WY1qI>ljT%2$lD>Mx{Qp*q0l3L)ULgsZ5#YG#9>WUVJOq`&@0fv#edRN;!h8 zV~vidYWd5!Is&DLZSMaV1kV37h#duo@|+T-+D}bt869imgv64u=r>~Rh2LfB)6r6b z#XYbtK_~Ra<(m>#&V0{8f9?xiZF?9HBC@y1_Im0ry*n9oT{is#84*+*Y#-k|mNlw> z2S)Pv;OpZ0D}^4Qx$Z68c=zkyabmq(8ji8D9Pxq}cw@k$s&k5WdbSoiOHjcYw2q1%fYHdxF- z5F+4C>YXHE9lGsbQO`6WI?X7~DXKDOtDL1WW!uo`P63vX!LEu+CRS=_kGm(4BjEd% zjpO*eCH!{WCfr3Sp`AlQg@$j_IA8+DWORFrx5)BA`rH|-nXS?$jx%T#5~QpH1Ixe~ znuh;8slAr4cL@v1FjMAvL~K&@2=`hZwsN!17J_Y->CT#1&q}6}(am&NN)ZN6E~*g7MJ%1)|6xJB?s79o9X`WQtv;Xt`Z#snjno0D0Gny9GA(gW1xq zS!Pd~S*s%0+g+FmT6p9y7Wbt!yJ(|0@p{P*;BWrdv9jz?+K;w1*Qc%dfEwc3%tx+} zb@#dxIkuY{^U^=4ccfJT0%n=jpc**b!r0)l+kA#nfuF}~E@PuAnT_^6cl?^?@8nu8 z{99!vBZ(gG5Nwm(jrO?@3(lKue!l;ZFVr%HlL`eoVZ)#Ph|s~zc70?>TgQ`AyA}B4 zphbbsjt`b`#sAz)K`=v^8oNQnJ8M&_CAO za7~srsd9UG{A>jwfe=MVC~KF^|PrSni?VWr$F*BAb7B73QjduBfxNeq=v%i;-TkEw)W5V8j&3MuP{e6zZC&iw3F zLRzu)BvRy1^2>Dvwk4H<(er*!NlN5U#gFHa@ksAIa8DlgKASz218tcV;$V$QW31B2eYnc|kzTT*WfbN$SC` zzhN8wf-0$)8msQ^)n_^k(~#p?QXcCL@3>ybf;F5I6U?(-p{!n%wGD3|!kmW-_F{^0 z|FRJNt0?1j-F&x1`h@zfcM4^q+49<**L|a={E6lG>2JX}N@>m)>1!*%f9+~k=upDO zkEDbgranKE>ovQwg1UN^ULAK_tB~E=0&eDrR;%42IH9B2_a2|JynCZ+(d{R#JLC!* zsIVqbN~H~0@$E&E6;U^-)#vcxel2tU=(r=u8j!L-AcERy8)v7roduv?PaZ6IB~_dkh1V+%R-|{^Xt$YM*Kf!ZUC{ z{{AEfyKWYwC7Y{U4$RQv`%+jq6+DZNMnpS3kp1fHYr<0WY$HCTGU<2ifc||$Hh+;M zcR}aw4_>#u9}`@b6kCpOiMjTnopw-+?Wly)5mw=1*%DFS-0S6M0%xiEQFfoz2kklJ zx^&Fj35M(x@7({=0s#5o-%_s2{9rde&J_^@kd{T%h8&NdqE~c0Gz@=0XM#q|nUD=k z#RXt7Ahr66j4i_*%{ge<wWeDb%f&)_qV++E9&Ci- ztGx@CM{5q30`qJobw*>8BdPynqg{O3ZE@S|ZZyqIH zgb6*xg)3%TGd-OwX-XS;frX>zj|sT#+uGhVDe&N?W$UR@wj(b^e{b;>&_R zi|ga3%_-(SIgE(o6f32^IL1vksIpGcK&pI-%JIE$3hUm2fn-3*N(kInN{n`!n0TU3wxDTBwA4oyBpb;FzbLZ;P+gm&#jKov zyeg^xnJ3xWoL@}8tDn#1=E`WhBE=u=nY(4&d_Q5oz_u{)Vr&|P#*wc|kl--%hBywI z=25eDkbYDEv&r5WL-v%`hL}wTxB#1;ke^DVUAGL8<&ia?%wrq z4|mw7bzHrChH^6V&^*JY)x$2eAPhZHSKPBTqtz)NLy?X;IQzigV^$%}%4+~u!1HXt zZ=Ps-V*{vz`(ltq(Y1;bX2ceHz0~Q5l=Q9{e3sFSAKT8bE0TJ(;hnkPD{=@jgL38m z4%Fg<@#j{WrBf6J3$diFRj~HZGVSa`k$kyLieY57mT^?Ztz3>;YWiAiw#UiOJsd4z z6Q8(D?Krtiq?iyd6sW^~sX^WDibL2hRC_pizLisbm}MOmF+4eEKR9 z{=;!Y!%lK-x+rXLGO|-n4Z+(Ni#Ha$ta(##KrddTDI!Tt*ch+Oh3b~o_%)>A6w}ri zpT^FUtSJ%a3nSDGiad;$gje>vIz`sMGuJZ*-1`g9b?-f|WVzv+9en#*d}cdeR9)O7 zRo<%>FCswzpb-|A4E+dqhXuTB9fwx?o##Z$zeRF@0Iihgz5xp@%s7zcS0ZOYND$kH zi4PN?y}7>roF`d}kxWz*sy`gJ7lYWwFoO&67d40^kWJ7^pV(yJW0Nf4qp4j$31 zsSNHk1AWNU+6?!ib)HBR3x{>gAOsoNd+=7@43kmrT%xjO1Lu zr8?MqD~Y^pSojAo@}}^Xm_>*)&X{OjIvbAs)xO3TG-7J`JDE}xWPgb5!-}@_g|3;9 z%#WUUFJ9k0aU;z>QSnqY7#bme;op^x+S6dkUNyElx4p7U`RyhRau2G{!wo4>V3kI75dRvOf!oom|?X@MT&)(C44P6^k>sA3Zog~yJy zdE|G$yMX2Aq`-tfrp!M;cEQ7&QAt+wB(qtoZB;9{uO)I(ffHb%CVV~t*cZVXs5FRx zVM_Vu%Y5DPm9M-RSSY(2qf|i8&49Jf{xy3Ses|PyobaG~*}jq@WK^l!=oe6VzmvKI z4cpONIJ&55)j-va;nFo;DZ%9fL`m+@Rwtq&g>xic^hru7$y*WcpwYj-%etxKas&>e zL`XNoNfv;SFAroM7TaBPV~N0IoMiTRj5_enj|v!$pVWBK&28 z<+H#`1Ib$Aj=YF7!>MD#5vE}i?x8hHaTvIQ79&4|r@l+EeFb46DN16tV$M#h`n?TG z+`x&Tjrxm3u-6y(Ud18J^jZ32os#|I{MEUInBt#5(qz!z}<{Y9;yXSF@T8YkB zlK9aa$aY6}Z2A27#|438SO_D=Pf~}Bab1I}?Xt>gglE%qaSuG6EIMg%9_M&PM#zd> z;6yjd_8yLMa8r8tdd1J&wQ{#6cfChuTK5XvR=pDv10b4jHRaAkTw(aF=4ZJ@p(|XwovX6YP)HeN?DJfy&F8k9}#Y-_2jYM5!)I&bwzch7UnLqkOL?)7ZoS zlnTf3+JWEW=_0y4x5iLwe6&BJ6k09l)2QX3*L7n6gFlSa&LgC?uS;?*qt*Kc&8g#l z7l*ILAK376z{hX}P}e!O#(xxY7j zHbbmTrk-@kbpxLaN^ko=JdRVpO__is#pZ#6>f_@d77U+T^$n6T{_Bi&65tzXezMMD8E({ld0j;NpAbjX~kIA+vRTf{a=_{IN>#m1ytGaRb2JW_0w znp1bQzjKaAaZPAE*4tnE!Btv$$b7bDYy}rI>~XZX=Q6VTIMgkDi(6jP^J?(xZa8A` z$&!2;Bi6oaw_`t=N2OLQUTX}vLZrh~kwnOPd1;@!jW}MjerBE3N$ijSI_gmqaemsiAuP+!-{nod{0Iph`A=!0#h*G=~aZkJj>B6xB%GLn3eFiV&S zp}xGXQLAXI8}EW}xUadgh_p8W)nxB&NpC3kOIh3fd^&ylLzN8l#A1T5Lri3>S00zf#C+^pyG~9W7iI#>SwLhclcu zMI*n_={9yNv-{pe5Pl4nuXML!`@z7_Fb;9uH-3%hLo}Crim^0?9I6Mk!sX{hfC$E^ zA2eWaG-*_~OzqP&l=R7AV7}o!>aAtg{!Zcs6BUm%0R$t?JTEcgj46rS36h5Ta~I7$ zpM@>+-EN9_RK0(14xfSKdRiT{p&hNDG%fR*EZk(Tq`$?{t}Pf;t!J4;Y3!`F*U#Q5 z`oo;VeWW6UVRW{3T{JcUj2t$w zCuk()IZ2H=Z^AHEe%YH+3vQa5OSVKPk{#vNy-mbFH=u#Gg&lhz85yrxfP;WU)ggGv zSekEU z@r{De>sY44tPHb7s=%cD)nia~?l-K*vK@;~ubdxEG@os{Kw(*@#MJ_;2vee)rLcpQ4VW>bnvQ(~kv$Qmow+fZ2K z&7;EwNrPaWg5np@oDp_a@?I#lauTN=pOVoy9KL zSO_9|NX#$13Cm8(OiB4u(26^>nCvZAM> zOUGI9aPUkNP`D?B|NJ3X?+LRQm12`z%Zeg`UmT5x*?#Sj`EhM7qE|8%{v_Rg?elK< zIvQ06{&4NqE-1>Z?bD~--@)5=@9c>hcAQJ%Tq?d^1$+gdd6r5P=X$fs?4GzigNjSk-?pV@7}%GQba_z{q*Ym2%F@3RHn* zn&FI>Mr5(h(t(0hD!auSi*rdw2Rs-fg*`CHJnxvC(MK{me~X*4ucc31e5)p}>*QPi z4RH5?D=5Qti@kJd9rrXC0Wpj>Im;D@;aHa~h&X{aFG1l=rY3PRU`p*(fuALFF(wAE zsTBipBx(ykt42e)3TzJ{bko+webmQG!j*up8rRhZNd5eG59der{}-)^I}af>HI*3vCGdvd$z-hwqwZFBJOFe;%aB1F z04` zz}!K3Ejb2=Dlcxl+9^2_0I@99+95lWEgqGm8>szzso;MuC8PHL=TcSvid8-jgWGJF zm}9F+4xLXlX0nQIbcCinR}G3j{t4IF-Xt|mb8`_Q;1g4V{{BPdzg)#! zM7Wm-;g!S%8bHnRnl0Px75+)FmytsyGu49=Q=%08X-0+m6->5Cbs-w8ia)>vf%|Gt zYyv}`JIRg2F$ezmpB4SjuEYr>5flFA;Ds{u`wQTPV`2g+%2R(CYYTq+Wm&BCJ}Z$yVg`t@$J69=6rITM1G? zfW$QSqAcDqa&m)g0No5Z^-E4kGa$at@~?aNm%QeM19&2D97PY)mt!X15;ss9V<2-W z+H3?!L4(qu>Tq6sFt78UbRs_+Qe9phSw92+NGAXC)v#$Ri~a`z?S+Cm3p}Z1c**Z* zKxYN7&YC*`gG}YP68}@%Q35nY{9SXbI%c>b++<&)w5&)uhn_~hpr56-R7yBtU^(IS zRi+yMvABOZbvsNiOM~CVa-^9rh!X!jlHxZK%qO*UD&Ck7gR<{j9;({Rz!52&BTVLt zMPjiLX5W@fQHlCaWrc=Xfv*%XkCLSA3eAYJSJ9EmGKrBA&HfLT6w1+bK!-og}~zbxCpi81b?#BY5_~7XR;6J$mUJ zdtjoh`vH#ql}tI{%gExvg%YY^8*+Zq%IY_dexkzZPdB zas;S1cQR9GA7G4MKI5zKr+;0*zXtOf(2fAE$;FcIRwC~EJzl*vB1G8PKi(^`ZSsMj za2eam{4@5a3$TU+*%O8|-G%HtVl{_gzb9O(srkHmKgc9bBqg@Z?- zjSr1V9qg4!+ywC3b^gapo);$~v)48f|8-AfB>yz!>dXG61CqYpnX(k6F8KD=3+f?2 zk*>`3w5=yaFoRf#W`j9Sw!%bsjJ!mJJ(E}&EXVWWpMKEIyzVE5AtWTMLlnQ;04OA! zjEq(x0PDedcg+(RBp>oob3OH(DG5N54+F3>5Dkr#)$zW+FS+G-=3Wq0`!_yB6k;wt zJO(WWv9P%K4YLQqF97nN_Ju!0pURxxyc_G=-gHeK58xQ7pcR5Le^bNOYZr^ zjmZfXz~{d|-P^knAbFUKntb2KWB&lBUGH8H{Z63Ijc0MS&gEWXy~L?9m&O||@MpS} z2pq*Sz7Edo7xo4tDE|ha_2P7?Pa%Z{6qiU$N>adFr|eDBO!w{^t)m5Q5J_vtgeIwb zVr^99Dy>wA`z|Wfq0#2Otn%l(LtN-|t^{rL>@hrI`{O;+| zC3?4-K*j&Aus%)j+V^bw6PXCNw916h?P-_;OA+?k<&}YNr*?RSL9=xw3Xv90h+9Rt zR|mc(Y_&-6mmw&l5E^-Ft#rU^ae4ymcM8{E)rVr+f+hx7QJMfd`ZVB;@z$VaPE~ zhF3T=g^N4jz?UEVv0-QhDiJU2;rPYcAd$~$L^|dUUe|h`j&TC3Uiu^~*1_=TDd<9X zdXmvZxUP8>2hBb}IcfvIq>F6dnoqTo4rDf;Q&Cc~@62E2_(KwDVh77L8$`A*qbM*K z;iM8p=cC1AGBDXtHj$W~lBqG9lii)E&LNuZltLq!rElQmoJh}} zG4Ys-RIl^-^^Uzy4B?tkJ1;#wwfY^g~m2kj0Rp-@KQ5OHrN^G{n*1>&jpvam_d1`i=$oA$t(ASfi3K#^@*{qhsF<2j z7OF}HnH@8!kdFFwC@w^28ldD0va=7zkAW=i-@cZj8CjzmUL_le|B87@7M5yqt^C3x z-Kww(QI}@jY@5rH*Z1%-)_hA zCoU`#>N_OwvM+NaRKi9@R;qm&u?#W&v|Im^S3nugyKzcK1Jz99Q1d#N9Mg-iT!b#euMhWZx|nxow3q>_vG+6 zz2#_#qT;2Rn>DA9r$*Xr2f|4U{GYQ<*twth@$I7HUBwqul9PvGY&18!L+e%b)p4gu z_mQy^6u_P9Nr^{mv}S2pSS@ju9Kg#V5u@m{0fe~=s_Mp zR6!j~8zx&`7~# zN;x-B*nSqY^Tfmqn*-LM`}qcXRTTq^t=KVg$*%2f^!T!}w}3`04M1G1y2XqR#CUcM zD;Xac5g!Yc5v8LYveOE+Ib03CcfKAw45!Naf3-3=12UwCT44kx_tL1%_dDBMHltuO;jLN!Ky$hNojR;s&VB#A8Egc6#6=lV>%s(2%dkNVTQq^wL; z_Gmdda>%(}j)sI{4*?JN&FZi4&AS$_^D#QQ(^d7Wwoz8=RS8>obP@{rn)Ibkq3ri7 zt-tr}y1*?CW@+Jk*ehuL_t9+1dQ%#wjh|Ubo4##iA7_2a+P0(+pFY>;vKZk><2V11 zeM)W-28WHqy|yjoDbcLg>GkWn!()z-6;Y`E=0W@R1H(aj`n%EbJOnDLz}^v9c$@)( zomPAt9JsCU%ktV3hov_1aXUqaVMXIr;nneK0E$J14|AVF#d*Wqd%f-3W_kQ~+u_aK z4uhws=T?X4hQnXQA9r`)slJ{tbQty9Dgpru20slH^tPEd>7bHw6Du8u<-&no}|TjC+L^KB`Xi2eM(f0SnjMlKkrdsB+o3qYpTB0 z`F6^bzdL-25PuZD%YI%=tp1PSq?gC{65V#&+Yf^PsTu#zpD!Eagi2X=$lK$xYHEq( z7_{E(XfkFpZ;Og82__%6M)&LN_T#=hH0Tyry1ifKDr7@iQ~p+0hZSMf6foTiiitrL z`2(%=*WF^)GeZ=+_AS9W zbnwnZ(>ZoI2|N4D#O7?S{c@RnrOGk?O$hNv1Ho~0n!`I=u?8u+d=Q4mAem*An6=e* zW2L0jl0gmdT|2a3cj#}?nHBzLSnD7{YOLowq%eHRU?bCtwkK4S2?O8We!vmkt? zev+n-ZdJ0*g~63a)!FJP=+`0QN^UK5`seFLCB-b1vCA%xBOU&6S1Vp*VlIFq*R|Ml zn_K1AG0ZMeyxy3@ox#b5q?ofxb{_GVyGGtOxOQ6j^|q)d8BN)Hl|W7|XDFE-e>LQj zck2AU`1ub$%u9C5Q7)vZ-GjrD6Yan3(#_oEC(XJDgIQ_yTUy0Ig1ctR^)~OrkNNsA zn~c|~6Q{^ZAkV{3zO81*+4_CFKh^YX^svussA>6d%1#JPm?E(I&8cHUH#rfF~QAn8Yc3AT-x{*{^NCXWZVNvI+;$s#`$+5C82 zXK=ZPZI8MWaE}J_rH~W>B8WcDkSMYewh;rKy&HqGR>BQL1R{@R;+jn|d3Sna{ARUN~JZs$P`X;^c1Mb}fDEn{|DSU9D$)7dESw&@sE4yH2#rK*STV&v#(5_`S z3thgqH0v+ft-|CS?5Lk)_53h7DBdjOGlyG-R2+%T#h*DL@6LlqM?NNz=`#(C?|7@- zU|{ej?3DvKj7P}=W7W2F_%ZCDS`-KZg327ZH`&fT5F^g3oh>7f_S~}2Tj_!DWnerp zUN5Sw+Q;ZSf@WtlO751(_XtIX3e%(aJn+D_em6(-7?-J;sq?;;X18APZqX(&W+csG z#tYD#k$N*iMp}j>4?rM7y6lS@lVQiJNk;@Ci#V7+zyu%%*QG3R{ajH51lJCg`bC+I z#DkR+D0O{nx1c1LL`Nt66y@7rLhFU(pVW#$W{aH;9<2jLk`dLvyiKsa_h*e~wc8kg zIfWH<4khFY{BDOh9ktjzZ5!KfYhvl1-EMwAxqo(w-siII=2t|z$bn~UQw>P=#Yd=C z!Ot8w1yrLMT*a$&J12b7u^avO_V!NDZbTGw`0brz9LEUL4jGa^SKHs;(hQD{vk#i? zDo1`-F3&`A%M$l1bf>6XQP0mFKfjA{$j~=h{qA|*$GMJEw_NNhed<{h{HyW?@%Yd} z6MKev(B(+kvC14W-)sN8yhI)8i?fVwb6TI2aIuPa)RNZ|$>*cRGw#a5me!~qOCo5s zvA45maw^eR?XWFxIxUbxK5qsHH6wBC&UoyIv*GGL@xt|E$vkUSBc)dDloI@-D-rNt zp*LBveCu~S*+4~Ta(GLsKq zTP|9Vi)Iv3+@&#hM1WM-1HpxgVg#R2$AZG~1*}hL$!6aT`UIDE_iN<|)Jdj#y*}>8 z$Zj!$CHeob_tsr;y!@X$CUZ3D+dNlH~2+UMCNTw_w61L7|@wlk`Pgv(;Dr9tTG&q}$R$c6Fdk#s}PMCI04xMW<9mI&bKB!ro zR$?YpI^dsFSO+eWjBkYn+>|a{np`GviuMLg%=V^ujr9`}`DIwqe3ReI67~mah-VYf z+_|v=E5b1aPM&kxuLG-?hex^i5(vd{O%T4ijtcCNMwYs`yEoG6e;KH?WQjXYvxwuC z*y5SA-X>ya_qC}=Xeno=?>8Gw>&tY-r0jly6o>%kzZdF4WG7#h>feH|@$@_uS$6sv zFxpP}+#G*)?t7!G3+=A0;;+sPPAkyg54=@@TP-FxS|v@e>elX-GI6})yhT6cmVe?m*3nv%DQ2AmKKHv5y@Wwr z9Lf`>wCN58U+LF4L6p97_X#ANlyaqAGu2v8YsstKe%+63rQho(O>o}w+aj_<$y2#f z^^D;kfC|nRtDjh@<}f9k_GIrYgjY}qyEV0b5!H3fjIAI@Dz+em}Dro_5gaQl*VAJnoi{?Ib29kQ2dHK*oxxov`|)_Kybe zsO>s5x)U$2qUE6T^ZawgvQ_K`_0s}K!f9_%u%HQUbRuw-NmmUZc>w9Sxj)5ydwO4; za@0ZUWz!JgZ?*r5e*fiZaF&4Uq_hxq-3A|Y-a;?{tj``fsX85U?Mv~wqHu&k_9+Mh z=PUM6x9yAd7rOa=b>GOZew|h*WIMqII&T`HLaorDWu&w25x)UZoF?4f^OR6l+ISTz z_IkglBz2;EgyRYUv}FMl16lz>n*MppP9l0Fh%!P`lJx1|QZ91LHV!T87WLB0{j{xt zSbmJpp04p?Wm40~yvPFR`zqYN(vUkuv^Dj#Z-cQW-$YO({-~Z>q&tz)_ipwLnC{5V4z8%7PzW<45MTSF8On=wu!(tf=(q7%Wy3T1b{3 zi*U85n<6Awg~?}&bQ9AMaP?5S#P#`_M1ur~`<^h=SPHe;L=-#PWH^lAc&n-$nc zHs%h;b(hUemxNSyIN&@yXS;A#qzg6T;S~&}f9yUo8lThg0cai;G$AE=ggzk;qNja6 zf^KLmNd1aBrSyKoFB{O>aM@l464~1DTa(Npm19RN-wKSq7j~zn=0YU*^*B}=n0j;V ze>R4^hjgD~g}jFv`t;KM7XopE)Qz745+aQ4>cD~S$rcJX06S_B|WeRl;P1d_`bS?fgb=`hKZrFc2P@s7O3N`_KvDl!6dld$6A4z#xD0 z<>)4j7{#PW#;)V&C02GD1==em_Id>V%LioOiq&-ey=>-(Ke5#i#;Y8)ZakfPda&Oi zP`?O*quV*>S?a6*O=H6G2_;;d5a(UKDE~Y*=;MH@+9b;=&JLDVlE-bULZqF!;Qk}N zRaku}|IIBm0xQg|q7rTS()d@^)TPd2X6{(#cK_U}tAffBu zx?cyK?xs;?@eA5XhZqnPwSLI9NNG^5y=2_Oxy0vxygFphj1@T+->vY1(a3^Mxy*%Q z38AK>q<{|99LL4%?|UuX)&tqpm~MCf{Okt(%Pr6Jw7l(Be=P1r-9lXH_{4c0I#Q~B zuneY!V^Rq+UM2&4!#bOX>JH;7?j%a}dR3Y^WDbdzQXom5vV&0_1fmTm<;D*u`(ODsXo9IIhux-h+urL)d zBote3$()_V;32%Xm=$G2NV=B%iT6fSica)f3Bnr~eFZPXXHH^*;>rISwzO4KWGNwy z-u9-P23-~&X#>@$QA&8pK+J=3KEaAUgvg)q^Mt>$dOOEPpF}yv1X)n{D%&<@A1Mvk=p+e!lKc%U;3h4M9O$# zK0#4&`pMnj2j<=%5k0y!5LPS4BRze8UvF0H&wb=e34{b>Y7I0o5_My=T)m|5Kq?ay zLb(6;2M#0<=dwE$amAz18k~Et0l9ItQW=b(c%GE*mny_f!EBbBUc*}RJJz_NdOM*N zF;0nl4=iR;Q3-=efw56m+5NAv%0hfay^1>uaz5YL5tJ(TQknDPq6Hz;<&@A1;@}?6 zfA85zyl|V6zPzCNE+T*e^+Sg~me@u$UY`&ME6{89y;XvGmM zP>V`AKOCv1q&Cp)lG3=b3Xgn+Lfk#ZElE&|YKFs!a%59Z9gE1l51B{s%@0o~&+{^2 z$S0S)fp52pe*?B~{Cw}e@wFR)5s7-@{^EEq61z&n>Q;Wu9>kLs0f7O8CY)BQM2^SW6F@ zk*v8tm7Yz=ddiL~9$aVdp?ph5=Pvov3|BT8iLvQTbCAMaYfE$GjspkwY@ zp91>S-(sS$t&RwB1win4D^b%(qjamRb~?|weQH?VjVX7bxyZ~{jPD7+KAFbnJi|ZB zIlAiHFAq{UPbD|)aup03>{7RP<$u79auuq;RVvP%5Tka~g#JqL#K6SjK6l1Uwz|wJ z+4Ec+&!fqFz`&$lb+sT$BU?%d#QGJwK~BAK`zUkuazQ$S?~P@R*D<2Z)VVJ@5!ov0 z{0n!FI#?-8QX~Sv?6pSY!=BV~KtInN1_Ywuk(6)jT2kN997yF^4%nf+q&cud(=~3D znZEC;ss49Ux+DfZ4Pj^JWCv8=ozdRa0jYCs%SCxX(ymj){<=Am&(xk z7rO{xqr}@3XvvaOZ$aL$KWwyCU)+$a9Iv-WMP-v0aN;SabGzSlGV?47s#SHXPHVoy z6Tnw}Pp8$o>P+nmarw0J&4sva_3`sl^e04fTRnNy7tcH?k0JK#1W%Y`b#4 zznMBfO-xZrISnciE6^p`No$O)pt9R<>^K0Ym7hmUmzT`ERgc5G`lWkrVD2nEfagU< zgb)4vuCY|pO3;RtIwZj>2+B6>RG&9C+EI-Ldc+=iFOi6_a$B~zpEQtFfuH`n8(p68 z)yx&EOSTgRkqR`1>Z2x3`54F#YXq8BF!9^SQbqa?LsW?)%+`}-GWwfoRcY66-`Uo8 z>7ujkzL0O%&#{thv2ZnVR0$3B7E?&9q@;@yJ29y!o{J6>`C;WVL0l;v95e?a$wyoU zf3rcPLI89C51kGB&+Z~z97JgX^7~`)A+PZMPr}F0P2bMPi01>S8TFvp&CS#%Ty8uB z1eGemIc?tbV~*e$#ISIl^ti@yc)Uj?&OelSj(e zT$amT#oEy{ACJ>1vd(Ge8=gK+S&e>?PbwA|v6cN(trcv%6Kk7P@_drPPCBtIK=iN$ zdAI5k*U-DMzFuecy?Y0l)s8+BD7>@6=v1XxiDg{vzkOxj)s+zcmG|YX=uR$&VvsH zVlZ&h!%}0TbKF35nB&fuSmeqVMPcxO0_h9-OQ0h7=SQv)^*@L0r|Lc#5kt7|<}Q+- z&HR|ipQ)xrY_vygu)bc2$I2pwqK&amL`g)21j$#pGHiNlzO^=I5q`p#vI)ChRol#c z!o!KTC{2};Vw=;HKXEzZ{5x*XJY7zf_g}4$cuknQgL1dB;!FBuwVB`{`B4O;h(_-Z ztf*54`Mcy@@2@KJ;cDjWQc5D0^K0IQx-t|{?y~fS^9+x$MwhThP5Wek9^cJmzTJFn zgE5Q4SkgtEo3~4JbhCULrFCT$IsDG_1ba%1Vv$12V^AQETTny-O-v`eq!@(@L>>Dh zk`RGbniKM8k7%*g$|?-VBe{?xYtE_ydozK|b%7RyBBq}8czFmeVfS6r;FiEm={q-+O-#yk3g|v@e^pMTY z@OxhSJNdyonj%h~hq==g)oF^^yO&VBurgLT%CIN1@4|$^x&MC%ARq0pLNPqJ8*$vy)-L@UqI&|~PH`=Bw z#|X@4plu7keATYCy?HGb(NjkxO${QW&+mtmc$g)oVQYsMmm%_WdCqaOA}SD*KJ&+q zf9$5~BB1E&0z6y@;$7gocSrF5sya>ocX9#52W*^wDoY~Ko8Ovr)ch2QTsNyaq3jq}`}9C`ivGQXd%geLT7 zMINGom3hX6W_JtpV5?;rD49~DwMg3KB5eChmGwIhZBA}8sU|MAUY zbO}9YCWCEcNjN7d%10il!2IZhDs@#Hi^u|>J`qT=NUr*iGz)&}uZ{Y$e!KDQr$Rvt zvr*@v=lFQi4v}(?CcLUes&DxZa;LCieGn8%p_s z+=5Gl+ky$b(^4fB0t4Z=1;VMn?u&svNeK%NZHZ@MMy-QoajM(=?nE^;IG4mYV!C9n z;y2A*bDy8zg+6uiy@%mR5(qF=-!SyWJI8KsoBO6}-6nay9nJinz7yzh`*##t*fA!! z-?})}8<3W;@#-DLlsjg!_L(R8gd&ypE|?}-vdrT3!qpl{6-=AzAmJjN_v07e@UFlk z1gBS)nq;M712drvaV2~HnM(MNeW-zT2}eYkD*Sa`Yn$NSgg%&fX969!)yd~n#-3(? zc>0^GNx80G5{6nkwOf)zgv<|vx9w0}4x`QcpqqiV#Tvl+Ue(U7x&B6~kYk(0A z^!7v9MIZf$-Z|CS;ZB;4lu>N&j?@+$P<0EIVsg8XnB(Ts7$+g2N=>W=DI|a77wOPx zf3Bt8@U=DHUPg>+5EaLg?Uf>@E(knF2nGO=yYsfJyFP&bkC)0WHech9(Fkwqqa4E` zkam~@_HP)2Y=HUhoCVXLx;3zH*ymuapYiaLo+QDH$?YS+%fMOnd!`}K9=?g6$&Gi= z6}$v03pF^0gp1z``e-Q360cA*@4A4c?XAG-V9zzGM@$A4VXL574OlJ1{ z?2-+6&2Nm1O9s&R?mX-v-C!E)LG~>@U zZe_%>lt}W=80#1H*C;*=J^I$#Jhp89>^U)+piozz7?ltoLC==?set`t{lsa5YT`Yoc^}dwUK_t8Wvg|Hz_4KP~alJOa1|sweD7dw)m27pp z3VA$$B9Mu2gd2-hNT=kEX=T@aWBFF;^|@=GO5X5Z2?akKQw>NaOz$di8*3sH&uci+ ze*KQT>89%CiteFoPg?#;JuWHqvWKBb`I~snHQy)(*lDa=9S2Aqh&k)MR1p`8qV`r= zS?68*V9F;XTn@plF`Gw6rNHiCWM0h&E?rvaDrI@tDO*?Cru0bMl%IIAzv4(qv-@GV zey2DQqkn)ih6>RY0Ze^XU>Zg=_YL=wRo^y)&(Rv;SqA8_k|)CyPqWpKrLPXhd1OB~ z&d&+P0!5VR2l4;W0p4C*ld7xs8cBnFz=kIhQY0f+K=G7emS}$$ts9oUcNh2h2w3S; zds^J!ven;!n~?Qg!Inx{{G}H7-O-OkI3SvJ`tJR>UwD>v2m37MVbdj&@Z-I6n{WJN z1e1&Ef)0RE;)qJ6ovG-W$qoGVTJ=!bV?3~&D4Y7rP9u`MP7@}r6C5=*fqSM&N6kv5 z4BiH@A=}%c<095x0GIM)k5Qoo=VkN*#upb@m0i?kjrVO>!Zm3`6BTX}R31um6g$LS zVce*fMZmW_)}TBca_i0N1u58AU1=ruONWsn{lXD(152^c)9c8?95a)ZO2Bqiz8N5q zM=Wwd1It4}$yzh^WRoy-DYyaSxfg8^TPw%*?x!y_&h0JeieD0x-%TWJ;oGg2(DEkA zkuNBKE*aW$r~%m|ulMBYSk1%d3oY*Yjg7NaPwMd}f2gad`UV9}jV~swNL(J{Wkz7D z4Lue-HP>L;Z!(BTd57SYK&uQ_s4*2X=X-hi{8R66@YPDEV``LScnN^8DWhp@CNCzp z$LT(_2oeWN=4*U?Eji9rwN#vjv}2L&HK%jwTK}dgTU5$@mq(EN%&+}TyU5vj5Uy7O zMhM=^1@i=&|JVh9OoW&gXDx$X=#*YX0%A+wmZLU>+T&ngP@R~b#Kg3Vcdv4^obZ=) z*#T&a$j2+Q;O6f#%3~RwY8+YHe*(d4h1+7F>Nz8!KA&vCGw^mX26Vr&ELG)ncRBxv zq*_%JZO*N#%Ep&Zc2xwb;eGs_zQyD48)m!wWc8Z(b+qKe`7)BF$n8?);9nnZRjz~w zD1!+W4#yV@RPpbWp<~X1u6fmWL1n&}60tg=C3`J{2Y;BRGuS^9xJLU$NhMg{sl8_i z;2IOqZrYtF&{}A=FBd#i!Hw&t~$AfmUNNT^VB;;a}a?(<(c*)EqS_I-aBZ8d?n&ZBnUo(dK(@Ioo%## zy?I-JxBQ=mbND3>0HdYUC;0b55+?|_PIRd+n=?$y8Wa(Pw<%;K)blT68HuDoHP=}F zqg1CHw!c0Qj9`41>SYZ*#EV(&aM`I%+7J8yQb305jtUH;Y$@lYFFfq@&!VeLHaJ?S zi#xETw+%Hm#p#_Rj=4Ub>r4XR5Y4<0(lED^rN$ib1H8&tx)`T$rsCYx*Ecc0HR#c> zK^kFll5UqG5Q-D2A6uhYLI;FRJLU?M!!3;J^5(V`afI7?a?0D1wlucbW^Xom*{V1U zn{R2{&(vsa_u1965bZ#U<_R+f5x1o6E-fs)ff(SuO&|%WCgt2g)|Hth6>tpA8Y~*ZqL|3Os7D^CBM!0&Leiz!+m$z=w z7D&+dSr<7oiY!q`usDr^-CWH{E|7VQpitm&u%mZekzNS7&1;O;4#{YRPS+w3?v#2s z*xHHIQ8+ake!0ym!*ku#om6c*-IHQ#{SiqbrU&ZVk+4KHL>%KcR=Q`pjdR~t{hhQi z+mj4+&0vmGcMm-EOH6ik;s|w>na3W$Y`RK+zg<};f=OrF|9L59OID*QOtTeoN6gQ1 zQoQUQ!Pq6}IxDQB+Sdx~f!!XYfy737^nGk!^Ir89waM{hpV+s)iYT-A>5E^C3Zok9 z3RBASwOId|{*KMud-Vt+d>u>K6J=Er*5T_UT+8b?`))v>)(OrlRNzr#Ic*WAM>h5< zoNBE8-7Wm%3Qnb;`c{Z%TEL?d>8AO{g3KhNGFsDp46n0WG=puDRpuwc%vY!B``y`; zKiAgY-rFtB#?Y-sJnD*3} zbh!dnlrm6-)I6+UEsL#+NDBPP9`irw)LTqr%-V*bV3+lJoP?O0KC;rv*TR)=FII$~J@yvz6<>{;uJ z`$6(*5m71_q(ihRAdaTB-4zwJGLy@st4p%d4dx{+3W@Be+IU^m=d4CZwc0`5nA#Hl zTNlM+OkJ|~+>LG>93D}_HfCh!frL{l8%N5NP#P3Hq~X3Q&MU)MN;vctO9ff(Vl=YB`{P?7V`gvP#lp$}=f(x5b3=OxsTJ1RnDYT>=G{ z3UgtP2vbt7|3oiYa9VU-kCcr6(24D~nnu5yooKs3KPe}EOE`m{aky^pj#P~@`LQpP zBQt=@YRr9NA|{H|d8eVLz5csC#QkD(Vz1b`Mt1xj7E$xIe78h!xI|SVNVk46ga{Vx zcd#7jbxBgo4pO6$*UH|g&;QDJxIgl}&6mlCyuvBE2F7g1uMTDF!U^42-?&De6zz68 zU)&Rg-uF8zPX`%%wcp9wY6pjZ?qDYw6dKsmN|8<%b*&oa%q24qzp|ZJJgZ3SAOS-M zO7{k1Q{1sM^vvVcyk=qi*C(gLYhD9zV&~J%G4~@hPXciTD0>TI2k|KNqJH=L9dlN7 zzHwceMgIMa3U5$jW71dgiUjN69m)PFD-ix;X!D<~mXaF#U4F+lC-xu)<7V9S?klK> zTV11#c?p5vuhR`0Z6N~)D)s1NDA68x{2pjkrp$K^#f{!EnR4qlI1731YXnpN8MU(7 zgW}LJULUL5V8kq5k*NC(Pjduf`kN#-JPSTwf1*=-@BbVVwf>fqGZ}+i@Ru}CONnNT zBnCINZvqjeWKw<|^lNC34}&Rcb7-c_I~RzY#w_AbBn+Q^q9LE_W0)HR5*-)I7M*!* zjP@PaeT75!#iOajYgA$rU+`mpa-_M;*p zzL*bNXB{+CoXT?{&PXy9Tf$9M8ocJy2AYN*0o%2nVma~M*yH^AZT^pYX?UE3>+q!{ zLxW*S-8c&e+^D~ByL4TR=mO@&K*_3Vr4){B*l{5DEhs9F%(EA;O4Ku_1Cu>lwK|}> zeNMNUCuE~VR8dTb%rPr~0tE8+VFQNjqc0zr_q`z!Qwwur6z`me6j zmnuQAa-^yF<(7saL}BraOi|~B)1*9G;lFTp<+k14)$)JHND=Ah0{56iS|%Y_5+u*P z8N=yqF@A%Dn;A`n;+#M9*v|#}f`h;XBcg_OkLZ(RPmCzE(OBUBY8p+N+aO~9RXA?# z<2Rr+-SWGYC_e{1m9WwV+nQg?t8tS>ZUQ|`H;OXhH2dC&o8jMXDZ0yK2vE7AU= zv-eMfF9`g%ano3b{y>w%?eDgm@E8~>Nem~+5f8@LLvdE4oakN*aK!2cW%Nw{x znL!zMQ{C~QVyI_5^mm0huQWfT$>Xp@g^`r*H3y2Xx%y)HGJ;*e-l(#Bwn*8ZM~lms zyGJp+_KSmuq$xe)9+28fB`p@rw4YY3Q8bGQCV5Uwu|nomOt$eo{4bnYz9W{Ty_ldN zd^DW6vfUE=^D}7vN995D;r#}{VyNPGu=w+{d8Zw1&}2gZq*7MvHPioKog|=f9oPcL zwrG%r%s`296r$rIcOTANq=YJ&IgJ*jT_B72)(l}#w+j9VaKq3LbgK~xQJ6=kfY4ReV2MK~-^zx*sPQ$GWA;v?Liv5Gq zsMOZ}j*`)tKY{!R#ecB4=H3D|od5lR|-q`@P$!!I(SCq%37>#graB?t_XywYwr? zh-n+1IaA^@WrNid{DI*A>Vie7zjPx_h+~UWJhx*7P)S8#ve$iJZn;IA*cPxYZ}(51{=Hh``8z@8 zfqZMQ__xOIxEc^q0Xwyy~HID!PLI2-ho%^ex-uIOj%Qy0zPU9xt4>t)%3k`-2D{bn< zyCxw#f5%3-EkLv1*bsr)sT1e&^@~9^j{h`F0#IfIe?Mmba$2ck)(f2g7K#wstWtN! z(1?f_{%}~OY;+{DxqeU3FIde9mnGzxa*Fp>eqhv)mWgSoAt@<|wbkQO3P3YZkdTl_ zS*l{^1K2sz-$uT&LLd;#xQ6n8ctG@GCUt*7_+NJx8}MT~DBlhY%|U*bf9hH>{?}aV zud6)3{5$!|YKZJj;B{F3AbPj0!)dalVG92SY z`KG;2334}xOG2V=R-r%r(%oc@d~j%p#kq~@>4m(Q`yx7^SaI^L(_utGpe7(rfP;9` zvPOUe4ukNY#PjCAO*{dwm#2bdwh(!3v0d^Vmw-S=7>nj0DzAn;vg@ym)>S6rM*}ea)cYK<2ZwDw) z8E8it|6D(ee|7eu|Kpo5LfUSqU=de;_s8I_lpB_F3cwgH+z}hi7 zx}9v9B!C}`nYDdUiU$y^><7^_xa*{c5ddMroC}zk++u?ryRz0R+P81@IJvlX29so6 z?zT~zy*Ap~e6;o6AP~i_`rXMDj~Zr?fA;qeGHCVDJz4IcvtO)F078^vPRApyI#0nA z*W}J@Wd@)fWaRxdUGKa6`|~n2ke{R(^ZsH(D|b{}Dtb)5O0%cVci;D>F=v=$f(mO- z@CGEui}dn!mZ!m=h5%O5c7KeW%gHYr@2evl9$DktB_a0%YQNX8sudr(`)zXwB=!pd zyAd>G`rhT>M!mVf*JM4HYEqX@ax_PXrqRJDb$R)xWSKH|ZJXoTQ)2S6ME<2{MQ*M* zusr^xYItZU5s=-JkIQb?eh!EpZO`C#nADog7XG40Fg9GOIk01+r#CJ^ZcR*}2dBJs$xjRSeGa-P}`tG{N_VWY$aY~}LSfwGIl}e753!Bg%x0t6R z`h(89&BjR$GNh#Xb@P1O%Xn*l-_q@qFC!#7(}PKMkm4r7Xv#sF1Z< zQ!RLmGM@h4klHg3628gpT8Mo&pc$) z$K=__{baj|YAl;;Er#HhvNKCNV$j1-^(uDFi{kV_IZd!fB=)vN1a0 zc0#RzqWO8`wP@mrh|d>yyVGWX8peNid|DveH*j}x$c~oM7UonIjYIU%<7u2qt;swk zBVBcgcgfDP31Ab(=bM^19qE{S55L6Fp;$RkGI;=aT7!#93STI!?Lj!kD2`Fu1O_O# zUY)Ekj^&6j*Nq)y7CP-dgu&$aV$iSR%G-Dy*V?EK=c*^HZ%IxxE*1e*Jctw6vzFG! zmex=A5WO4VAji4fo=MLc(YsHx0HAeg^!tI7)YNLP9i%=qTrb!O8Jo+p*wYXDr9q+L zRriUJr>(pWDSS=JH^m87*tNh?;F+Tc%hkMB0aeD03XlbOwpWV*n)Gy!dxuZ-Wo^Br zDNc00VbS3wC4331%f7$YMHku?_e#{a{Na}X?x5YSgp(}TlhvHf&--!aJ;#FQmkR7m z8Y2(H$1U(eac}dU^;ZGkY{9#4&C$4ypFgioE5)#q%niHy!ER#gsAiqNdduu$#(wXQ z$>1M=H}6=3VlIC7D;J)8d~IDY5SvQGwJVqL!yaDMM$4zA#(`dyl-Ye$NSszA?REP_ zyB?8mp2~~NH{FY|F_6DC5ftPuhamWF=&%QTcZOYi4&)nZIDbt5MPa6`AAHC6;>X0= zlCmOFXPbb{8sLd2k5Jm!u)P!6^Pl;ck%M->v(m9Ksa)i|-!ZT$2GTT2Qk3mC+X^x& zE!+FWy5>}WK}eV2IqMZHv8SS>)>Apb{HcWLCZC(nZON{^xIG^9$d*nK{JB=96E}uT2b3&TNG@2TW1+yQP_L6Db_4OL zHl%$^Zfn^MFq>&*_mp|Xi&e5RFTy-Aa4LO00QIQ@wXUv%b}Uh64MKBOoDUBua8uk8PiBlDLQsYY}oA9jWaCg zTSHID^;mdlpF%~wIZt!2z<#{gsKc1}BRF~(I`MIZ+@$L3oah2vJ=VmsAw-1~5xPq% z*kpWlw0L5!*k!j6iDh15Y2f80u^K#gX{Qr;N-Szt7?mh13ceD_KZ7PnC2mDI6pQRa zlJP#Qb@=rh&nOa%wm!u}(#k;(fk7dL^}@%1)`$+KCzfk|6BAy{pS;0$)RnpST3P^QW$;6|Jzo}-;C;ydT*X%aZm8|Aw5ooeDrd>h7U{{Bu8m?r zou9|bo)WdDEPDwXgyl=3|PwE}3QerS&nl!L{F6yz2K)-{?MhL4i z6lzROY$7h#MFALa9*GhL5k0$9L?m~krfq{v8GT&gZC|Yf1e!;Kq%!0zy}i8lj;H>~ zI*0z^A}z+tHXAUqN?>K3Jw5|vDmhPxCF8H2Yd=WyAM^g@*{CDD${F5EC;luzZ+vpF zR)_XnW>}Clz0j}6=K!z}1r?*35FR6J2T}3_g&0YisMN-=p}({_w|5M^6H}O)5qVS# zXSkYva*_c^+n%<~6)f``C`TWN4`FhaH6v8cvJ;2nY1NlvIG0L_thv7#cvS;b&-(Rp z<6szfvHTcEC)Lhrw``7JFj=C_Oxzlyw|k+MIfwZlAw?a0MLF!jHlH0&h56Sqc2jS! zx2y>{-9mBu)g`C7XlW4M+v`%QV-2>MKI+k1Y^DlGU|Qr2p(cEPVTz%CwS{Fo%$PE= ze*b_7<0ryK(MJDC#3^QYc?^$Xf9(0CgIOfGtDo{-=jo=>phJt$hTO}~-QTDJ=jmgz zI4v=eP`Ms#35wM8EaM-(gD(dC;=6s9*^FlKvv;rx>BTi{0_Dul*R#~f-{uzg;)#G&w`%*7@!V?=-DnIj>h(5k zRn5eOc8?=nzJSBf&9@j9i|;<*HmkOucDHQv_r|S7q_h+e^WUT;%ICq~Om-4;Jt(BH zfS*ee08nP5A`xM8FqW9N5z9r!zbsUbfO%dD4{H53CYkxhrUmf)y=<|7vIS)3tfZJ6 ztFZ~|fS9hgi#h(I*#gIffhTL712$IJJ6rTh9va%%TiG*j)L{*Abq>Ln)ZDW?n6wA& zb~lA@5D!ONDGAk8kKqfG?yv}dZ|BaIo^Q=h^gO*?_FOf#{u4*SH*u_=UAJ=ZqD=1n ztHk$cJXX_ zezm+754p?x9#a^Xc+q@E@I}@e@$AE3mrnnbj>+6SUAVXxwspR+ABlT@LzDw;%q4pb zpX>RKn@Z5{XOcGeSQs1GW^2pMErGxooydJ@+vrFl++$7}P!zWLA($1I(HUh~qdG%y z306Rpwd8}97j|cY>`kI)OBBvML_s*0MRUY(2O)7{?q@WaMJT@)d6eh<*WGIX6_0!|MAbm?NUmaP#ADE839-IlY9y3*=M zNDO8Q<=a?|rtj5vGdd_1a)vtFrvZOpw+@UdUGxs3ImW@i46D@F<1go5$K0$Gnv=zb z#);lGO!4h`G1!ofdcQB}5t))EmI9^{J62V>)t()1Me(>@y!(79-Xulg|1s=zXrPe~ zX~0VBbn`Zy=Cv~<$|tw#`xYZ+qjlRIPkd&SBNx#2Ji$(?JM^LyfcIl*GJDy2-Q4K`aXxR`W>Df1z$c(?`i`8iEWUk8!|XmVtp9T^pf_vyn$D-`{0RCb4jWH%@!tkIDNEb7oX)OQ0H0 zfQUywg?!Z7V%R6dqZ_+O6NxvZgl=+c9cH~#TjaK3XLp_2IjBQROd)8q{vg#iuxpP3 z!iCeb)of`vVm(fOi#BmNmu(!c(_B=*Lu2#n(vL-EI@QP&<@y$lKDmCtMwQ^fF3t;umokL(%(d) zTUaZqYSdOr4}Vdi_bW;)O=DsQg$e`ui!OxmoAEJu6i{`6~uQBr?rcv!@lJhK7 zww;Sr43|Z300?`QrAMx7@0zisSw1taph*{{fS20ky5})V5%SpO6W9l;@Ct|GNq3++ z)XO{E;XdETwss#S)JemoMuZvO;*kUFOSwYq<`@=yq=e5~{UoRap6}MN3L}s(h%3(2j+cod zE6K-$^M$&SbKlHTZyI;SyoQ;)RoGMF6+81TObjEZ_PmBm-J4(@I9Z@1Nt>|C77 zcky9?(F8;oW567)!*W~rJ$+tk-o{9K+gLi~!QgzLiP&qH>0gQ#`FJ_1*$V|YV8!UR&X z#%1-?R@efE@A8^-RA;W37GnfKB~3mk(d_5xzALUh-}Zn{>6QoE)3xIv%gbDGHD~+l zx}4R~*d=`822xmTKp5q8g;t;=s?dBnAtDVB%)rAh`a=pdrMO3}$!Y3d1}UinVn`2_ zQ{8NS7K1eLALUrZe@I5(VwmCA;)Pds|l9OAR49}##Up05y%PrFp&#Wjnl=LW1 zR~tdzKWu2!iaed-bPMSWI)Xn?|LJ@>^Q@xWMyLBj6;W;*zZ~xo@5^I>ze~%+CsD^r zDKKF!Ry}dJqpR!tvvm%j#3*@WSvsnz{h&rVMKQ{*kd;0`ZQCueoi4b<)Q!5-Y))=w zDwm{nm9FH4+yTpKY%HM$#T!NwrwB#^Mj%O4zl*_^So1oyl3RM#Km{#7-5**Frvs%u z!B(w+uGcT*1rqMxRBZrE;6O{*d$Yt9Tg01mv3b|A_$~M@0!!2It#XZ3sh>t-(hs5% z9x6D9Pj-196M-}@hRkEcqn;PvJEk=;qexBFY|fSTq^8wE$A{nZo`16-roTbub+f|q z+&Ew(u6uk@Z&JRc##EoNBzEBX_ObCGtn$JMcXDOOpe6DPah=n)2fbE_ndF;W=cOt7 zK4hKg=VHKlz6uI%KW_N`1QZOppAf(musPcj?l^m@)a>jO0)gM?skFSq4&9@(_`uUr zWn5N2&wP4shM9H39b@_Yw8UQa8nRlXs6()#Fd;q0Kf4Jbb)B5xb z*XI^wV%+K>9aZ^_pC0jUf12obk>E8Xou|vFQW=2rKJ7E<2S+PwV=z)}Yg?9SethU< zRH;JVC#}D%{<4KHA&Hck@K~w{68Ug>C?*ayphBY;j0`wUwKuOhqU4f9y*N9v$Gwb> z5hR1+npV*0D&=v?zk)pOocKhQc*ZYK{H@re{x;{O#J|iaNdYV%!@G~w=i6Uowim?` zh8M{^MzO)d2!i`-&9Z&c!y+kNHr76u*=&#P(HV*9-l}J>UZKfKuQDxw|5kT|a1iIp zBH7^%CjAsspUdtSuciRHi6VRq_Xs+jWdc$j$^k*=Ju<6`p1Z~uumN?>#MxVyhvJ6v z%tFO??bg&LjArtt3oT01Qkhf%Nu|=NQVVLVZbEhd%G@G8>rt=c_P|y4ZZxe?Em2#M zG%;XlR{4OonYavsJCMLh#d%{P<0JR8suu%z%fZRSW<{J@%&>=PRB4T!A|S?2R!}Mi0G-y@?U^Yf$)5oA{>6)TcB?&2K^x z!+0qco4UX*txq)$QE{vR*HSZ^IqO%J{E#~`rnx%Rg5JkO&}#1ZJivN2?2a7tne)!U z$2pm(OPwvZW}nu#t~gXAL!6EE#BfJ>M?E=L_0-+&+vY3f*I^ITMMaF7#pUpHD$rM^ zu!tcf>mt}0VoM|AXFHHz$?Jx#zo+{8Zyo;1Hl?jN59bob9h0bJvFBOB=4ZV#pb%`G zN&*)y{sHG}h0kTB)=%3E(E;HxjK1(6M3n*v>Mk1#jDw@hhNR_r>n7*i2nU>S?ZAq? z(8nSxD_WX8X~S%VEV5Q0H%pEEt$C3(;W5DQGcxw_u%cp;;64_+fv7;e(Obdkj*ig( z_Ar1J%ID-ia5bWWB`hMc;<=YmJzU?#R49r_e#ogF0IW%)w{eE8uJ9$H-N=BBesgS* zn%?}LkSZp~PRQQi?)JSpIIem+y?2~0b?!~*f7uvuIWU_3TH+$$nq0)N6Tjo}cKpf3 zeLLzpG_m*g&iGw9raDl|*0$As3cFyObTn>1LzdOs#4d|e$M;UQo#Hz2^Nm8ev@#b? z`GJU*%8%hDw+2uVGTDLNjJi#MCEL==(kyyu4WS}^HgAMIlzBX|*h>AnAyeZN0qTMf zJWNz3@I6rej_0>WxY-9kD-yEaBSxjl0ixE1YYi&X>|U~O8C3W$F>R1usG!z5!o^T` z;A_~gd{b7-&xUKmS0&38eB_r_$q_W#%-VL0v$8*FlkW5NJ=~3969l+JwQHV^870>Q zNqu=OrjNv_M7Ur3dW^m?uuf{P+k)ByE{|J*^>iR#tE8 zar+_uh%hum0nx&Vn1RB3Wrov`3bkQ2Q)1I{clYeDl8%Os-oFWc?kLsxH+iA`#r(#? z4keDtyT*DSz*!=ZbM8$UKL%YeQtvVRytz!xNnuQwX!WE>E5^xy&WS%9PyQY)wh1HN z?|ga`)3QJ6t}5UuA9oPjgywf;1DmUj4?jg7Yf;%L*yF0-xIKc@axI-qmySuvtg1c+5!F_O;Z}Xme z?z#8ReZHT-G}GO?t9EtOTC0-PY7`<;ggq~$g`c6mtVaEDl0HCs| z3s%g`Ak_G+9ysS7O#TGxyc5{yetHny{g_x`u-fD~SM~F!cl1WPSF2L9Ujpp#k7{Iux)5t(G*@{P zQA?h0MfYDuy=7H>ESqE9b#omvOYOAal3eq?d?ZPvR7L|XYMXhTHnZSe^Wmr~rg)H6 z3TBDqrMvCxm*OI?w0Qk^icn=!(Y{L*qhVzq2RjiTp969t9W^x|d1ObaN}%A4s!Aji z1wfmdG6C@(Eq1d#N2zNpi8hPb7{$!Bh!zL@b$yu{8Fs%FYU|=-PtEx-uXlQb;$7C~ z+Tf^9%manpfZk%?$XC508+M<7pq$Vm^cN4_?|ieF>f?Bta51)w1N(!n4c6yyP4xR&>84+e2L^{a9{p6?r=w*ZRP>84I)^y}I8J|S1f z%mfDAhE3m5XTsAz=bUbw_K()(E|MNg>k6P-QV#btd1ci`jnW>73F;0OWXnyV(B?-Y z9i2qANqC~y_^UkLDdyPUzV}xe&h5n(8Ap?$7i7^NXooU$nxz|!ff5d=Tn|~st`hC5 zDD>l45ZEaa`^dhYp3Mb525yO5RUU17dPXhEre{G%;veyDn1I(*2d!3`6FzR(5LJYC?l&i7JW}ii zu;)3!{en^3r{ztiydx9dc)~&-p_MX=(OGs(* zEHk74P|qsX57}h?{rp_BPOzhV$`BzbZi1Uw+f^@!{bi&QiqM3@4 z1@y@H?Eb$W!rL1T4Nw3Po)wjz^9Ib(wKfU4{k8T&oBqz^%y}@sTRiD(kuG9$O2cnC zP2TurJ(t~nT~%COy?jw@-Fj#59x9dnOk3o9XLMdL%+dyqs|YF~@1Jt-G#k4{W#>$x zS7EZ=0n`kNFr?(&>?mEf`xiIrH5O?YmHKYDs~`blh2t~T5Eu#X<TP+cPfMW2tz>aW2 zd_uZURARnpo?vuYq0+Se`S$j9G|MKD^DGDH+hvWybX26>CZM@4!76!f4GW=f!G{5X zM$Qy|u~P?@)fPxBb-4p3@4#s4oWLMM8qXf6GuNI{YKO=cK1@lVOw7k8;xjXl&l*u4 zWMsz#sw_0(f4$LBphutq_k`tby$s`Z0muy)%u*o#|*8~0{Rk3gAo<<6(9Uq3=O_|wSEUjP2x?m2&M z*DwK&ZAbSzQelk;$a2XQta;G-QmvH^B0l88C0?z=fICMD?~OEznb@#C!8oZN60BESeJK%0m5uiW?2@0NY(CAaX}x^D(Z;3 zaf)ML9!=Z{+u^M>F_2y@Ok&CqQ!j&*fVtc6}t48ko=_G|tf9tisSJY(q;}C5?S> z(gNY#HbJM>_p3b0KRh3(*!h2c>Ns6(pT=s9?e?R>cJI!i0a78ct`H+IbZiA3>eE%P zlMs#QPjQ4q$|_!sv#Ou*smVc8N<4c-C41}5_axCQvT!s1Apm6`<2vRSRT0dL&dDwi zyGWFSjuQ$EC-nHc0w|XqN~4?n8DpL=@{(4~SrH>j*_grmRzwrn<-p{BJGZ}$Ao(Rh zqo;#9FiX%Bn#JdLaX$>ZJ5WXpgG-bgiGnZmAzel36K$UycE(G*Wz&}EO3mp8b5 zTpfhnQ~iCb$A8tSJhjU9K~sv^dwy<)Zs{U+eAG9(y{qAJCOc3L4j~xG#+qHE3A?=m zw1*7{4idN*O%bkDx~>(l_OcmEIbE*xwKn)>+Re!dM}_Xw)Yf5;s4K5SpyYpC`lId8 zeg|5*q)Xl-5SxlG?QcA{(l@Zz|ZLa?KqyGXzy7$3ySKkI-BDF+=s?B`gZ?4V+M zyE6{2xLCL>eFC`BQ4o`y$}7=8b{S08^KBck`;xv23q1u5d62qXP>Pp}p}!`cyy5_l zxTtK3N8Z2J8WhiQiCg!$W>%ozTdah>Judywk|aHK+Ht4q);DcFcyXh@-IB?fS1!=# z(3;aIu8gA+xy#v?1m%~~&0lfDf_77DKbn?|-1OvBZADNSH4}vVzO)=SFcbOh`Ls>6 z%@8-C$2mlVlpq*YhhZKVjH&_qC4;IyEEJ7%SDaJ8>}W7yKwsTqgRB0WL*-BGvGGwR za1Zm^!z>6vKXUoe;IH%+sHfDAQ&I+Xk{%H+e{e<#X2x3_=aRQFilPy zwGLvJJHIxrbhxdWizpw$m>RGe@`BkhC!VF8!-Tl?(}~N76s!04k~aBnm$$vcI|v*t z-X2TXzv|?BfBQNj0_F3=IOryw-jBK$P=nquiz$-(l#T%P4&yE=|2T)_^0wE?FZM8r zid}-YV=Nuz#Huf#*CW|qQZiUj69HFI{`yLERQ+T05EkT6Q=rh$bF1;CW^0W2GXzMY z?NF-2fdMZkq7K=AND}r%J0i60!3;%(7fioLC{gp*tu?!XLgx4fz9yod8|-YVO&3-+ zM%dxlDkFOELn<$8wl(j$Jni`*CIWl?F;b zBhiiipcW#yu5O?N1A3k2E&d>e>V7gc8igW-5)F3^f58G^)JxlkVBL;pByz_|h9kfm z5M?TGcPTX%iA`i|s(2?=V|Y)Yz&XEUm0=iW!`bvIVreI+M-tt>}>+7TSSUqhCHc zg8?{G5S!?AxHn}Zg$;~hM(>>c5ND}By00L%d)0c|ze6Jn=q{JC{$cP_-`mg7aHqp=&+&)b zGXT27`*Jw)Qmq7%G$V+Sn#GLaSZd2~VQ&xEW9>~|a_+$&-Cl6TEr^;M&%vTIYSP!9 zegQ{n+?CJwV@y>W?qQV5F_?q|^U_NaJn_dmckwzgVP43CyQRkSJC-RKsan-VRbF)? z+<0PucF07#ImM^Ba4!cgcvqAn^)IB?irzAWlptUj)S5}STxWZ3)E z`QcfnMB6$F+m|^Kzxc`!lU3j(cIN2R>CcPS6qd!>5xRriOb~w{1O(_RH&n{%+D|Uw zR35OYh~%uo%Z&RKU=wL+4BsE;gF-Ad$_d1>Oy0(>l-0V1pVB5~X3l~iJbRN|e~e54 z)6hXA3I4BXfH1AfBr+JjMb<^hF3Ppw>lgUJU|k(2#LMBrt+$v5GVwlf)6|x5%Crsw zGkb^q51f-3Eug5-XV!=2fR#bTA3(Z%IAR2(;1DrjeSa2F6p24YkLb%JPW`U$;Rs(k zrr|EBMz!XUoiY@OZzbZP=IInp94$9sE_V}q8;@x7UhrM1e>} zwp*hyKXn6U8{xV=2FA1k&>aFJa8{l6crmg;SLjKY8aNS!N#EUpy_cxw6 z&ywo|x;! z{be7SkhIYZzli&yeYaNl2dN5F1n~g)`xh!9@0(xO#|bpFw3-QlcOK52%lNnLhpM^OnsHaz8q_5 z-p+S2w2C!fNI{Q@fB?^X z+nLh!iO}7km&c$o*oG99yM1=((_BibCC)0ny0p%%E4ESoF1Bp^I;n}CuMk4_rPxN? zH?InZxbc@T5*%=qg~X%_O8Tbl=&ef5HB+8xVpKmhZfz>mkN&gH#N0FAY;iuT@E1hF%fxQ#*jE2jsvT*K?cr?E%M+{qp7&>4qL6j zzgPQjT=$D;2*Q6vLuQbH!Sl#vb49?z{Q>i0w6B~)S%43~M3MpYntu=bXUm3Os8H-( z#l>pC7~J@|=$A1hFJq#bATP-ht{`A~TtQ|#%WOFv7fFj`|CxJRwDiHhwE+Gltq1J= z0^G}LU&JASnZJIS`D;zv8Q_PWZ!eGL6`wc(@PSwT=s*hgf9wJwtoaL&glJ=ChT&zk zGPVFE0=_2-81q+hwf?_FlCR?@IF$^|r3MdIir6da)PU(=qQYck<11Xy2sFl- z?JjWOqEZR`+xYKZg34en_Wx$?D>J=VI#ZQy?#swGF9r$shq47o3BiA$L?4hO_+!-m zRcaT*lLdUj1?pUx_@ub0RpRU=7s9 zWpKFB@=uJ~#?9^SsQFP-7`xe@51v3|3Lu*(c^uXd+eZBU>p3D){d2hN{)74cKUR&i zc}5}cN$vmPu9})|yNRi$hGfuxF`0Uu{L6bK!~P#l!{`WNS)N;hce8y1>@Hm>VGe0V z9x?%c`Zd2<_u~axEf%9PJb9@|Qb3k_6a;uh{f9$;-S-GLr=XRU72W-D zVlMdaloM^9C`3Z;ZK%YY;-9xR^FBhq?)P}|`Rskm%NIg&k09fKKj3=VClk;ANW1+X zRw5tTD<>rg5=n+Aw>0`1Y=&<&rZn%}C*T_x!6w%D-R}ILyND?ij#n&4M$$W7T20h# zqCdQ3P-qu}++U8b%f#J)lpTn*w#z0KpB?K!kH;0)&X-PGjHB(o5u|q!J2z%?T?C&_ z$470cp}jZh=A(m}pT_5RyPE?uhBHSLK`>-BvaT+>U)1g}^x}6ul7&{psC{?-FO~$& zZq-GI!_L__f-GriF$JxB+PfF-L!V}lZG-)=kqnWwIoH~Jt106T*99H|T9iqUM z#);!XXdJuk_2cIdEVR{5e0VIs*~iUtvBLY%o=`C?nfM$!j1*%o4VJei)w@N-GJujqRY2R&#plP3savi9zdiMQ0Sr++e_yH#J>rUT&$!2dw9OK%0}@`vg`-@r0UW zt`dL+pCmj!@{E-rQuqau89F;7G=4Gr$!VjWR06o?z*Tf^r;d}0&*AB=HBiQ&$t z>RPHJm&5GnuUknzcZV3rZcs`Pbo9o+tbC{g6SAsYCS%v}n0dM$7bKQhdKLAj^S+_9 zOaP>Pyw5Y0Qyw)N_anh-@XYdn-s`C56S_e}BGlFeff8=po@7e!G}^0V%e!O|kMD#? zx6%bVF0eGb0|4M}m&q-wo^x|@w$t;O%vNs0u<`KT*UQW_+9u|~?+flPJA4!LzL#&X zyO&|n=OwVycH3OIBC0hXs!PVEpkM{Cp~|CA$MJD-Ds=r{0&(}}+CxqTf~E?Uj3SB} z(I&J0IfBCu|6fOt(UVs)Vnp#&s|cy%uWOE-Q07}!BPo#8YgOp_`xaJHueKS)&Bsk? z%g{w1nvF1qXwAm9RnHDT7 z-nvuC>VvelSI*%hihJpQT_G3-wkM=`tn8(~RFre!mx6JE@GYl5fkCoJ)ko8_k^4k$nQ2%Ja{w$M-+nod3%@ zZ6J;TkH@SId{2(=&Y(Ly26f+Ta<*|LVh0%ZMcNMK?oQPQyv=U3uuDZu{i`c-AB&cD zG(cj-vkV%!=Sc1B+v`>ZFxd23Y9zzZwt|F5pLS0!-7@b+)rXB3OW~gxy4v{h_mw;} z!^Hwzhd=Lzzn=a zH~h=b{IilTRtC7Z(x(f6{6kKsBlv7rg&7+9@=glSZwjn?O8e@rld>7To{&%v$ z%UUlzVo7$YA#~O&&pscw-c4e8D59^y*;W6`uKC!6q9z>h>Mw=KSS2Qf*$L+F`}*rz zK|p4?KxV2$Mlb3*GVbcA@PhgiElyxAUK& zK4AIB8@igM26Y|>MmF$#lhb=k&`Z|VVV3t<#8zZDwL6t-olKaEgenvMjfLrXf+*y# zS99%u$?vDKP_JGvSK!O0K93_AeO-RZS3)C_uM|ubXC3pdvQvZX+~q!53x2!);FWAkKM(Ag# zqAwPcRK-9kr?ROOF4Swvv~YEujZKO>T_zUV^j@aoN37s}1v|r+X#P222^aBkXv*06 z4-1mA+0CNHjGq})x0I|LDpU;!ZX>Sie8Fs)fwIvAb9nTQ=z%-3X)&7eOT}p_!4{H7 ztt+A(f-{m8LUx<%6v(H{j|qs7Y9S7@U<>#wrLmuy=bqS=#77$*QdDza^{xK)yER7c zx#g_-XLDg-r|t}%x~4-7=kGEqT$XqF*wx7h%fLA0-d&`pg75oAMS?FnYNMfkzlD-{ zZkx?^xZ|NJJ3)RWd3B2ObCu@KnXao$m9B!7G&(nynuk8`dVlpn74)eHu3 zJukMaf$ONsQk^x^OF&d>sknbxjA8X&uhwF8rRfbSA#=IzVUufGWQ4Dy2#v&)tG)~w zzw~m$@e9TuUBp2@EUX-NpkqpMyqcAs*ynEQwTw)&mf!(EIBafT&Q_xfi)I-S9vmF} zb*NQ2l)l`kE_|f08nKxg-cjd}$^4`(wTe?_s=w7AAD6-Mq6FZS7Edx?c_4hW)9?7S zq;dR^Gtpq#9qM&G{c*OU@cHB6oIUmBEK_s-_(XMX$f`%1H-I58Qu@ca&2qlP)jU}& zEeEH=M%*#KJ~^pGD`Rj$nE384JS8*qXV>$yW%oSn(PkQkWMSI@O9eSE-Pc*^@6P2N-c*)nU6kOAhkE&$DksIML0O z*mHJRd0b-^EO88~bx--PAW*%iwbT6VQp>MXpLYtdtDfq#S(Y9Ge#PPKS2rZYgZD4Ss=%TFlTb_Bc%S?q9>#2IdB6BB zq^8M-;<3g_laK4MZj%e_pCSEbI{qyn7uDNwXe|*&z15+q^>WU(k9HtbBKJ0q@%|Jn z6zkM(h|JC$(D2vw`(xoTO*$fQrHFeBIOw1&Rm)>;jhzyIzRBbd9>KjW1=PGQ;({hm z%oI1&Z#|9@K99QlFOSz-bg$dVxJM@@;xTgzXzu)ahCDv7i;|J@Pz(%03z|+d8w4qZnOKyh2^zF~M4mAMC` zIETWvq-dC!YG>X)i9eNq*7;yPN^B~{kj1L*j{!m98e1?opVxM5n<_TP#9IaMs1Y+j z$U+yyyRxiXy*XLiCq?OIu__Ti2U_K-i}}ZMYB>x4%tnim^eJ+3GV<|pNd}ZcfzFGD z=g8^DafPo6<3dv;s606^>OL{T>8e$2! zI(9Bwj)VFv*O|4O#JL_Ve=dkEH++d-<#!)HXLGxkPZlMy0~AS>LBQvnV9XzhtXm!U=#CL{y%4RLy@q zU7|(6I7&F0r3K1h1m_U|jr z^hoN;9lqDqw-uE)$wo#r5Y8WdbDG3=vC|K0;Kr{9;Z10UAuVHQyj^qyek<&-RY(4*9kufhvp;7{g>4WJA)_V4!k z7p^=N1t6=#l7{-rwKt=%^u^x%EHcYBA}Wl_b1e3U5+C)tcZ~-aUy}Nu-cs61?wk(V z$uey{e|Dx>>mV^hoKMgGOwBTR?pbK_h*u(d@tf}^`9kyu54LEK_HLvK2mN#5UFW%J z$l@1?xfHsr%J8xCKbBgO=6-npTi1vH>xjaN1j;E*vL=)*9QNl~iTDZVc#`$$8S0Ww z7dH>1ZyqK$nHQs?I8W6N{XK60GE;Ijybe!oTjZ()Jk4hu52c1oesP zci)gU50#5kIsJ)jQ@Z3%?c{wfoI$AzMWrhqV3jh6ZAWLQ~>n+PWS+~gQ2HRX}K(bbEs7ddyGGAM#3qiR}pH3 zm&q)S1M{kD2No!#@P`EW+tJMeUEqY(otqmXQ(p51JW~4>M28jKDsS)qnIg%93AF zUCl7AY%0lz{!8y98O4IVs~(Rd^cM>wn+PgJ_5AbfHG)xZmhS!Q%iB8|X!pK77nw(L zo<9YSwl=hlLrd(Bk*p3gt@MUwwU(Zv8)itdZFnuXUg!f{h!${PY(AEnuxn7wZJCNm z83ug^Z#(Azhuk^Nu3bsX&@PW3qMOPvUpxEK{SV|Iu*oyAaaB@ z;U@n$@>CZ z8TH4q4o~F*n*%wv6~``P(STFWlZ$rB&E-7N#l^Z$H345}uEq-M(Isrqkq@^!P3_|H zddDn}pWo`#2xxP6vD1@W<{4m`o~9T-IBfDSJPC@3RHWSabk1GvDFvCwnFhHDGyA&d zhJAoiY`DCcJ-eHFS5~LmRhR`u&|dgZtupOlrW&pvNG%a-6x7ztsjEX^zO8}uZETDJ zZaBAfAWx1!`?b@=XDf0|yhntU(-1DKX3L-_GOB6y`gSLg1recn?*MGR(Ss%7+MZq8Dy7P#k4~nFlGK zBE)&I?=Cbt_|vF!WaMHx=tQ++)8EyEoKjIKl6B4|#WXVjw^%Odu`#Io@@D2@UU}8idb`s)qzYc{|g~ZQj*IDXZ>4 zzN-_|%x2$T_v$k=MPnFbA6dOh@$PZEm_t2Cq>*f)Q|T9r0d2vOCwar7Jft#Ehj`P{{PXT;9ZrkZ=Ut%I8kwyYqpagQmfW{bBYtg0-w z-npDN5sth?Z8`GX1?4}*n(OiyKzm&tM4=@Qn4KSd{Q3NfNBD2ENe5S1yE{hlG?Q@3 z6uS76TD5ehFe5Z>vK6a3_-^A!$5s)_l#?fSC6Pj;Iy^sAC|H+%Gp`-0Hi>$r=~3Tg zLGegxBECls+<_`N}T1U$iV~BRyhQkTG?O3+b_S+-Rp>aY64FvipF*3pl zQC~9Y(n2-BODTzaA&RLyLP#)}V3G<~&Q0WW>ZruSGNLwi$fIpeoROEq|%EHfx*Br&yThqGifiY?zV+EL<_y)(V``jb;U^O_Fmigc2V z;F`@E^U{9vWK!Pf4#7?rU(Ba)!ZwmT>@_3X1c4t|^7m7NDa;Ugu-`rD)8B_@%w6di z_h?@$PPyS+qE@n=6tyT;m=yE^J~}=1{e; zSC?$_*-KCO-t_{FwYnL8rw+_+`sH1gVE53?d5k~tjvG!@&QHfXlhPx+r+QiFqBG;U zbUl&6eBp;7-NW;#y)zt^%SKN|_m?7}Z#omZ7()WDKPrj&7{Po=bAm4XG^2*CFxC8`) zM>fU-t+pnZjAc82hJ1i||s8e@`fZEXIU!)o+2nx^VCwKY%6e6?mzEwkvbbxv)i z^KnHp1s){ul*s zeM^7o6>RyOA*7G?N)Hbay8B5W^?ZvG9)lQm-D{ZG!KQJJ%6ai%R*Z0U5FjXPwAtu_A6gU68Jp?ROihGDI5^MiBk9*Zxs}ZBMVWwy6Hn)SZ zes_Msh{eI1gSd}&1EZqEAzWxtWbgv#GHCYdDb09P@T?;bm(=CETY?SuA!%s{*)Z+e znZ<_+9R%Un?eDp>RY`WCC^jZxwyk9!^~ri#n98~eGE7EaX|}z#b+~rd$!N<;NgtCq zkL8@8u2)|F*yr`CG{_4>x@161JN@xC5(hLpjcbnfHzB8*Qa6=#F#MtMmqf&5Ss6a6ZC;M;J4T>)7f17_vM_DPnXSh{ zZSqOaG3CY3ruJfBUbyEY786lL2dA7yD+m7lhJRB-i;~FrU$;HWaca0sJmkHrI-~kZ zoBSZ6)YIng8|V9UX7DMi8T~>JR2iVVDt%|JKTjOeNBVDuDTR&X8$Nv6Ec;s>Fp1Ig z3`c8{i3iCniz%9;>*9R|dzn+s$Y8DsxE_^>E>v&P?d+ucY&H$Y@_*f@#Vy6b)+;jA z#%ue`C+^TXVT*sTNbh=bR7pu#Sz30$4Oh#bsj-2Z$OnWTZ`VgN3k^pHn!Sw@lurX0 z53Lgobabr8hQ2OkX$QGoa?z(umjo#&Foce0K=LneEU8u)LL2Ge-Ow+@nNo$iT)6?` zFzd-6bO2pt(Fx$N$QNiM zyaodzS4?Z3@0SRxRXZsq2^p8@v*6u+qjR$^_^T5 z_m~HZ6yI+0ftFp2@Z1aeAhb+>%RnC|8dy`)*$xh@HGLH&ru-m}Xlo@ig`%oK)@tp$ zad5z3fWg_sycmaL_J@BgSmxgr9P@)a?&Q~Q^>{jC0)^Zdul=7Tr10n7>}YpR5j?Fw z5rxA$YnUXO8e}-nj<9o@JlYsA!}g9Anbz+wbB@XGQF{5z? zI(qqeJ(DC!oHX$D@kr$rvC8Wu<|D}x`#rKA+}8HRRVCsXGy}UsV@DJ}|9r_`#KUL$ z8!`}spy{nHoKm%6(#c^PAy;<(o>go1tly1rK23~bc%sQ^iZL$`4!<4p)r_s;z+e0~ zLj6x9==%nRj)yUy_Z5l1&_nL$N8RDLKZ$jog zX~(ItxRkeji&$Erm1^gX%BTaj&u=nK?|0~1WD?=i1%n>~6lT+2kr+BLYq=l)h z?5fgjr19*%F`IkgYa6eM+l5f-*z+>Nrd=)W>GW@XDyj6#r^rg9Q3*r9xKk<5Siy55B8+i^mQ6M5+{;557EvuF* zL}y*yV&=RlnNvAG&=eSspmoPmmLdGBnhDBEpIl*yG7AiDM!%Hv#spWzRb5P+ zLXqvlN1i)0I&rH9kA|(-Ti0b07DbcKX#W z-3rMnkstS^F@si!5PcoT@qzc|-R^q%Jf$O*uu8$;HYU`s%M_oc^|{x%cCARg17+!} zs%?rt40bp3Z!Pk!-OCE(=v8BH^amtk?-bmXK?F6Er%Qsv5Ka5Uj{ISN2~qK9;4h&G z-AcT>#preTTQM*is5n#^hxwPImTA!_BZc5p(*ufjatvKOJ?0VN)CzlLIT{hgB>aI= zq9U+e5%EOHU|>so^lVX5dwt>Q@i1I%9bC=shgtFi4lYn#;*m6TTi~tPJSY7xRZMhb zr+l=UxANS-! z-rX%`Z5Qb`xYJ&wB!29FCu+=@G^{D2L9eb(ELFP``riDu(M?wt1fR-}^)Dhr`pnqB z-_%K{GFc`%F7yYt>iI9c1E3X}PjIB}bC(!)nj?%aoo?qt(^6AQ86SDNV8h0Lxy^(q zuLD>CN=0gHHoLlEuPtdAve~5#qvvzPuZf&yHj3qk_>0eF> z%2!nsh~e8i*p43 zSxduj;;2<;KW|MutK&G+!ER4ru@8Hqi*&`Yx^Zg?=-ZR9v&ZmkS zJL*en_#$@5fC_aXz5eIQ1u*yF9#TY#)L;9tq2oHWqRjz5rkf>ZeZ%(WQ0%92u*W?I z(-c&+l$5SPz&|C0Su5x7dy>+QAL6|OhuR88G#Ra({Y0Lw&f)szjU|7p<>Bo_PGZ8L zZ+Gy_Q73* z@!Lhr+tZ?09-dLItxF+$hYInjz$c`=ZYa`jYJ}z3tOq&Xb0Va;)&C|A)d*t8x~w*f zyD(ed)}F5M8$hSwaL>t$fgo+o>qP}cK%Z)lJ;#N*$oPqg-4apnF&+)rPMxC6I|#VO zWR;jkxwR)UMoIbC`(puD)sU(Zf1$B+*BR=WRC_zY-*x1Tgxu_?$^?}KkB zk8IYl`_|bVpRC%8K33X5Np7p@K2ew4zj?4b6*vnJ2^Qf$hiOE;pD~&~$479=1gYWP zNHrv(+NS-&XAWIH`&o&G|NH50SOWFrcgS6bznt?k7J|PQm0-V{TgW;;H8LT=?XDc#cXc}Gm()q+YNCTRAeP%vBr)p9kSiFY76I*xh|-QmG{Hk# zK6roKy@|t)u9*c;#&+eZaj)6;jj9_J1o z##TQCd-6+#PSAaj0;er7Lg{YmOxAC#u}cn81(Hi!TEh=mUvrKW--)HlMg;4KO zDjK*!Y|FrmYx!3SL4`snsT5tZ;fqBJUxgeWHO>kfQ6NU960llQNhHXv{E6cPF#<4$ z)ZFVr1X9odF?G}7vopuR@$m!)3%_DJA)9c}=qHA=+H5-C2C%B~{ms~t5x zncp9+Is5WYn=S~XXxvHTQS$Ti*#QLwwkB9dO{2#YlM-dZmA8}LA13RPIoen zjzu=t!@K3Ak%!Bk>qYQkd@Kmre!o?98qBJv!KL=C*9RROY+ZivM{-@y@T7LQBOrvZ z_wh4~(XT!H?)1|}Cq$nXs|v^4V}UGUJHbi8zhXAOu=OlEU-6GPY|s|L(k%TB#-dnN zI@zbIZ~e~Z$~YmrwIt!gJN46e&SJ`@MEe+JjJ|puFms74RRxRHBWR{!5dNx)TGLNP zm85;2^{a|2xeJzFe$TU1UE%hfYdLzSjIT_9`70Az$?JTcCi9OdkT3g_0z$^d@|&*v zq-$zEDe7F)%ju9@o3s=o8(Va%;C%uP`FlwWCoAF96o1iOvS)dFx?c_njF|?X%cTwJ zJ@aRoJ{g$!dT+ZlQ`=x}9+-D8y(xRmQZ<3A^;<&&ByF4OfZ@;5PK6+w7`le8?OhXE zudJB3^n>J*^r7TUt61NP&#zxReM2l`A1F%JGhYK%CxUV@cA@@$CX*(ho;Q7MFGjJN z%T;0Ao)IIfXG#CuV3E3^bW}LFf%2P>3RNC<<#XMgtiBXe>%AU97^ozzVTT#ocKZY0|PQTAqPQQ4S zGBTw*&_dkRWlLZ{t(3)ZoNs?ITL3MOj)iu`i0}<)J${f{+9ND|qiz1o*XO0w_Ze<| zmZ^O^^T#YI$(qFu*C#xGln}G9(#yzWJ5ho5uMN6be@pnvoQ~Q})pooVwtlc-Rd*(r zSgaRdWA$UfqDSYpi0JvK94oRxl`t>S6icH^yuO0>IGd4@{$d_o#@Tt^M&N%T>2;5M zA3soK6L7=4<*Ei^)^4jk@GKE+Xuq`8rSz8)+b9-tnF&tpFg0D44k1UHa~UhlT+SWx zJo+IM|8qt*Y~gZuM1A%MH`@RWxx;R3sr9ST4&T@im?naNaor`u6#oE&Ofahigh9c- zhpc$#HZ2*V@sylQG$d(R7*UWh_R$9WfI)qls$FjW%fZ#%;eRI)5h z)q79<_Twc=*lhedj$IB9^mPk3177*Q*>v%2c0tL z-JL?n82m9?s!1Oijtrj984%V|Q~m?K^_vvsgg4x*J1>Lq*FPoqJOG7|JntAot3R#S z!cTUXhk`8kjWJ{*DpnzV)mIM^H9m_sLmB-|CqU;Mb>~5hamvySYneW9KfjmJ6vi*9 zE%i*8Qe}!jGnnIFKrg^-MZI>L<`zvuL&*B^XcOoL3n|l?+G#`#1!BQ{^$?K^10**7 zp4b90Ahpp(BH_upwBKr3anf&R#k0dU-O{l0`jx@oEfB*Ihm^}1(CR5x ze4=WGHBE4}TO$LV;N&MOX>ieh{i0~}o@7c>dO23Hix`eMH7dXf5J0wXFm`)2he)Tb zccfh|#y^CKm-w2=zWFRkR85~OIU#Lwa#L8Kc}yn<&Ye$YJ6eub}!j+8X{o zEj{;?zVEA)*|c_BK940;`avRJHs}9Q_LgCFY~8wG@Zbb@cMa|k+yew#xVuAe4-UaC zcyL?6-Q6WXkf6bX>%ygry}#4<-hNI$efn=zO|3D;9Qw{dH3{OP(EBi>IsV;=;6=N+ z-P2CoRA%h&9<+j*%Cm_(*9rTH*v7W^_oT2#0n2c9`8*OD&!SbrjD5xleLXh!c)0xx zxtYFu)WNZ-T?G~RCSk#}LGZkIQOeoD2W7&mOMG+Spkm6etGiCj@li9O z(b5#n8?n8Sdg({kb8^n_2rB(mU7nC4NKD%ue9(hsC131dUt>SSh8o`h`bM-jb!heN zn;YTyLWZE@DG?{f>kSW&oTi)UR*QoxCi0Ud*fB5|#W?tvzM!5~R$Ry}KkPiOm{{X_ zOlP?4RQcT(=;c#nz%sbZ`+-!E67#gnUwe>_Dqua^TjR6vQM=vB-`rH^vZiuvf%=yk zy~X9Se;S%P#uZ$ysH1y~2IMN)l4>ci`@>>YVSc%Ymam^5j-eg>s47V1d-*hPfgHGE zI$uhG0OmYhE`db$!~3#?M7<7lj2|IkG5De77e>H^4OQiDJW~Ex9c&etFi40GShbH* zLu(0qKKLaCV8>9d=ZPJ3b~I|BO`2p19J}O&z8mts?WyB)(>9Z+{83n=^qhS zcIP2}Mw?KJ8FjbZQ_SGd|IO%3rp5H0ATc{d+lyYywQ(!gr24lGEJ}a09ZC5Ie!EbfRwrvF%jy{+FOEtU zOWq??6u|A3&*aKMV>rZ#^}A+MYb zFM@R*fT!)vryaD`GbHmg)Sjyru(CNkEYgq_+yk9uvoWw~g02=F56ogY(f!HG?uLw0 zzIXMEPYwTWUwG9%Jlywe@}7@wD<*!&6@1A`rM&WZIUSX~yD6vFkg^~Ao_oi%K&nc~ zb8OC`3VHHTZ?0O?N+~Uj7eLjd1q+o-jCcJ+fk@oO&N8hDEnd~5_uttfm@yjXqS{%L zNsJNJ!Ho%nAEhsUI^Avuw2SDi8IZCJ)s<^%5`4qXas0r|d#q()pC?O970zK-Q7j(# zG&3iou`+l*Z@TE@&H?*JQ2KWwbQYP6vo#gYETvk}&AJNYV;dT1uX z-eR+{n>-vPu-)eYnN`bt;0s8i|5HknubEjg=6aVDM-ZxpHB{epvon^Q&78dP z%p~1=aups25OR>;JH}B??`q=uYWg=o z7s8AOX)Izp-WrcKGQy7%J_NL;iz=y9`~=P{I^=C0C#AS}z`46zN{bH{QcjWdkDK>=LK}S< z-*hRxdCo;G(uR$h-FW;P=;jTBa10Q@GC^*`Avo4UQKc~RrriQoJ@?3)QDB()To?JB zH=5rFU9Y|p_^B%a-FDK3UHL2Hzdc6{1_cyI!b_x`l{3SZJN?I*kw5VG)$+1t?~)~_`s*ENS#Gb z$s{egxCxW?^*qJ-+1pYp_+V+y-dLwsNoo!b6qmOpKJA2tI;Uv-!fM+a{!9(;nH40% z{#b$qRX*c)I89FT_nCCM9>}1D26vhcMLv6NbPjW z4{x7V`G-z0zQj0xb(J*d-TSi_%-<^#PAQCqVxdTju1=+`9_)(Kjf3%sWwhLP@boSI zlX35tp;;hT8x?Q@!yJFxj#k>}wSgS@4i$bNFQ3Q_XBqdr!h8?E*F-kq6)jJs01XR? zu-Ga8w6^HjUfkXE1Z(HFrvI)i#KlDvchemiob~-U#_heAGtxP`>NHB0*xnCf#r#LO z3WC(kjD}i*V>emNcs9)gA}ZWVbIgI}Chc!Ysy__hs&>4&IsdVvTI(I4L0M{8;p^pO z5@mB?`{yh}loUB01{AXq>}jpv?+=^M6T3pzBYeMnwEX zE%~DZUv=~5<&6f!PQ-$Nu~qAb9^)N`qAjP;y8{AFrc#Er+Ki0g=Sv1zd17I2`~^u$ zhU#?c20NO1DdU}XuTqOzrZl+({r9At4*9jNd8il&d#TaIh4tkO(1uqAaj}uA`87d( zrl1Cgx6gy_TilESIEF)IhvtiRtlo|G2eCI_7@u##F&dlT9C)D! zzc4J4Ne+0~*wpHf{H)ZMabwGbTh4K&CF_*J+NiTHw&^$XYe0fDHp{?{8g_p@3#ga@3VNIeSG#aPRv|b-ho_ z=>&8;CHA^0G%D_zsRAB+m{L^Iu|Ke{yyCujZul|7vh|!@#=#pH8O49Ty!wlJm1Y5RUba(~bsA})v?~PeBLb-Fn}3r#|3lwdv=>{I;`Ila zTBODPRss--Z4gAH+Fh{6#yV=O#$evdN(Lh>2=F4M9fM2=oV}tTP@7Ak&0x@ERb|tB z7@&JEgt7R61>y5yHqFg8u_KY?1FKapO9ZR9lr?Fm(w_L+)CW2U1O>=H8V|tJXjT~U zl3BJ-X@QW<3@1O9fT+~<8hUizf=O7bX-#8UY~C%1k2}+q-`H!yOOM|}jsTJI^xGAr z1q%$6!ap_Xb2->I+B;Cl&7ajQIAHiJ#HrfY9R_f0SRQ1I{5C3c$o{k`alop4)S{xE zlf8U-VyM|0{f86}2^yw%?CgD^y?TvMP&uR%!#q3YLBu{tx&~ui#q0ToDQ?6_fq9T0 zi1(@W@(5ord~uz7Q!$d6&(}Zq{lg@jToA_hiF^+Gz?{J0F+Q*EQ|X-KOd~vOIQGS) z9{!oAy&Wm`T0|Z;)rh^aG3D;mp$_yq9G`(43)v6-WrY!LWcHExSa3F41;ky$u4v~I z3Zb3PyXVgtZ{OY*9jw)wtl}%;|0G+}pbQ>z_Gh}`QJb*ccQbS@mhbkxk1}-`py4_7 zg_)hza+xH3qsX&3NN@-FiE@YYJmqsRVq~X#j#5{1vJ^Z){!wdScjRtOBrKohsr{jQ zVVR85TZszYgqCT$$!@K*JdWXPs`-&|Kf2uMlFyA%264+GZ?--6l)(nL$^;4enqy>S zvhk$yd=Drm73U%=YhSgl=^H&;St;L6fa<0#FHk{LuK6{!P^Uqq2>Qw9e>XEAK1OV+ zVpeo|-z_GQkX$N%fdBBLYCviL!@Wxlmvi^P>Ck!J#_!Poa;n6oc5W15aELD(5wg3L z-N7c)AhOpe{{y$Q*7dWyoqiKP)`4xWi5`ITxG!f_9fbb7K>)z@_$ga_W#F_=u*^g6l3|H1-b7U> zNa3z~{Az>IhLUqd^D(aaU2(M$w<`hR)L=`GiP}ODsSzsl{0@-nGg!5=tD9sVRnZ*Q z9AVzSgEST~Mv{7WfA4n;(6HYz|Ey)RMc_IpyU%+haPb}H0p5wqv{{yhjsc~va%K45 zBO}9muQsBG7%d`A<$W^2PZfhAmfG%b zre>U(c+aJiu{9OQt+(Mf+i(Z?mpX$!M82C<1B{VxL2uF#_PWb21N_K-Fk6%6 z`iom!jg%=$J2mv?TGEtKk3hb4X&;qzjJLvwjrLl~J_v;~`fQSpo@r=Gte+yi)9lq9 z3id>+4E9rfU%qF{d8;TCyEm#0qpLYzN8w<|Md0x1DUs2+8|fZS^mk5`gy%fUi7i&& zl$Tv*zg z_1hroZ6i-2PS?UYuayt!$_YTIGIXv*L94{qd9DX=cu%8vr08@Qb;g1Jka0RB9$Xq# zZtlUw_9W$!-q$BYiL06NoN-sdzW?&40|a~eyu_u-GdWk45#$>44^PJaYXTRh8IeeE z`M*R5X`lowCC%x&2-0w(o#!4aQnuU2C0KTX}h0zs#}t;nmpN0H+lE?1dw&aswt+vbU$<-?*;s*+t>?`EhR`eXw16Z_=5 z3DXYYZ?NB2QHaiVO}L@37-Z@m)j3z{VnQzq+*G;Bf5(Z*ifSr1yTwG0;PDI`6B>SJ z4!7Fs+l#KLaXt-wPhTq2ofDk10S=oIgSc~mQr2LT&yteVCld9w)g$AwT8+#nw|l~-FnTVTVbrpw zX33P4`N=fMTG&5Na~jzcYqP>M;sn91{YMAHgBV0)Y}yggBLssuq@-ou@ISk{DxDLk za>%0jAO55lJ)u6`kBt#0g;j3WI_$YB>t=-XQ$tqvc6Zg+WHe_F^9X*T{2B)=9oyZ% z;5a}F&{ivj;)2Nt%8djlN1#;u@`u|S6c53m5*d*|I8-T1$%(2=WiE`I%U?4Z`9zIVa_;tDlMz8P5e-F?Ax$R%@JG6nZexf|0pj2z`0XH?J zAoz$d+mHT9BEt^xe^(uPesfdx)#~AzY(unD<@wZD$DZ{3rRVjVNX{_x*LDc>e^5WZj(+S$?&V zOFPd0v#ACaffM3%O6jpt_Y}R-x$~;(>V-o43qSNj;Vb#)SMPy;_0I@r9RF7?yRN~|H3I*$W{g{`*j~GU+2bTap3GTTdIlq%lzy1 zsUEXA9r^;*MGFkhx}@26L(|_XdK5!rQj=MNdHb@jL{(=*j+=Yz-x*^rV;xG&fYmef z@P#PPe`7|ZKALz;keVR0?34elc-9V_$MRJO7YsKC#^$o#Qpo4zBq{4eO(*eDMtNHy z88Q`76#Bf*CnJUlK4zMcwrxc@;iIf&~m%+h`F|MuJFdH=4-c^&VItcc;7o;D-8VDwS9;IjXa0bFYG@=^Itt!yb`$QYv~4DB8293 zZ{c5g0#&>MehwI>y&G5pKvdBRfTV|G_pbYYHt$9Sh{HqTqu=q&>o{f3uM=~8)omO( zE2~O?`TW8IzNliOwT&wXy6ej}00cH!)x39yE0f=Nx%-3d_%W$>aAH_Z zG$*^tcnAC*XOqoZ@*Pu;6fV>7@CHYhU?#5ogr*$KX9q2}dk`61Rs)&&lQ)>y0`Qo| zZr~3eJabluT)Fi`44dK<)7DW08D0zA=1xtw+eq?06?dIZ&FL0z2@L%si5w#SXOe1{ za?SVh4+>y9C1I|&tJkRLEy=Fw;j#dlas1czVmx+ER8dGmw#!brzjh+FDsv2rSHdqf zk&C57{NJDXh6_Ga9_KPNp@=fD^eQl(ZUtycjfC4$QL`)zQGJbueDCk4CIGyp{dA4- zgE96vgGEI&wRR(vzgtY(viMyGZGXL=zG!<#SEON9(`tbz5=T}U9sg1po0v@ON7ms^ z#rhLjNm~4RQq_7!WboNHg*%arH*`#pDSsQ3dI~3CE6g(S;R&c!xWC_;p-IF&(En86 z@k%axe8B$_9de9EQw9zPrxAcm^gqr15v*5P|AU?Df%gq*W4DssdWLqCb_E~nc0=~N zP!l=Y93-eUV}ZPg)X-F1e#bE_J6<*0H9J4G=X$$mN_RMmEK_jRag{G`nZb=ra1fXO zXvtmZgT_MD>>LEG{ae5{AvgGtdy37iE&7mvrZZjbI-5{z9Gnbv$DcO^=RzwnQ>F{B zL$)VE@5o<3*i=lP-8$5swHYQgXdYMo9ypa?m&Hgd=W4EF`RU;D5!dt18EPy5{_p%d zS0m{cU=?NnhsFAG4J!jj5rz(T=_?Py{dZzT<~u;F5yjCb-#@Io5TNJXgh8dx02PtG znM;fj+WIeH9jzj>Qf_`X{m?C5Dq)|am=b9*#J1bKZ@zX%Stjv0gGZZQJ-Rx-mNv}CPDlZ6^64&*Cg*Y{RH^=(jy3^;~y91 zAal)ag@yqH{5D`oX=(nW2mTOmc#J=46jaqqUv6r&qM^?(Yy2uf`Y%wLvX60d5RmhR zT?j%7qL$Vf|J$=4PVN!Q_SmgmE5xjI{%@1i;FMNKeJYQL7g?202$C565|Os|y__%B zGU&ly&X`*pRi#{5I&bcqCbh)7fJ%rbjgZkxW?uvcL0t0a^YoQW-0z9dld+-;O?O*& zgexcYD-nAYjupP=Hw~hO<*g!${{}tW+@4ze$=rNJ(OD%Adm}LA>PyeRAqv=KR9GI%<7EqNqOlD#mNiFNBP5JTebW2Ztuj|^c{z&1b z3Trpi|5FmJlKD!=$SC~K)ReM6Yu?(p>nG0|y?HvB;+x4-$wfl;vN|W9(nsW*1YsI* zFpuUHSsW5;-O0tRrKZMgo3Evdn{S+0yXPM=+T!6C)Dev9WlvIJ9;-X`sE}Z~t)O#; zi;6sglo2`QN#mE;blnW5==YZEkvT?LOheQmDZ^a8r+RC2x;mSJ!BYzy)StXw0>E1y zQ!O04B;gj{DPE67iE5jkU*a917*7QNxjL=AYJQiyn)@GKl~QD2o0~8;2gn*!PNiz6 zE)}MwO{~IaUAQG5qy#0*Hk9)cwe&iAuOs(|c4`$|4%9o^yvYXs@@bd{!p+=;s^xhAghN$<39Juv3At*R3 zs;ldTpW+u$^32lC43F2rY5tIg2wLw!WwcxuE=+ zI`TFiJo|3bbo!%N4ntwXhlJq=JJV(}Q@CW(*VB;-SiZ-0ftWvVtOx%r7kk|jwtvbt z{+Fuq53379&xv=)aP0@%jJ%P`8MZLL7*828$M5%B`uNi@8(Q>Gr|-+CDykmyR$ERY z;;IYHjQa7zo;G5+N!J-PMw^YCZbM&g#|3_QNnOhDeMvfE`A9)YO3z&PRhR&~Qza54 zM={I~onA-z#92P_b}FwmtAd`-%H!g!P#xlXetCz&Y(hUsxOKA?PkoR}BLZ6O@xyML z3b(AX_04-EMXcN)QLflsnDQqoNyHy)7xJ?IdRp}W)Zy*SULTGr8DBVpq-d5iZ{R5i zx^Wo0KFqk-rRiDkI@V!tmVXZr2O9=dr_-fP54{R*yf?3`*Q*5344y2HA#@i`{f#v> zq7tE;&@)*uHA{e(^3Z7e_64U){^r*sCVna$y-e-dH=2S*G&u#JL1I%SSH+qsXGfOZ z#d!{y-9u%aTgIDswkng9oCFs)58LL1<~Z(w1~L%HQy&Jy9i}2ClFh~O%-pG~iU*{0 z?z{2gt2u>Ku{(VDIRw!6Bz0Gnd&#(+#aO6m-x~m#@P#dg$z0aIBtNE^DM%Z)nqe1> z)XX9jT`9^;vbP7{?yG*R!|nz-6k=C)|?;MPY*TD z?eU6&q0-3?^KTTJ%fL&8CG?cd?4S}&6<5iHHUxicA8yjW05JS=`dTRgJ;-ABi-dTQ z#L&l?GBv!&s3_c*zz^0-^^w@PxUv=&VRp;+!AENiYDh>Iwy?-(XsIG;dW`nVjcL2a z#+VrR^aBF}iP_mSBXl2SKYmQDcbL`u0-ZUsdAd8c(T8w;h|+mA+2_n4ltY%2Oey@Q zEIWN&^7+gwk$D|U&z{zlVt$>MM@e8YGpDnbPa4#dX-rOQ&!;tk72sgPh3>yy+Ry~qMe`A5SfCaC+n6bHMzGArPgr12_j zKsvtFU;Kz-^L|Jv6_`ubpopnSZ#G3UBrg8^#K3ILjG%l!f?j=LtQXE{W635lbr0lp zu$s2*QWi^J{KR81TjQA`9GS}lKiI64BXS#Ph3|BlQRbCI@Od{%kW-RN{`s3uCC2Rp28PkP><9Ym7fTJZhEwRln?E7gcQmkmI)3(FfHIqVH&#GP zn5%Lly+^?=zvE0uG+e=dzJ9)~M2yGr5f53>Ap6OG)-hA15!Am)9Lz@h(fv=G&Flub z#_^=50F|nk0aZLbH~ihE^H&9}0V42UEkLt-JuU7xrdfcZt<@Q|DnZ>%KyilSO_&sk zN%1^D@-?&$ZBNr;ML1h0Tn^~1AWN47TPPJqJ5GR3muu|2PQ!*;-#NQM$Sct?7W~Jj z_4Ru_a`rY7Jopep%R{K*=e~X{45?9zPz$L$z;C3oR~VF|q93JcJ|;F> z$laO_LQ3eH_;ge0*y3NK#o+v34Bp8B;IE2V;A;A-Ho}r)5P~g`RmP$*(+$`a{NLJ! z?DeQH>EzpcU7jL^^s}g#5+fUQ<@Lwe6I~VGXujWaiEH36&m-n*Kmbh+1enCgej`Vm z(AkKiRT%`R)4GcmQ5IKUvu9*k;Hmo!y}*ksWB1Vqwh>`3 zzVOf)@QAkE-m(F8Zy5Ugs)Ri!$jfT~TyZJtrta zbjTob>QIV@DJ2u$obiGB(gxp_8GCyD16%ZzYFWUNSylgFqsPYOB1_&+@2E4^8?MTm zyJDvn!fWoPo~UBD_S+v+I1{e9*<>Xmhg1pif5T|!pRH<_p}z27Ie7c89cGJm-I$O*=3L6mIQ5BTs!YLt z_v#Nz9cDwY9Nqc*u4lKiQd-jh%Pmf18RNu=i3j?!Z7j#BCMOfUGbdPoQRa5C9s0J3 zO0FjdcRnF?S$%b@Y8oGe{^~Y)e$@}3ocA&1kRhyPWeX%-Z|$f#zht!HWc|R)N-|{4 z#ZmvBxa6!S2b5$xz^M;${^TqBt|vm1Ds|Vz(T$rX$UYy%Jrx_;YZvYuN`efxN{Vjc z97|vAfu9C*$Z@7Y1a>@j)~;c#GrgOqWHn*0G*JKqfZtUG+`O-#W&)gTm~iDi5L$a~ zh_DS3t`t|$n>}`(LrCpYvJWIPIrlIW?Ha5tC=`$V<0!Qdz{=A-&;d(uK*V~S=^<8h zPoWMjk-sB2opMoGvDzo$R(Z_uG$3f=^=V@kX4kqgLU!hcwBN0E zW@Xo+fJzkX^JCuWy)3?CtPIpKI!2hE!CEgz@`4GkdNK{f5tg-yZa@LGU^Gl@&3xN% ziR^X34jUf=t*c=)8Ji0pwQ^bDZxS*GDG3h=7!3)8&JpiUql3OORhMm%ecd$$pQ3Lc zX*y>!j?|vm{LBT)+`nJ7!Yu%qDc<>}CfiX=RVk@IblOCQ>n+DpV`|N&#Ycwute0$j z1RZ**_eG7WgJpB$kRCDBXCDw?OXW8PQ*jb1v{;i;m{Rjc*Ukk?2ygjYH>T8-hg1CO zXnt0SM}{~`Pz$B%uNrow8@9B2Lf8pVkr89}eyUt^Mwo=HH#Tf`7Vmey=}E|6Vo)nO z#z`|9Ih8K%tITf=+(C1EZdCDtQ^LN<+nf`y_>k2_^3AT%mXxOSg9RKDi^O8YH2%sp zU;j1Rbi@J{`XN#L-`gL;(>3_1V)ehA=9zzWi{cqlQ5KjjU5yn{X%={LG`?IF_;y(Z z6&6x!k*>Ac3#Pv}jvC69*y>j+aWT6FSD6i6+Yc6xE;Qf55}+$qCL3c;%#{Y7ds6wb z-UY_q=tBvxI=g1X3R=Rmmc&PSSL$!OMgv2K7{6ln9zUu3 ztqZa$H8buGnL?Fgu9wP_tsf_^@C%^g+{H58gI1Mt-Fck2)kgQ8$<_x(Uo>UpgM{VG zE4-Cu=Gv&>_nh$M%J#^+1DdGR9Y~WYn!4FU2IVO2SD_ZijUcE}FNSE7A5vO4;q@F% z+kwbE4Bgz*;a#@t!r#yPUk*N3MtMQ4%Y7XZ`1ZzlOJ_;V*$HPdb1a`mcwxx@FF~7U zj)9U89UF0Kl^s(CM`R~}eiA3Ui{~E5Ipz&(+?O}^~Es{-*s+-7StOgO(a<_M1tog7nB$9iW zRLj2KiK>$K*qHzk(PR~=^X${%Ic~M)7d9AMa_Cm>LU-s!=jo=PhTbo3$kpFX7rfgg zn9VT0Zo_ZgvsA~smO-jbP~YHgl_Sr$mDsy-B@zK=tC(BF;d-|YS|x6ltQ#F>_>9%IRQZHyprnhAe}J&kmY?bOQNSDLSkymDuDjkZSIL#(|`0fn1Vdi!OHPQ>#asC2*8Yc38M~fFxHoJiR@$> zjByrg1h{1M5Z(Iabt!ab7G%ZJO-;&Z9VRWh0PQ}kqfSr@8B%#?dO3XP_?S|E`crju zRDS1A4@|8sfH_iUS+Z?rsqpzTpl1jvEj1p#Vah7TC}Z4ydg(wW$|6Dg9#q}ba($l} zG%IIc;?!(5LMa!-jWD%gwa{5myC^Gb2j#qQ9X)i%`m4)j^_>RI)czyE^MRfF{i(S`nt=a{HFElknrj)K>6S5cNRN+EjD#v1D)i#glUS{pM?|^7gxKZyMm4wv z??G^A`T3z07kcdyB+1{c#h?i{DzwUYxLDHwcZzH(LQe{?9R zU9)iBRkcOF%}%Rx=2U&)&Kgqt(o4Gap*1%uJEac1nY$*a`{kH)epwloKKh;QK-asH zJIM6Nhzky5RB-&??-BPRA(LN)hDMDp&-XTcM18|5n>TItrz_A!B+SKiGqMH!6NTG6 zJjuz!+2sAE%di}kPF*XqZ?~#X3F?^n1ztwH%Al0}$YHd;b%|qD)5$|v# zSwOe2Jv9tGni!nF2X&{N#*E_U^Ou&Aa?F?d%nXq&`TfXmz*Pf$3?p>Z!YoSA7_QN& zEUIN>Xo@nB8(++WeKF;S48yC5Pdpsh2VFI~%kiSFN!pbrdGR@pj%dO-*X-CAcj=io zrlmlhy7ce5>UG#$>&lBi-#cbK1jUnC##zA@8wrg#sUF)#c_K5=)m3! zyXV>Z*C)*$U8v@}Jq*~}J^i<5ibg8}n}xM;+CX)jL1?%Avj_$AkLFj$n^xb@`jkP( z6w(XZyG(Z0)1)F#F3b=`G-h~1vi$oeI$u#7ssNmao0rzAIl# z|1JoO$shDGteWhL3;OwqB&=85jf=(TwnW+1NS_RrIeA1EEd?RSZ6y}s@d}D%;)lY# zbczpJfMV)JoR{bpKmz0UOEKHR@zjVw%^P6NH*`mR{sMVl9lKbQ1C^?Q;t}SCTAi?L6_pL5S4Us)f+_<*?p4gQd7mJ*wCoRal1^h?=Iyw3}zA`uD1B9CpqAS^Z zA1QaD+<7G=-SkZK4OD5d< z<4x)W<4_nkCTQaPY3CNzVz3o_taLV9b>A0QXQW3&(LCcGp2{`-6*=XC!hf#Dg5>r? zY}Q)UCh%EIw~OAIZJ!Pzv(5|#(^@Q!CJO+kBbrRr@}M!^kL3ELfx(^z?1HZq*=qtP z+EP7vo*7Iwva#Y9HAZ0XknH5Sor$oul-wwd1C_Hcu z#aYSLHT%HB2!4y00Iy0W_pvmP4@V0?8fys`8E|gHng7MJu(=50OwOQ!^IU?`Fh%5SjfNDVW#|)( zxx{eq_q1bK3kg^H^y!mEi_*E@y?IxBVPWdoPu6&45pU(|<5l}mOv8w1Ej_P>&&Ts> zh%Z;Az=h~3+kIcQe2MBOJqe!=B$oCVoR3f9lCm@l8^dm|7Od&aRN91S>ZiSf=PCrr ztuhhdB%*Z6N_<0c4(G+r<8l6C4{7~or;pMd60PKC1n(A=%1p<(li7Wj>zTq&GD?!j zL^McRXax$UsnN<4Yp%ZeTjftAhV30GU#iWG+M>Y%J`|XtYj0`NTnAn4KM1;Lu`*pB zF_x57>Rp8=hoiMflB_%IYo0fvCDY-iCuI$qMNU_ivGB2}k1pfWGMVn~=5lw)k8(w} z@MbzJ*;dk|IRe(~w423yzR?-vBMz2|pFDBl(A_IN&B zA1p7wtdupV>0uVFAO`yekeYBXO~f2HHAp-KTY#%$^Hvq!FdOqN4yTR;VkX6?zez+y z&!>FS;rS6dJl?)ztB_CeC{s4I_5&l^5gHyYKxb2>f6s=XfFrkAFF`_qnYP}$Cpy=i z|Hz}K+`W<<)Y0WFhT^wjot^~E0Jc^u0>4h$zvn`l-)i`eIZ(nZut z$v%8T{Frk)1ypdH9?-iHH?gOClyorWik`}yYvCNPQxO=0ZT`5U@vJ{{SIYF{#5D4+ z8QND(Hfhbd5+$+S#41UdP}U_@HKoanEHmX7;rlV;Usf5tlSa|mY!5nkMpwx`EnCH{ z%6mY5_RH_BIfYttd9N5Lfi{3qCJtAygEN49$6CmsUlMO~nqtH^&fa2;a5U5#ZH$8^=nJ92v=vM(-RxoyyrzFp9E(6nXmLY50te zN1o-3Yce`>v6yM`KOx2P_p~B{B3Y}w7i-FojPUWWP)6WnDva61x~02z`A>qLej<(6 zz%c$HNb}MN5d;%-M>QEu`$u#j2ymU+43*zg#e>$#wVf$nWC8fZ`WC317dbTNceZfV zOQG&i^Y6h?PW>4%W&`JseRI{tO)aEr_beneMxynbur&e|&ErhW@)~+%Fo!DK%(QR+ z-mNcQDgGRd0BH)6Y-v}XY5`{uZ$Zu$00V%lmse&kD;p8gW4k=B*r>u`?Alj;pVPtm z&d|_MJ52s=u0m_rIwEn<2xf`N-#Mnw8*JIT-QwZftw$_n5?XUzB>*XU|Wf z=sm||GpT0HvRO12)YDDHHkH?V!s_Dh4k)|H9{@=Oe*%bND z@1RSyuhum6D5eVT_9Q6gGKWNv!DOpOs*2pmbN${>Aav-lr85Y>k-b|mpyrK>LzLaY z>o65`i(n?q4AJBxBmg<}%|6pj{h(lMYz0V9?ww=7K`^(wEmR-U<@Ba*NhHLxGop zj-`5D0w*RdOwv=_9$1X@G@0+)unu{+1WrPm;|)uR*_LZi#&SkUJZGU0L?Qr*dlw1e zIN7qcL~pv=_V%suJ{+&B(K(eL=#6(RTOX-6}U>$s1ZUuw(#_G@YhELND|7K!OS zt4Py*Ou?nFCn4-)72(l!H@A0-nZpFp`lK*2zZIZ3Ca&%j<&iP2u~`zJAN~lN`rCk} zj$S`y#kWL#nyLhN9l`dr4M)9xZo^mq5|Sto|M7=#(=% z@DfL%Fk`GD=&X7@yuDBW2_f=6y z|6X0LNnnPPo&39-5R+G0C;W50kzd6o2XpNBBUZF?x)uROG|qjniHuz4&yQ%JvDhgY zy-cR##ByUA{o?YCnB#sE4PmX1pqg(HzjIoOW>`n~!mG~3U-7zS9ee8k9RshS{RyPs|V=ioMHb98~gsHWHFg#pU+es0tK0;y!Oe zs5?KIalluI}2{GX;H$k7}1y-455( zB5$3Y5gAo^qD{I6EQWk1KJ<$`abzl?HRU>rcX+Yx-eAZ7E=*C9S*U|L@TjSMH&s(1 zRzVci2Xj1k^|+$)*5d|c=z|Jra3@xnFgBKHeHbG>`-{14n@JPwAF3MOdI<;)-m+2f zC8lO)vqBhwbKTOTmh2*2epIepGw;S_PNG@|TbOfu-2$nV{1|L-9Vm-r%Kq_r!v^Yl z!)QyV&JCmMra9w}u=;Xc{@#U85PNJr9ZAfw z@6OG@7{)$oCdH))0Dk(NpfuoBYkJAjl=vm?$1Q(g5A%}rxITQK$=x+hpFr7$Py{iF zN$7ZSEUXG9Hwb*`T}{`Zb(Bb?)VVKrY=evT; zar=>vK~-sYVdAmnlgCVTd<9ir~4*d`g0EmaD#vd6x3m^`_YjVz#iS)N3fY^Gj z2VcKV9mgDTQ>~FaS&uq%!^nyJ7vN1ho_5~8yS6e4&=*ZQB3r)Mn?<-8x~B`_4IVdc zeGLdm8%aSKRF19c_a*^NCmeb6`bbDhq@){T0zK;?NOxcHz zo=UhQ9)$Q9wPZwZjZZ$)0q7pW;guK}-)C-%Cp{#LVm|Y22M8J_fHyyf+Yh4aRXB4_ zvM)CzYbB4#_!uNH{HSunkn)=JX*0lyI-P{CaX9eBW7aG`(qW8fxN%GWb#P!a&vbfv zpJvl|NO<@$+!d65&0bC0*g9$~IQ3$5W9x#+1fPXE=w@0XNPMJY2Xg$d(mC_`>eb z(Ev0@KKWG+OeC;+VzeL*R=(~)e0S#pK+>HStU8wBz*wMc3I7W>7pC-;Jp!`d*<_|T zgA#tc@-j_ogrm;l#XGrC(R<*TS^Jm05$mwd&vC32cQ&K~YkX@<*wI9z-}$n5^rpYH za_a{lU7ky3?-DvQwd44*S2vx{+NTP1Ms%JIig^H}OSJ;y>qP&(?~5P@rE_gRJS}17 z++m5&dg}IL0ow9cvIsY&@bz+yw}U*(#Ouypep}7=-au{pf6_$TcEP$gq#S5-$5;6` zpZTy3yd0+1{E~OzD-LZ5fB)95b?y`RUGJP7+~lsbm#y%SE4Cxh@mm}9(BY@Q#q7oh z8t`n>svbl^@GXz6Ip_GWMGhV7BKZaK;%|^WixuK|Ky_F|u+m_Y6{Z3aYJpcV{~!^9 zMfX*XIo+WUY;oH429!PS=d@#y3J!UXQO>WdsoUhqG3Z?wDjv)4sb}RIgbvFsJ zalym5gy?r|7xWTK4?D2*CSElIJ?xnqw&FpkxN5bb3cmTdSOqWPZIhlW2_nguings18ecgnu6 z)yZK3d^f`y{^!0^JsQaEv{<2vyH8}kC)U|@1nZ7$Y*8rP*B|0w{=~JLURmaYHYBc|mN@Olx1<1gmr4QngFzfM-m_Rt zL#O~ao=s5mIOxVARgMtWhxb==jup!d;4w)JncF<0jmcOHy)Q4f@ec3mde9hQo%|eW zhE-#FzM>_3M|Sj_rs&`nBh}58gns>~P#a|zpvMQ(o<}8V=b0^N(gB~Bv+11@IMpoj zfg=!Sx^fUgLSZudJcx}a^||uR`-dM`hke3TR6&1)2*e%_$xYOZcuZAqNzt8!IljxU zP|nNvtUKxE`ROAV!SR~_FOZ#AkD5M$0ock&Sn=`-2J!yRIg29G464x6X}MYA5O1P+ zUDl*`?cLlM{V6H2h|#?_!~G2Z7kOV57FW}y8{A!kh5#YKNpKG?!L5}KS z;Dm0Vf#B}JLkR9p&>)S=*?j-ZoPXx#%>B9P=jpv`mF%ioRmA?I#FFx#8P`dU`$FPU!K}%M1{s|xl2k(y=sQ1$tOT{6fm`FxR)Tnx zmGX=X6A&Nk?(KyG+UX2<5=%xu*K&Q6jbDrk?>OJ!>)(-6J@u{}4etRoU!F|lu-YpF^ z#%fYyh^g=Rfvv%6D=kt@Q)`ydH=hZ6Kmq>V=XBoC!=U~L9(0x1eBd@rKn@u%KWYgC z(XX1DTp?>B7Xt3bVerb{^}wC_Dz8c>Y31(uPZu6&?JO|2^}Q^x8eglQx?(O@Z#BV|^(n&Ni24!^hO!>FdN+M_7)bv0WF3&GP{fiRG=Z`>b^05;$g@iIYkOB%(R z`!p>=O#5&Cg)F#DxStu{z#n=0IKJ%hOa`2zAAlOgEKZ1y5%qGy=eX_C!N5r+yZ4XR z8)ZjjFE0)bFZqWwer1<+2Rl3OYMhcwOFKdIiT4ud$b^K!;lXjbex|-CfA0DFLWFOmHb) zs~@UUJlrd+jZh$w_bSc$8uf!5)o+XmYlqDb!FAs1^wDEDgvs&S3^S;yyHk6mI zX4O6C&Ft-t-jm6QG(Q#qtoBo$NxTC2q24||yeal6nXlrq8030@z;6~?Mf=EyI0_y@ zQLcJjw_;>&`$R}-K1mI zdk(vsF(0kYNyXez+7_Nm-FaVH|D*i`ZYQefE2I#Lei3RYR0`{)CK|G<*;i zzDG54;?2XWdt};b!$>X}dV#*^w)b00Tlu)H)}Y>Tffa>DDI+5PmtVTpAHy7p`$#o2 zi&h~P*_cV+d;cahr!h+rDSWErGdkIjMSCP6! zy?JLPM115}7Z&84>rh9!F4_jqXm)M|&=0+PEd6|PkD;PF(P^)6vRSO0urx{F&{&VE z&l6l%zETm8Q!VbG5{s#7==`ZZce5YfjFsm`sxR%LFJ?7o)QK!;T-Ds;c5fkli8U*G z4R(-!KN`TUnChX1p;G1LedO}xKoqtoNIA*ghzq^T%3a>Zgyhy37 zPpmo@Wm=LnmF8VFzibr=&Llu0U(?f_xgS(F+kL7xfsYA*F~#*$!5dRSF6Z5uHhsla zfyM>_{Zz*du=8u87?*QB>b0=C$?i-fC|9K7fS!$sS4DifXg%9o^xLPh4u-#S)wv+v!$N&`DbqR8*b|LPoh3_kFl&_ z$CrV?l&E_1m0Sx)_qw12fKClOzMkyH6_BREd|nZ6pX zkmAV8@>5K3Ztv3tDG<~I1gi|7=VU%e0a$N zu832(TM-w}Lk>y~k(l2v8|u*OOF6RZyzTkcZdp%OB{P^n%AKY~Q(gW-wCi!vXT{(t zt#x_Q%6F3rs8NTEa}~0G9vG8|srpw=fj{*(<@|Q5D$%z#BcAdfJ|wAgyBoHCYOl#? z9*m6~_?mWK^ldUF4tJ%UGW2GRzo8@i0j-?|8|tcp`{vV3bn_dr_bBavfHrPRxJgS% zD6CWHsY-rY9PT!eY=3}q{vvsH@Nq}ixKt~L!O8Ii=}Byob3)>2L4cgcvNVq zjQKY$Uj51aVOs4j53!M3<(GEV?Krp3wRjUq$%w`iJpnF!)kP zwE5+!nu<}3Zu@wiEi}Sy(#mO`Wg{JX-LAeZ6PW=d2IzV$*y&W%r-;}b7IoJW`K4?Fczymtn-R_`$P)`tcDGvymO7J7%A>vV zP}icKStUmmbwG_(r43T)M2Al)p1v-FsPINQqaO>e*Ul)I(|^&t*D2~!mFoyB$!`uE zw$GDw8Jh~@vml3w5+SiF^={t=)WclY0`Ot&yFqXj~{td64=wtgqQ{&vk-&!*R4{nVd zR(QcMvTpa$$l~jT+G)j>@Ei-dA^wP~;mZaCPa}6LdocIi!B^O;_n+B_)a;?uoi<2- zSFh-FDweIe%CzMhR<^TBhUv&J@`M}R^C@ACZ=2q z^{;(XqV!e!4igkw~)Y%>aq!5Z%+KUP{&=KJqOikwi9tJwODSvx18?{oZ7-?lab z2k7twwS`D#q-2SV`s;QI!bm2S`?lhi*z_J? z;USTITBzQV#{KZFz6zUoAWaobyU|n+I$Ue?Q{PFf>hb6lQQkwgD))|Yk9_o&;nX=0 znxJt(GdMUpRc|OE0@*1YO|S56o;0bg2BHZ;0iKsNFMgPPAawmx@>jd9LA~AqHe z%E~)m`5Li7d?c>JnaiBSlg{;7Ck7e+Tjh6*<=@DH?=-5kznzQM1t5gB7V5eUSCm;5 zgrt&YPr7s8+|g>H9={*)m~T7|iU82#`tQf0i)&DJz$PYh#|#&~>R><4#FWfwnKsQF z2@$r6SIW8U_VeF01_aTta<_&_2dn8L4xR22cx--a&e%U9gcMmSGfzjVHLXf zmC%p1H}ML*3ny8!J>t^jz&@1*HILfIss>~sr`8Gu^j(XxN()X^u9cPVIH1Ki4CSw9 zDL{|OKS~OAx%U?P3}qx`olde8mrG=TR*4KG=8bH%faveb)zz;V&<<26A<14tZd??w0!l#anKf;O2H=NDrAnMsb6fpjDm=x=OQl$bF5J@gtTZPEi`-_LzcykEm3ONr$I z&99;+WZdjXdEoH;ehahw?oUk0S|PGtPCmWxhoe((H#^$ad!8P@e*xKeixgph9^*|n z)torb`%x|+fytziCa-k%#`o_LjCCgZj?mU*bxm(clf@2EUu)ejk2ffo_sepjXG0`K#t_+Dmf3qool4$%Miv zTSQhyQhgB zXlEukqY@ksN{a-;ylKo&e?K28k7hCEXScM#wD-d8L@X`p)j^#C;3T<|a$kOIcGo$9 z;GB#DOela1C-Kd6?PHgilf%6qk`E{UxRFo$1%0xkov7kO?vBX#a7U#hrXuBzzum3^ z_#wz&;4NtsFKvryIi(3y|(s92drtt zaQl7aQC@_sh|ctZxWxJ;{&EAg2kDaP=JC{Nvv8PCpK-6sM0U!U}&$C;@floA!$WUDh2d zzNRgIdXxJzlHr>OF&7e|)NA+k@4`L zmS6<>-?FP_fD8vu&JN`0GwS4MOVm%P=*;hMX_8Z>JF|b3mxSgavD6cSR#2wp$)?9y zS$C=~w$Ls_jB}h!0Q(MqFA4kfB^&FCP96G=oY=#ag7N(`(DTUQej8I0o=W6tJiz%e z3{KQLRYV99YgT9d)A!e~uFS$fEd02w#oFn5B<7ABG++P{LriU%aFmAmV?ql%YjjjO zD`^XY#RyD&8}kY&Auk6ymY%q13wCOU7)$!G{aIrVOZ#1$uRiOC0C{CY#k61g?P7>g zJd~i5%wu2a>emIijou?cJXnZ68_gIbVSgPPcCT1E1@}5LF@kbHYs+1vv;kUgD`_TR zrgV2i5bIfx;#mvkqulW^9|*ifcVAe|B#TJhm^fhcQv@}GfBTihFN z#?;QnN)dlmx`Yg%7EIgn-t5&*8(p6Q8%s(>LS;I}O1kz&ogZ{jZ?n%ALo7fO)pBwp z(k_NpldI0gzZZs8THg#f<6TuV*Nh)Jn1$XfSinwiDf5@JgtXCc!vp0wY<+&#(=##Y zdpS%REtB3HTwcqG`FI;yQK_UUQBDu`#gxUmW55?H%XY)F`4j1wU>_~Fy`th`(%cUP zxYd*q@*c^#x(Q^pt3r+$)qwvjn2KPYf+(&_q_0(WXzkb2z!b zKiJIDe>17()a~-Kwogo^-BJ-&J!cg+7|-w8-afB!nOwe1KIb>zMbE$VwX@TeJ_VeA z7|~{AU0uKLO^8D%FTaBPuTL2bXa`cZG;yUK{O?f}j@$2xF)D?QhLOpt`VubuUkG{F zr5qgCp+CYkO~0aL@-i`Sr|7{}RvUe<-x4Cz4%Js=F|fSTSpQ6%&g+*NFooGbXZXI$ z4dlA{ZNC|)5jQAz!D;hj%PTVW>|`9u>2hY@`5oURwDGQ6y3B+lPc5y?chgeYM&F~> zjg!rJHD&bKEHWe%DQ}uv*epHU1BlkoUZ782tk&HlAe$Mc5kr~~LkHii@9(tPFvQqg z#essl+p#oMt(OUQM2XZcKvr6X8iCuZbzO}EYt7#&>rQV9FNKrMjyvPapUnh|rkmf6 z{Ec~N%IR|RTJ@#oA=A!ournyCRPmu*n78aY;;+*Sgg7+f2o#249}8?oEMM7m>Z8r@ zQnvU1Zo+68tl3X#()Yf5S2@{u>2z+Bksu{iq98RpFdQ65a!m9mU6LD62Vt<@?`}AC zR7dEo!35Prk?~sbl>2Q$zTuxVbw@;@`q&9m6qa9l=wDVTk9Lv~;%@+!+WAYT&m7Ci zo*d?4xXVK2w%^4y;9&f{1&>`~r^pbr3zqzckqixl;|wxvBo8DcK+V`$`YH4V{d25j zQU2FtQpQ7Lv4Z;tiu2Xyf5onK45O&}E|b}g<|#`F0aU%CR|OZhM*~Da02p((Hv*U% zHyDn*Zi9!F679?Owo(<8fCP~wfAXu5qyg6<8o3*cHS6(dwCAb3WT%82%%HFM^ww;Y zzn)f%+J7G`!nZHXm@*;fcGB^G_vWBQ=7q#3kona-EoN$PW8uA2B zHF#b31uzG3DrpU-Y5m?`K=x5aa2i~1uo$nT&P^5Sy13;xEFB%)kulWND%+xde0E^& zU(YY_NekNcsH2LY(qS2G*@YSwFz?8nz=6xp%c5^B{XPb7Ue`0uv186)P7mh&kXAch zW}{Vg2zqmSbJ3sbHoz8k-TPS)A3tZM$ME))2h$Qt{vcAW?_u8i0%Pws?6hM$J5{&M zkC(LT0_Wo9T}+bJyM^xc=(`jG>|$@Dgy65DL|X8++w&eC;=9{Ch;&WjPgC^|MmgQP zq^RwR-hSGjv+MgxNZsEXSU3|-j?v&bTCo1Go$p1ln6&y=FP?3jKxg6{hpQH ziYlmxjYKCOg))O|tjCcuF4xSAdf{-nO>(-@U!_Jh?opm5q0srEHg!}-wH?Tf(;pGpPV>yRfc>a`$X@(bw8F6_y~~7~=o;`!_EP z(Tg!dk_Pivm4_Vh&1K$hUm}K!Ix%NM!71HqSnZorA*=gXWk)JeXWLnA{14$~F7Ppr zS7v=k+K66pTb=jxEaz+nRrU^-b?ND-Z%uv?r@Wr5ZbY=7@?kNjhB}J=k!KTeI9uez z#|1VnUPOh0gKg-I0-;XSlFjOZ4=9J?E#;_67V5X5c1>?Z(t^1Iy(?d`h^v0aX;ssF zUAvdUa;^SL>Yz`k&GlbRLA8M?#E3C*pc&0)wvi+{UZ8BVM5|3vXMq7am`MgoduCW< zjMB%ax16vaA{(bSBw}cbF7dJZG6G9y-F%4SmG*~fMG^H?d{TH_PC)D2YG1MRP=J9~N?NMc^4#%4 zf(3{^h-BwV^5=4YMBUVmk0C`XU2=Eyew0joVUZd->rKLO^X|DwLxP1EA%qBq`YH}t z+xKUqXk#M|h?1ISk2m~&w`VVZJ(`Uy2J98X+)J-L&`7iDU(`EoO~qZ=Hn-3<1IVp! zfn?>U4h*`aIv(7ZG+`uUT^l!?J`o3+;IMvEF@!NLTo(3LDdb$D-j|p8zMF$&w-|r3 zBXz(i%epa&F+TLLwVPR4$oAViyHx#XoiR+^_#<0vQYdrU8In*?(@sr6oT?xXt}e%{_p7r1aC`E5 zkf_FcO2}r#)b3WEHo4`a+QYFuTi%uNNzL543qGQeB+~SOa0CACV$8!d@weH|Uu@Hp z)0W47nul)v(d;<=1@^I_^uF3cQYIufcqs+Zi``1jP8dQ#T{)#Q9S) z25p4b<38hMnEsdUOdM0Gd8{9T!onvXf>Yq%8+MoW1f@P%9o$6?7^B={UfFX5hK&s# z%nuPtt|Tb|!rJ85$`)+-73RMJEMWn`L%!N{0l#EFe84W>lZBMjz)i@C@i0A}4ZAh8ACRv!=n63B_rQkrm+JrW#CTTbHr>41G3B1!&^>YDd{H! z{476@sHZ9pHw|YCC_;YP7g;(rSfr-*QVi zv{0t0BI^hw&I%AN-yY-ED>K0vAu5^p}StIc?s=yb^VM8m;CL5@m{~M_pV6YP zJ0fs?GDH1Wub9^#sVM$T2TjF`*tLIZI(rL^ZoR5$sE8g&tx&f>u7tY-8V{Ry7p`-c z6NYn*{&6;}`XmFKGP+NGtz{-bxz1fx0#ZD7z(H3Aw?-{R8O&DJQky&oK zCt87_N*1C6GIi?}jpff+C_pg0(}6ITlu^%~IF?pO(OpHHs*$MdR9zUs-mq0_u-`k) zKfFpGlDdN>1l-;t)l;V3`A=`ruX-#NnOkRmVX#_N47hfV{~cS7VZtS!$-qz+`s`4Y zy{ny`Wj}axXDjM3%!uHi#VacmwGZa^TD-QGQev1w&n$cBTSae;N_VUE?PNSDDL%Sw z7w*Plie3_e+JmMtH&h^4CozD~G{GF3_#j!8V1>K-IiZ$x_XGC9{a<-GsR_vr>q!Rd zi5e0@Rz5JG<*%OehbM0SQ5GO=+p}hp+$R;aI@`vcg=PoK<>5in6MX(QA3SRzpO^b6 zvmQTV&g*-%)W-6Xgvsx4PB^WN=aZXcOyxbu-ifYZdVo~JZ8Qf%U|w}XrhL`=dN5%x zx@VOF^<^JmO{DMq4*ZDM2!xt+a;manljpbVed75Vj?g2H{G>-imcw;Mr~i#c*WYSK z&I#Bcv5|mxfk0tna`Y~s0?E%BT8_{2+so6r`JbqYo&!`x&-n)40foz>0Z~_nBzbLv zJYUpzY=q{&X#caSCrOyURkTn z;;EfqfY}5aDbW(3O0-<08V6b{V+O1!Mp_@j69AF(ufRK>|Mn4|s(LcAxV&Jd)7tZ( zVYx=rmLKdRBH%aO#7i{LFjqaKsJZV~63}3FW;vxxr+@0zRHry$<)MF_&5wumEaw_2 zn^*|W@UUf`D%blF&&*UjU)7M#1zC|XE%s{c00{~D?X7ZT4NPtrV_&ya{(T@j~Q z>EcL-@4)CqE-!U+K!KYH{qGg<&KHbXV7xG3PTB-WfI5PNQh?bE@XgC6*b@^y8cqBk z^LJ$M&(O!mKr2##<}T>Ke0KKe~X2=UX{BNBL zHSPqhguW;(Uw$j$r^RLM^wg}}J75Oo-Z{iu0aL9>0!&a9^Q)c#;L358ogwny=%1>4 z5_bdu3iQu*xF$~&SWgtBdN^gkWaA?|^${T{gsK}I{yvh6gYv(3fE-ogX}#cYYEJ3@ z(+*Dj6P5K7m39B<$y0yIO@Za`ANohUymz$`|8o&NtucPIf7%(Pd!n#00UrI^S9sc^ z&YvZLU4+iHZSf!b@4r@|IQmm-!P({B!%yuLb#Xm?yV0lZJ=!Rc3$&)H^|Z6g)3Ip> z(BW$?mKXm;`>(AG{LL3d+VC&YC+Rmh3<7xGn;}a= zj2s*sRIh6*OjhH~zPjfKzV-ae`R8|W*6(tyVFIzLuzT9WlpLY@!4#G>>f`&C`=7^$L>Z~a&cd34ZBzxI#C=C(~`y+^}M)xK&kS1SyUE-GpS@jB{p z`25Z3vz?B8i%OWBDGwNT7%JQ-{{p$`X8_fQlhFchyF;qIUG7rdKl4Ld@xPm&l4wI3 zQRna2)V%5xymp(iBR}NQiet!r%)KkUugYKoRFH{504&x}BjD*PP~5b0K9(y&Kb*#% zbZ#aqyz=PbnTQely!I$r)bCcPq-C{&FElvsxd$(jn%qz4FJHd+t~0&$K0pSrAMM1| z?eCj;YPRn^idS#oDtA;bpRYzHnwgI@Mj`leRafsVr8wVv`!n=#4cw&vbDl)=pO2Pf9tT*~Mw-Jf&Drvsa8&=jYar?_@^s>0}wVT8lg7&H0juYxfO*=Goz)eH) z%xbyKhdfd;?CSTQ+G3Zq%7-(fyc~i(Kf4d<{L-j+)a-S(GbfW~q26L79tX+p)Ph4G z^rkm&*vz+1i_1P3G4VP2J42u?@Lfi;7t>7n>ISqjWixZHea2Ea?|iRCs_^K4@7pcj zkH-PLdVKcjOqiqUe&X(=z}_=r`%a+>?8+C2|I8Bunm{PQ9#YhE{!eAGu1R;NVACrZYQ#t`(t>aU>}rll z!J%X{oejxYM1m5B{&yPKrBsxX*OWV{-K@y}o_wwmaBcWlt8iNR@wQi`)N(ZQE!EUI zJ?te^Ij0%8+5Mz_eogV#H8hsuo#Ebe1q2%WLE7)r*inhc(=b#f|98X4mm3#rc5BJ( ztdQtP0^g;NFQZP=P#vo23Rn-hT2He|1I#B==*ut^<}O&llUKs;+UiAs6}gcA z%d2v$(3{gg&5-)1yMd@Oa83BP146>D?x&47aF_(4Kk;7l&s3ZEz#+^KuK0+Sk6`&B z1hvLt$!4zI;vGfDP5F!43(D6$;RzCx1N;I2zE$h(*xP_9;Y0gZDmnRfxXL+#bTMS@ zj8@8d>S#b~FUGf10#u$D>YWR)R-GJcl(&Fua;}Py@89l*hLJ*Wwx0$%60T>ZLW27D}^8LB!1F-9E#Z|hbb^e zPU&sLEH3!YEz;tkv0(0yJ#2UxrGQ$)XPHFxAE{U<(qu{r_ITa~i?lH&8FYkkSER8j z?Y)vWIDDnPk(=pUw_9Vt{Nu|(_Xh#L!$#s2X54Vq3qe>W0*jgnqk`Qb@;3~qZRZgC zk6*Cpp$m))=uma0;$-uiBvmr-)WkZoltFr_V?0URaKscc2<(<=9Is{*pJoSb-B5R} zHGR^JDVlza@e!LQX+mDsGVprd*-Q{yTr<<9quxgBl(&9MwFKI8fnt;H$hGs!_G?`T zgwyK4&2pMj>G&K-Q%?vFo?pGxxl_p@;@2s(k&-t&A$e?~pwV`Ie%TmaU?ar>ReU&W z4+dMGP~;oZ(|4-?3s~;z3PZ!Z^J~{oW#9$RLW9EvUsxdzQw+omM2@JF7{tzU9R8-}UR`wxFs zCx8Ex$gGsbo6-#58;0Kr4-Sodi6#0|b6nU~w%V%Bu8hRM=nX$&0-P3f!!ao2n=MtXbWgf;c0PO4A<9eIsN!r&hLJR=+sDRaMRz z`D=&xJY*d5@%G|ZwHevpT=eDrH@0cr-H1)DZ}czx8g+7Ly}Y~-@~5HC87uS~f>1uN zeA8;-6^1wljhpR(fV2wyOy0pQxP+9H9M@N@8Rv81<`dUvR!Fe&Gn7~5^Yv$=TwGl8 zTG2AnvKT&`PVu*32kP05@x0#hPpl0rzXy7IdG}ix4j>Aw){+Ec{+I*luO&& z+uE+)4Rs$m^K&6SnH#<)kJ!0HJL5TtEa{Hc*4AP111?`?%vhk7t7kWj@mQFZ!+p>X z0^paDIs0if9NOrR8p;zr+bAD;v#&Xr<370yOg{};5Z3?1?pGq2+ATJ69W|gh-<-?O zRr^66Y4n!CL{0##O=z*YMs}633MLjNczp0nGE>5EkRL5z;L+XcD%-nc|L7wJC|aHJ z64JcO!ma2*xkhATc^W(ZwU(nr;AG^vX0Jlu^EI^h<5lIPds%>#C{R*TuboF(;D` z3JU5)M?1*jR_;rp;g%h9`_nd|jaLybu1q>PT4)K4SJhgn44<4As^f`y9R0#sNy#b3 z5N)93!vy>1Bz+WW*tp##KS$%!TOE()Sj^K8ta_!CS$0cvz3wL24zRKxa~;DhPxo9V zd*D=HXb8@{@(juR^`==yF5_J8M9FJS?;F*?F>cq9Pp|h#cY!B`9TlUt;kP2mUhMFx zBoG%*u}cMoLL^QY9Pj{w#wlu`v`kWES5m7%UJT4Uqsb@@q8D&UKgvDDf!B!^P&8A z=q#0;>ZcW_qmKYGj4>#xGgA{#PvYyGrGIzcnD;yq5lHpnG&i76Vv;*U{ba5?M#Yz_ zA0|M9p2=#h&ZHKO1d$d1d9B)RTx&TW40U}SOzL;bys3UYhDPZn-Bg1Cl6|gYjY7!r z3=n2Gc_EK(faL8gY(2ycTrD|!x4dgy2PFVxbr$42#5$AL`R($_CCDn+5SQ-9;u)#uQvFsF6aUea!Hm?@wobsAS`X_phx?XnB~z2egu)i zu=g0yi2ez^DNT1p3XbXIw*gU|ICIIGPPMn=x?(>V&?nAC9F5ZiVf1h95qH#lDt z&ei&q5?0(fYEBZ(SE-hDId@s*Y6dmO)j=UEF3P)!w@9qFX;(Ykq0AG=I5< z(=OxL-h|fYsONK4ncsZWa4%*QCfBije@T4#p;vR~XV^^`*7BDue%goxDjYfSReF}!oV?dS%+-^JTfF_WQ6CFD<-6kT!0 zKZie7ONY&;B=^NLvhV0U!Ogwaarq`=pH@|u04~kj53~BAQL)DKv@VM<|2Vsq`o28R zsfMj<9;cu9Zp(bkJM;CI3yAsthnbgmgQ~C41SM7-gF=x}wu^erQ@A6e%fBJ}`*Uz2 zlqcxpf2n1+EH{_uOw4KDX?@l7i{%TWzUWv~9ANI;teLsb7>J9GPW4AZE%!;EfseXG z?T}DXo_PwpGe8}^SC@q?7m*oWB)NJc=Ds^QT^3^bn^QktTU`KNR9 zgYU+xq|ZNp`_Dc87&q;?sjDH_k%rl3`NID!7{M!|WP_JQJlp=#xZt(F3&*AW)}EmB zPM1&7<8u6or|bashE;|Yonx8|T`}e&xr1dNdH-*%{`Z!F>3X_QuTJM-OBZsTwzAKN zR$;A5u~p zX5r=P_2#4KVJtw9HiTXoQZCv-&lSjD*V#^Ev?uQ8(5GDvX1-Ho?C5Lhc-Xb0~To6ar2N#&bn6(oyJYrqy8wOUd+HbAeYizj9 zHr!2KjT*Bt6sbIQ$}rb$cco+2Qn})@N36Dba#+HJykLHt9tmo*VI<@uyUS|mDi4cF zE)_&pe9WTDg++gXaN|-h(wagR0%Ax?CoPvD>c?C?Km4F@2WDmLE$B z)YVQZk5QRkw%4U_b3#;FHifljY}A$+v+qQp-FkpI%Z8yf(`ycI*`eYR8`Gd|ad$}O zfp{tN>)@-R(}qo{H_I6X_F^Z0H@H?OyOg~2bK@{o-;pXgzM;X?=dNrlFs427444v9 zc;SI{Ee|^3a=$bG^Q%rjZ0AQP&B-DQdgHIaDBV|BOD+=|ZBZ_vzVq4I4XP?E0+r_b zOQm@?_8uLva0!o+@q z_p3Wt;#7|-Q76^>_-av(G)7O2to?#Yh(_AU)r_{%n#xK zfUh?xkw83~9$LE{6rs0!hkWC%rAgw04a>N4epgft8#K4Fner;cT>#av|}pzrhKH{Xod)A5~z*HYH1khh@yz`n*ISa|+Tn@L5d&Cn_0 zqJLL}+fug;ZA_y&b5u%`p}SSrUXOx$UBV%APvBIU_U@iq6}iVV+qCelIvgWlgL7Jz z|Hm}}{EPdKnA7JPTdxgxn${Fw1s*@J&7lXryK78e>M$!bNk?R*?+3B#^3qgQCVYoe zamp4&kqOFhnXLxUA&7+qzL2og{LH-W48uRN`ti3rqUGhhZ!mxUqNi58)pb*t=w|Aa zrknUlJ2e39wJ+!;#pG}t5BT_+_t&e?5RzlO5x)<*JAZeO%2oqtUs6MgbO(put9c>z ziblVvM_*(7{jO2~PZ)ZDa?lvxGuB5o1Fm};n9AXIbD@!v{XOn0dT%3X`+a!1cKwDr zT4g~1Xie<4z3Eqzi%!RG@1E-zka}0LOqoL+QPiH`M+*DiNv(dndE(QD5KtvD@s4U=FTL=4;o@C-IJDp z6+^~?8t)Ft(lPaxR2AsQ21^n`_I+WNUi;VuzfCHuaWDLfw{5?7-1juYYZ?W7@m)gi zks%rblKA_`%7+4D0UKI#ZML#uxH*_zyo;7K(7haiTYtv%lNYkMw3=E+rJtp$4~^8T zlfr^6_owaegWJ*oB=uQqIajxCD~ALPnDJaIxb23@%O7UbWOXcBPMEV3CZa8QxA@&8 z$4a`sZS+uhPogcZ$5!}uU3yJ{D!MVwq$M%wm%&orf&HhouJQowG8fgwykLQgLm_dD z*j|1Vy1X5{aUVn5R+^UgFpD!g%;gLC4-)>(;29aMgd4b-)3R$~m!z!RTSAPB7dymh zm;NxtrO6vS@*>u+p6t$cORWePX;VYN!^;sa*^#JANT}EsfuL}p{NeS* z&X2Po2*aIAFAulLx@MhC;DQq;!TT7dSK+p6{(a^wRgU+fKMu?F%c`^>snPc6+5vxs z4p`emJQGA?88k_gUVI342~*)fzg|rBZHt*wwgrpshfE6`3b`lINrpq3W{<%ZsL3U* zvIKb;LAh;>6r(zyd-o$Sw3d4gyQFx;94qCjuV3PJEWAtnve{OJ(oS~$aeEuk{_w^; z(mdJuJ9q3tZ^VPmj%Aw+w0XsEm%&3<_` z(=$T}>Of7^2Qf_pUXkS{6E+OXNc;Mog0?32e6X(pf&h{w$y+w#bSgPB19(u_Td$dt zQ*PK82=s`;+CZ)h)d`ZmrKSWNq-a;!HK z4ce1l7}wXB>D>zt8SYC8>hOXf?niVAI+)y3fqBGzZyGK8+~i{R5qeX031$)kQ*fck z#&^Q(3KY%EE|GB5Z8=uER}}zH-x7pA`IoXn^AI43XwzApf@LO435`kkX_Wg+q^UWe zUprP}d=hP=Qgdcht&PX_x1NE2buksQ?D2V341~&|M!QQQjdP!(f@b&HHCp`+Py}#j zFT(NP_<@wGlR(7s@3^7wI}4ol`}ICQ6l6E2R>CYBybLI&F1qy`=Z=V3X#c(+l|f+P zWtfKYCUnt@wcD+G_BXyx`UmtHB0v9Rlck z5uJ7o-~xg_)4jnlJO~-k9O;cd>zvPMdarx+GbtPdfL4+@w3AW?NGltNls9J2-Ka%H zkhO`D&y0=44Rx1d+cLn`kzh~0uHg4zf6FY{z?83&Z`uJ2rc?bbPIm3T$vPeePoA$E zupPSTSYA9VHk0$N#z;3RlCAS&m9m)+sIL$q%4RB1Y~#LXw%+>@t4&6)X7OvW_hB_f z`C&vGK!5ZyPnrc^RhQJ|Vu^Y0oSK-b1(s6di(L8v8K#dBE~(NiMv~7VXpFCziKj`8 zuc6Kora7LH_GBXuQD@u|BDzpv^V_*Kl$c@ zc9)F&HUETvmxH^l*-4`5^0}^y>RN7zVabXx%9LyGwoeDja)(Zvips86RoiYlWFGwy zmg!0=^~+(&rbvv|y`>3fFl>kOmYJNax z4+I<^oDD5kmebz5Nb$U5(_Re0_?%IDlvcUq^BRCAuIa0B8-6u1p)Z1^a^!{eKu zEAe*R?}F@W+3+TAvN9kYCg9}Uihtd#E+JY z#gfXQHqEhza@TW~%QbPCl}B`pLtLYhbIvH*M4jcW(ORq`G{Bo3KlUQgA!GSvT}MRyQBn6)72m4knUAVw z2@2lM&lVLUMs|(!VpzM&0B?s%0*ga-_K z_}oVD1_h^1r2%t`yPb~MnNOUyiZGKWRrD&fSuBhpMZ~7NpcL^3fn$mF=tGIotQN!g(36{cs;5v_nVFquD$jqm2jP7)qPC zN{9kqgzJWBy}9t9Z!mE-AK@pa?0OsRdqTBYS61arZzSRa?^1{b%l%5dXEP4U2n%Y0HVwr9wR1zy5DV3goe9YB9{b2XKs1f;R*frznt5%^B zp2%qPqK7g|_4+OfYQiekt5n+|L>zSGZl>4Qf&9RM( zpjb#4OJyJFbm+Wj`?)#t1`vuQKm!s(&{iayCd9H8h8>|@dcR#S2y+`m+8-cIWj~z< zZ9oA+F-e0tpdg|)OK-6mTirT^Ef9&vOFlCm?;Ex5x#aCetr0|X5aY;YK4u-kdgd(QiwyY5=& z`(0~3%~aP^cXjXHwd=osn~<^}F7HtLiN0rJ=MgR157ik+(*EESUAMD02xkWKi-S9H zxr8!Z%_fFgUe81*sV2Orej4YF$5I}I3e^s{j9td{{=VQTX*|H?hH6YgQEzbE`i`C1@SOCO z7uEPug&4F==oq;&563p0zw$z=ZUOsustV|E+!~oHtm8E#FAF!B_-*Q7M-gwO+!p}N z+2ML<NGjn9T$2a+DAQ(vt)Cx|sdt08n+5P(4Eo1P24cupAEqdV7z%8^y z987~uQjtBn$EaV=tP zjQkz_6_yq4@<1<#{-$!J{9B!@2}yFig>gu1_eGaE0>sm}!G4Y$)K|;V8{R-R67lku z73psh71jHOP_~hMw${YRCJG`cbf+IsU>r8CrtBE+=(A~b*lWsoZwEjx+({{DgJM$oHr%Y$T_ZX-*Cq z4DY)hXIu;0x=JrUIF?2WV{be(r=68 z6TQ?bE$x76Qb`SXzn7r?_s&1x1j$Go8Na&P5@%@}wgpS`Wo>d%YCGTTL>xG%WMMZt zHrGI9#C6ZO`Yb1iNv_Hfsbh1Fl?}nBS%E4amNb8lmuYfHFVs9q!CqI4d5E`GIn8B4 zB z!|U{Z(>tTx@y$wQ`PU(b6Bp5mPwaH6IsC{KxFMXcuKYK4-EmR<4-gPuLlottwHUUV zv1w1=PN#J!HNOjWF{u5#zE6v9$<4#z-y{iSI%v=m zRh8Mm>AWYr%Fc$9BkC0f0Nb{=UMBzZ@fB<#*i$H}2w^Iy>F(v`ga3jccREkL0)qF+ z2iK_{4v$~G@v1n?+kw2*^`{i|Dhw&BXn_94kZZN0h8$3;GXv(P4K>Sf`fSD}7L|Lcvx}n380yucOIQintG*m~||6E`Zwr z@S_hjxm&w&cKd&N;mBaOzo)g1q$7J2!~~)BbDf87HzM)LbUcRNL|p+$+d)!;O?zTz+kownF7Li`)x0*`5kBo)Q0fdO2#U%Zl)f?( z%7TENEl0!~Q^kDu4poTfM{Z2H<1fO`hl9=!FD>75nkWwa%>6N%K*H&^r785d5?-zx zQKkGS@%(pg0Aa4?qRH$8msWFKe*FCAeY$q@?o@8F($Z47p6<}@#m)rzf*tebg=NG9 z5h}YoDkafas~cxzWWdZ-Rn*uAYI3`$i1znbD00y{q-Kl~NjS`wNpfmQe`M{^jRpwuCU3X1svo-HuIak-ZgXJjC7jaq zY%`$|@_dU`B#H^VyB<+TUoynNZa{p@+Zz+9^UMh(UaBAYZNrqKsl4$#Sjs-vDC_s7!j0{3KSbT{Dj_hP!XQj!FVjZspszU&nHvjHVV=Ty+^CC1f)22;?Ogsy(C~ zCJpw~yZ&r9Xv5DE)2?H%beA^N779o+6*hhd$aExrdZ+(nLtv$S;V#4x*CH}7BD3FWp8B`}z zZ&Z*kQp)4&+8h)eAM{FJ1SQgbEUwBYG_H>;ED%e-WKtyPN%zb(Jwz9O;RG;?%l&XJ za5aGL-~^l2$A*B6kReaKS8qt0!eK2+@_0TC(YN`6HzJQkPTZlV%9T$D5J$fvteKTR z7v0V^5kG5l`V78M0l zQ<>9k2J#3vQl}hwrcbfgX7u6;H^2?d-q>xnqWNIYnlixgOITR?N zwRlFJi+=#@yOxF@Yz&Edb9WE^F+zK!6A{kxOgZzXG`fzm|qhKn&wqJqMMq=9Ge51-wtUc7qHcD;u>c&^*Y}FPITKnF}DJ)kw z+;#f{6A2AE*wEu_gO<7Nr#=zP#Cxe0w?f$v6;e2NM_uzWB^BoZ1F2$`p*toX6zg`M z&{sVW3bPDbcA=_q$xX!-=llQ~*$@nay&d9xeW(`(`!&5w$1vsAKKWoIa%tIMN=F9i zqwb!nBra3O#fU z>mKSnzrjvjK*Ya4rYls2z7{LuiayLHg76vBd&pw3c(=RV@Y=xqA2S}ZKrYL^@2h0M zMvM^3p+^?ROx5^8&xxbd`7NlzBggJ}hdipO_~PRa8{&Wt!rC>ltFQBk{uP9md?&-} za}kISf_EadG*(aK%#X`8x0`UUpIa`XjC0F&@{fRf``gKoSf(TOD4H5o{9r#>*=dP; zPLqr#ocW4qoQ*(u1g(jhNrXeR<2 z)0X&m&MxbbwcB@!kCG*9#kDf&BP0I^`N1s;uM-n1F;h@U1TsaVtbkCRtoM+=U8hOQyv6yL`(!aY-x!!dH6UPee)pRiIByFSUwjaF9$=q zT6yCgyU&Re%%6J`Ei(2Ry&9nmLA+P@s>< zpu9s>zzLgJ0pVTy65=8n5!Qyw=ZQ(m8FZoQ)L}s*yWx)iG-XRN!t#e@F0v^~qqa#5 z@tTv4)of-dTvnSzXKv zSjzX2LTe(9f zG>B5@Bb%lM?H7z2=5vAsM3LYnH!{T7*e`xz*flQVJP~_|$;~+%>p4yxL7xyR(gLGH zMWyKu|bSa^Vh!w%wiWpu2j?4OdR-YH}PI95LH644+}T8L2q3vh~o|KM0d z!(^O9@{@YHZ)PhvGoOIR;{{@&|DR7xF<0W>0V z%#S#W=Sfw~ro>xpH*~CmO6*M$@k83lJ77)lz$1O%#(r$`Vfn*o{~*U%wrG=wUb@z^ z*gG{V6IYfabhgpX2ME-P|HJLOFD$B7T?xXd=~08O$3FjOhzdylZy66ZDT8F)3i*AJhgE@mhLvZ zTX+3h_g0c6_&_nSg$5!C7v_2gq-V-;qeVN)%JYo*#r zN30x*?l_UDYrOcc2I%*U9%o`K?%Ywz!^CcF+;r0RNHYh8(vl<0f%OO`^}vAEF8l z>V4B?SO$jpMHIH#!(v<3d~IbxoxwI=OX#LXU3CLvI54TNm%n#kOhBN zdcZp|o=2z(_|?MY(TSLMFBU@_RkO~(^Kr$}U>yab>o*VVkE|XLN3KyAViId+9ye}Ggi z&9+mpf4u@PK6M|lpY+3%05&TyB;?HKBpvKuufdByHna>|`*ID3OjS{@D8Xp8Y{wTD zm_mPFOX&x`tA8DhdnZg7(Hy&gMsuF~^|9z!0KBTrQl2u-AZ+yZ)#`Br(5UsMb`#n5>j)4CXYPyG|DQ|O_RW0Ta)R4TOT7E%4KN05GT=%2bGYYVeK~z zxB%7FuggZmSzyhOqQ+&J)$@$9+c_D*K50=u;KHOq_@Ti%egGOz!bvDZv(+j8q8 zW>HZQa}SP}evNLhnyPemKHJgvR|=Q~R}ZD_8*@}W>NJm>82k!)H9(zth_BC?=Z59_ zcmI?7{LkY(UcdPT*34g;)&MIygVkCfl|+4-X7LbWYs7N*N+D-Ai&2+)iRQp?8Cv5M zQ_pP{s3%bp3NM}Bn(xTM(5Z&pblVhGoRmmfUaaC546>=W0|cWr*+tRs5;_&9S&XU5 zFSfk|YAq72s`esUxopERhff-_^PnXoE+$ngZVfStMl^R?@c5rqqH@vNvg=UpU6Nj|KfP^ zcpL5eN88v{=g@RM?mCeeC>Y!di+4;A>xf%kd@y~$0L6M4b2E|b>@_$WKciT3j`>;s z&^HKZZfDGJNNw-1`%yb-5Fu=*!TD}aprGa*wD8DiUm(J4;}4obg3@Ct#ij%3y@iMn zYm$_l#YGd730SwD9l%btLJx+~f!~f^`2f^>d2Shxp zVorO1S({8CLdgEvA^^ARD1g=ZTNV<9`#o`-CIDU|&sbk8DaiBOg0%K?H4@L>-;4;s zE&cHXoU>Kt);IM}6UeDo=$T&)c}K3hEF{Sh98Wq`LSJP}+HL@pvOt5=(>MyrVT%zi%2sHSM|flG=Q`Ukb$3^Gn1!x@uBU9;G3)%hxKGg9qzh zg1$tY&`%4xR(9CL+zu=p%HGl5{pjJ@n#q_l9G1kwJzFR;n*EIk3I$fc-#koeZ>`sh zWvQ{vyg?Up(5MQXiC>Rq|01*Als^gHDgJ+xSr3*^Ir8f6`zdECM(Flenp2UXFEZ}= zt8E8b9*>S#?cif9y`C3K%39-u6_$zq-3R-xjBs|p6>gpnQrMUz3j%mHOk zB?gTbIQ{rpziY!@#6!Z<{|n68^`(c(wUV)Wld7XO1O&pqzvIK zNYm*Li3la5^X}TKCU_Yj2CAzrz@P#zp3pA>SN>n(p3tGQA@(^|X6CU z2o@+Vnk=;)OkB3WX82ydPw`j4=Sna|+yQaDVXc}~IFj&XTW9#w;aT^Jg0_ovXP3{a z4f=OzQmJ)Ujbz;j>%%Jh@v0(FUGk1LLE^M{mrB?HWG2{yeUGzgz^al{o#DZsuDL2B zo*Ak!UT^~cC0LQfMtNvZ)UCK21LUL6E7X}T5iGTu2iC>qbt_e*rEqH|-;7vP)$^X6 z|IiiPqK&AZwVa4I?0|C^vZd55mD;D9I_eU~wyLQ{a_J?3{!8Fm9p?Ra8O#Oh?*X&b`c>`hjNTZLKUO1ohTt{fl zOjZSzmA+28h?|bkYpd~0K!3BaH`HmeN&z#FEPiOW)`V}VUR~$|0LO}b5BrN8*|zd) z-Ku^}vJ>LL`>5v8?}id;o)*w-knBq(f+N1{&+o{ z2rO^xI-d?32$s;9=c8e$#`{Rs(SW3_k4#s2qxR9xWZ$R?0CKE=p6WLlAc@`1T~AbC zAvzvmlC2q3gFzTCmTg$@zX+_EFYqYwl}JB_!;rvheN>_U8^H>C)ozAoOPn#AfNa{b z{=^A}Y`M&3R^fm*ogMEOwlMu+!dObG4tS9Ot5pd3+eq)`UDVja$jpOg4Y}^;nZXu;OX!Z*mHGsh$KY{FUDVtWoG4*X{_-?EGq5o5 zd#Z@_t&d~j+?)3Wc~JV>1gJvoomG3%Akw38M-suOvL4J&;%JO z5_`!45gBE<|BA>w0*;dUwEFpQLGGJ^SssqPi`_}gBfj@J!{{OyI;21N7_WCF?4pLJ z%e6CT%}8Un)d=HgAjpmjBd5UbY{{eX=UjMwy%0amCK;#ewUmIV z_KzcJ@$2714>HeD)patw!dVWB*T356xRdPz&6*Vh}qqh5pA{`piMODdG!lsBttGA#GC^w$OfSO<-st-u> zQ37Nn^8I-rYU$c!GeJ2|od+F-g15kWtCkIi-(*w!;|j&&C6VTl++3b4+PqB)meu|E zPSXP%mm%m=4_c05`FZ)lzWmzrD+X8kfSJ+Y`Nes@a+%T^a&67x9w0$R5?I^$?aFy* z!+^cK9GF^1cCv?ImBhwllr>U>bo?k9c!GSVtv z_q8Y~qxfgo6vJniW~JkXGy-S6pQO20e!K(2L!)g(6j%%vDg7A%Wg!z&N{VeyuZXiN zp>E0x>po(FELv2jwp$(}-_$E%8qO#ycKKlBju){&4)dux zWu8RbC!N8k@9HZ1C{Uc#XIy9z0G8EMK(AMby1@3WWvu;V(n?aU0lT*0UO!yIP71)c z((|Zj;^={hpy2~sElumv8kC z#kIuPb+g|1cZ#mVcDK%UP|^xl%C;wWkyA(UE3|A~v|ww!%AW-t&p5;_8a#S?ogEY^ ze{^#IMZ}B+F#=#awY$j*qO}%{K2#EGWr#yxOdAk%OuL1mpc7_KC=gWQg(yg@V&pSx z#N}J?dxmO;epD{^lZAfXBsd-9+hRW0gsb9%#j}A{yNT&RBqPBrYhBZh|3!B_z5R0L z`RC05cN?srh z%0}4Ws3^O9kuVX-ZNzyRAn)PD&{enr(;(@z0gzpCPzg}7d9Eb^5(b*QnWs8xJ`mE~ zl`}R#tvkILJB^Vn0xzQF2__I6PqC5C--_vq4E49N?|H>-^9><=K;aU~{X-Q#fD(F_ z*8e)R*&&HU546pxC)p9V!X7t3UbB(LDsG>B7#*$V_!9qC0RVsu-2#r(OAXKJ+4uA~ zDu^O`H4n$5f1IzlxJR?Pm_IK`R3X8?^U*Zz!rDJgBMA&#EH%`J?1`8kJlFcrs0Lzv zPo*2MR+b1THfCmip%1X@l(}%p1o%zB*w~z&QwgA?Fqln$n<8D9W(-Zjlbar+CLPew zvA+(Evl(gtIMz$G*}Y%CvsL1#jR5-Q;c~O(-SqtVQDP+%{|kRfHyL5OMLg3(w*Ba4 zw$DykV(Ii__@uNV7E>N-9kjtHvXe!26?uDzc~#VCNB&mnFVGFZ)&=6nz`Ahf@UGCY z%m3YXv)K`1CDJi}WZGL!MW}Pk1KKbh$hv<(u(1SmBqL79TL0&_$FLKS5XoFzcU#?7 z*J(bc)xce)^onhxuBI1AW1XAoba9QcAsQjwTT+=mKc)Yc@(UBQx|}Qu8ZA?{N*WMe zNjyes1{=W-)}DWA4)!z@y&NpgeZ95)9ZyN0^%rMtLh9CFw9JQyAY}2|7S))Wdpd%2u}Or={!o3$?#v}cU)ID$rkUF$m>F)8mu+hq*6(?whmmzvOeSuCBa(aaL5nc}UQURf|iiGHT zRny+^-RFd9RQ?oE!0!AENVyUfE&oU%|3VGu3TKzv*JOs+$eWBe-cu> zE9*qqpS#Pu3JAR@d<%Xy^$dGzbeyZakok1ib_J(xkk1r|L;xBFuKUB`oAjK(dL4p%}vFuIB1~m_)j_`s> zJQdX3%|}63y>E@1H(m3?8tnNa%QvM*f>r$5m|RDo{MqbIz6kLBXOR~NM}Jt?lFVAr z3_!Tg1mIQZ!1|DS9vpB45PyuvwVt3rv~q%PAnmbKIXVy)Bc5twp8}|+vhY+Ii%2JPcGQpfE0Gd=jF>alCJ-P1zQPmd5yuxh8#dsVZ(maWWS)UF*{>iqpsSs{pVw%ut}Q>nIe*x zn%F1emjf^F(xRZxw_dxv(;ge5&G3%EW6$b};4d0N6 zJ&KGZE8a!YeHMy{MAlUt-Rzg3X)+GWQ~h`Ytt=Z+Dwrbf zK1WY`vP%&z6V+F`j#@pES+tzNln=gFllN^A43S%@anW*NT>eZ!@@{x|YABzS5Qx7{ zr@wTGdHLFMGTqn4hm6#M%1P4UdB9=VVI&t42VD?1;)lBU=$3U)_PvGn<7>k`o`ln? ztuyXbZz!as{4UsWwYBKM0c-HppoyVj=NW04!#%2ff0~5rxh`WwZbcbi$@l26pF<&? zjehupY=a2Z$g+-IW_CGRqIg`kf(gU}ymMQk$^<5M5AZRJAADQ~WF=+xF9z){y$Uds za-nJ0Z+cBDfwFgp!p1`!D4tkD+Q4^7dgQG9(y%#UtYt|%ntOU^*Zq~Qi zXFsJx6vRf6Gd8QO|?_L>z2S=0FeMHSC zIe9#XE8$X?4b=LLhCk8|NmiAG2G&rnvh0lb94y2i3&(ZT2?>!-v5wwF?IQ1xhYp*I zS-!BKBiR!3QkCu(_q>T4nU8V%9*sB77jL>8CSbgHNoL>gf_aU{;($kg%A$3D+Rl-$Yw!;#=7I*B~FJ>WMu=Zqh{7wR%G32Zn1Q}(3wxUsnEM_ z|I7{-ee(EtE9L^RV+_Nc-YwyV!C*V-$UN@VrbvB8KNs9%%ovEL_FaDIrbYF6oBPZbl^6GuBur(DQJUh=#1tIxZDDakVW zUPs%EIKpzr5Aka`*!pi#`6aOQPptlaRSR-j_(g%OpV2tj6<#WS>?>a6(*rpRv+Jm6 zj6q$5XTk-gXLFby+b_Hl?#X?Empqm1RmOWEUIz=R?DrH!?UhDwA$yT3pAY&v-HoI@ zDKJh=ea`usf&*O+eMcKgR%^=a<(Z#1zEDuG5!^^an)0dKM+H(_?m}Qa=4fMU?pGC0 zqyLD0uN7i~$~E{PRXwKF&`h!c=Qe1 zuEc{qm3kjIgW;cdd_68s_{|T#c#{-AF(UL{j(&YIXK<;S56+OFqd#85mpI~+`&t7x zE_&ma^J2O(j3emn2`}E%(~tA)WjFkR>-IOjjHrIZj`s^UlCo@46og?Oy4rj4ip+C& zH5a}i*)?7FD{`}p5excs2aJEPSeWb1uta))FPv~#45`!g)7cQJ$KoB&5Qim(wXTsP}Oreb%Pc+>rJy5Sc8~xoI6urTn>(f4}+`2)g0bWdc zyXG>}5&AGC@xdI9uv<)UFuP>6@IV5wF1*KGZdz*~=jm6s6L>yN(EG79fJimWMnS-S zu0nz??pN}2LrJ<9rsKiUAJDrNKM}>xu3^Y5N_TNhp9OYu?PV37|5Am~Y}s_hu*>1d z3dGiJcm&ULCubaw8of{tBt`^jZ%yDHOX7ON=Sg!%-Lg+*ddT{K{7zY&pVvlPPf@o3B7F5`3D3X3>Bv_$T)ocDG!P+-ulI#bBP zN%*ZZNS!7PfvJH{tz)hYZ%%qYwO@-BX7(29Mq@s4b)+H$d!l(OG$?v?5Jt`<*J=q!Oo5Y)~$j{aihdZ{d~qC1nH(Ia{xyZRbXDSXoFP9b#<}O z`VBw0LB>8gc(M0QB_%&tuxqyFOJjEhbJ1?N1Y*r?#%uH7I$qo}tjt!2;ckeg4b}sC zmxcu}}Snz}W1o!No^n}RqL*Hx;7O*eSS)${T?B(3HymcjL0_EFU=(DzG-c@T7 zI^?u7kwm=Q>T7++FkFM|Dyo753n9w9aGQV#Sz9T|l`la%YB0Krp>KNTEnsirjL@KN zBgabmv%h+MkgT?(K04uBU>)++5@~IaUJ-Vuk$rMsefVT=@0d*cJGGWLEAc9(isJ`C zVQg{AIjI@+oTu;cO@vC|!|w7F(E&Hcbq&!$U-}m9{@aV+(dam>NY;jUwKzT9B-`vm zA;oys_t*T+bc{BX`Do4!UFQe14!eR)3tPl3&Ge?XPqmWva5If6B!PT>O%*0OI4-5( z@oIzY)ycY-?&Llq#lX{$WS5B?Wta?}4Bhi*;mlz|A)xT^U@$gz$@@%)dk)^APbaIs z$$h+XmJF_wh%hYtd7e?L=(smQ+g8!d@8{oy)uIXJQxj4QdtggGpjtbXr*OTD@9{w- ze(tL+WV=vJf-YRM_pEL4a3%t7#VTjFE$@3)L=2R*C~O;)oA|K$#ZdUwK*Y1cJ*n*` zBdwPY3n2V@%Y(-C>4-Uia0Y z=y@0;wOTQua3jqMp%F9(V{wBFReh(Xd=EFrqVk{+l!N)rO*_0}vUAh0r})Q^fTJi& zYXIhXyRNNG0w2Xlj*W7CV`DlWru5ZJQBW!6C#Yek!u!v1A!eE&{WvUI{8bl$;O&BW43 z7ho0~*+c|QQ;={k+(uGTZZ)-AA|_pPIitb9$`q;+p8m5oBKG8Q^>XHgwB3+esL|1*ZG<+sH2g`;!sO2BDALj+{DDS&&ORV?VC} zekncLLSJOjdqcDH3CT|7m|MXNv&RjI#2jpyjwi7wUa=K*xaiNc<`iqS*9 z)83PtK^U~&aVR5Po44j@SqN=srAg@K*9C@J>DQm3LTeCVbp|aSio%BWI#)~6 zv1^cx_g&8OHJsT#g09oNvD^~{zVa?dW-d$B4eIv9Eax+f*WO?21m8Z$JYL!!0MG88 z4W-gKp?!Vh&%t7z^LL9Jf+EW`*6$yKss?##c}HkJEiyjci7$_8>SsvoHF8s5FGe+S zn&mSw=r`N4&skm_Mr?6m!kpAxZ3*$W-mYr!wQHbGe^WvGEH6Kx!~%bztQMLY26?l# z{)5AgA)lI(EF}f!Wtk4%2nPM;yN}rhTJd#xoe~vEw8KYO%f!S7sc)nWXOnpGl zP2oPoVS~e~AAz{iDYX1tCWBUv$&7JG8MEI`S?)PE=j^3O#*XH!+FaQ%vSCNj_vp9e z0mDxuD#*@PO|uqATRsi=)@q|)+GXZ~!Ou;o^LaGbVGDasg#|6nw{`e)wfHs)ZNAiQ zpQohaf~$Ue;+h~m+Yg_d&zi0$UyzYMHIAI7={a~-@AAFaS_ZRnEY)_RUr(rkPMpy0 zdvx$?`p+K=nvPr;2x~<$TaOo7!i7=}etZtX&*Kx(shE;k$=v@H_BdqG`ieA>PQ=?q zxwUR)hW{gVBAHPal<66Zor6_I5_ly3`<1N08-Z6EA58cWT+MBMyi-wONR}MGlwpTiS>*)IHR&S{0ts#EWkw#*|!$QP_)fyM66VM@|{r$<0N)0s_ zj_~3>1LdvXzdthQYNfdTg!A;kCPsWAHPCtiXx+v#2?tu`Gf3r0a3m}(=c(n2zcd88 zmHPLG=zuy3_zxVqAD9Gm{ve>ASX9pF1O$v%bW*@5w*5HR=Ft3pFZ|~*On5SW0I)c# z6i2-@HiGFW4gsT?1!yhk1W^FSObqm=9zVW@6AV90KLff&{P*X(+KKUV;L$@!*9MO2 z|Jx52$T|t-Z8zdSqd?P=&XYiR-o^4C$I$uXArT$OZpgWY$#`oqS%(6x1%cMp;XfpR zF_-=wbHt}BH?}#;sVH5b+yD3gPKX&@)0cW8)ekJ#3J^v8BX%^w)|&i$097AAwdCE*VC7y(Sbn@cANVMp`rU2xnRYxz~HZL8jury0goXjF{5)m-I5CG-o z@_-5ZsR@{@E?;qlyvN5{%ZdM-5ApwUwua_}|7RLsz*PR{x)ygjA&7j(EbhcW=&Mou zkGtkAT@ZridQf-x0bVe?^z94|Mx385aH&5MT6zQhtK)xHqa_|WJW?y2$|0}$&uOIl zJ6VH&UA(vtsKDuP0e9O_K=K=)cPcz!juD)th=~r6yH9QZJ@vrx==8vyi1J=5lxJ%EZoHG=jadzxH`g?0bkSJVLU}wYj~`tou`17+?K)8zDiuaG`C{I)3MLHE*c1+DCa%Zt_y_{A z;RSp>`9(jWqQW=71L2yX6ni+tI^WLn&@eEt%V+VDk?Sa$YjUh^zd6U8l?+32WuD{p zJ!VdS>DYM*T~O_OSYJ5r0}{N18nVy*I(gLnU3z*4G_(q@rvaLq>%|*utJ0Gcfphp( zvhTPd&lu}u3YCh}>2Q`8{nsXEbc4>-$>{rDsZtCbd*m;*4lhxk(`@H@anC zlt8%OHN9QGap|?okpRy9)GJIF?gri7AC+RYlkb7-|Ce=PDXuZ{5u~3ZB_bN7AU6Mc z4_2X|q%bX?=vcDM@ivs-MHSa5MXO3R^iau36W7JW#9YCEO;xB#3e(TkD71dB$}H;a z^eVw}maLPR4}E*U8JnxicYSFz7-na}fC-vp>=4^ZXur=+gc7!0Tu9z^tuM zW!9@U4gp=NRDpv^`He>DZrYwbif5qOlP>}S!qZdk`DEjNSGzv+Mm44yNrzb~@ndj< zLC-$$zkIoM>^XvEh_mb5vQ5`A_VJh}wQa?B+(hr3KMit~k)FN~Tb^c^H zQ9n0(Kof0eUALyiyhaYw>UunIov^w*sJM1jq!u`@{uZKd{6!LjM#!jq%04+{rhV#j z;Wdq(jBY%;clpu6?Mx>#Y=5sZ zFms!h8dQxZ&-{YUxL;qq8l76TpGBT|UOyrQQVV*HPRqnBD6gTF$cwE4v(G6I{qh_c z@ptWv%Z5N1?^t5%J(hD*XR(=|U<5bv7>$?4V013qYTI?3N^W(kEZX(R(Sgl!C+=oX zaAeA8A^R-zD}d%|x6E~SeUvgfI*Mk&7Apo1ipqUKeqGY`t z1&NbMRy7}-A{7g$eA3}1XBOpe6J`EPM>}Rt@HT{)G>fTLe04?GO#3alyRMV=A0+5| zEZ+B1-MR)fa-VbeT4Qy%Txm~GBh8qMs2I0wT4Il4D=uoQO?nRAC*mRz{3SA%?4az} z7%xbbmDgD1R2=oav-(YQlGj}=jagCYv35t6y8mdCwkkqAdORFW`A6gPQHIt^JN*M%;k(Z@cuRHGfd-vfoL|qV7ph$g)o3Y5SoZe= z&3|s>0q?`gOTV9#WMpiDf`S@4It-TYvy-rPr$&yJJGoJqSWDjO{i0LcUsi?p4=PF_ z_(-m`GB4DS4u@|kFwvS(OPD4xF|mvRsQc}MWHD>2?o?7u7lMPpfPhaM-Cq>nzDuA( z_k3ekiHf?g{VSO>Y}v3mJXSUCvPYJQxhS{aIIF`GwPGN8a}%17naRC7nUxZOx&HWK zCoMnUbdHRXfuXRyU72Thr~HC4lj6?>-Q19W4Pu#fLRQoXo70(%dMN>eqlrnLLC?zg zWNYDZg%j>QEG;fB=yvpWp4MrgtYuU_3%Y>yXKutSO*M7iU|HH^XrA@WK;wZA~`I9q0b3TopYW&LoE-c$?<(W zBo_(wO-^naFIkc}vC7NI#icS^_j#DNL^bG{ddHR+?wFWYhenETg$rF9LbU4ICDe_`;xoBJ%5P)4TcJ{^@(={dG~D z;wx&7CG%kCjZyis@{0H%FdI2BZl^4R*rQFy$FB;L#76Ozbx18+IqQ5qzxl-)YnVb5 z*xyH|ah%KzpWWMybU1zVG&ysTI*|H*cslPuIKHU;2O&aqR*Npt7D2S=1c^k8VD;6b z2Z`Q0t3*U^K@!4ZS6#hZ(Uv4u?@^-nvf6L*eSh!!r*Y@bjx}e_J?FWfhf&l9wI_z; z0lA+w^v|na-f!}`2Fs^w4-93~_5K}7x}15Tu_JJGL7~&ell6Jrw8=}=qq_RH)d*sd zYs_DmpWoQg$!TR{Y`|k{ouj$lBTJ-N?(bA>+0&!M*ZHHmy1I_;Cm!bHtFOO5ek>6K z+Gs%*TlkMKjwrXV?R*|CIo0y8D2Wx0ChGg}xq`LrE!^I$)a~QA0P}-8ZAH034`?FwiqoFMOVxh#&f{r8__|5%ekho2vvcML^#{~de%q5tf0f{0so6djMg&zt2=g^|1g$1vHzIONHst^4%t6Hl zKTsj5zaD~?H#P~d523a`2~J)=sh{gWhIjk=W$3D!LLl^C=Pct#?^|;slo`{#;c}7L z+!uC4h^?Mrt065@a4g3a_bsbxy`quUVyGB`A)Uqmj7WROfCYD_(*A54LY;t|li}I) z&As9RmdV_aBd0=+(S?nv%Nb@n)Sly4`J$>Ws*g2n08PepHJotj%Rt(g_J6AoFBd2XQm?3DIBPuDx z=>n-&OK=$d7|rpKqUXH4?S*d4T-}Num}EsVf7tn$vF|ANkvqxi(`Se7n>51-fd7gz zN_GpC@!0(*ZKk-rJSfx{<0fWqsT7)JpDrqtK|xAS5Pgq@Ttr-TDE7>U`}xt|BG3bk z7aCtm)*F8-Er?4F#}*bUi}UctOo_)e0Qt!)8Hugc7I!Uu{nV|w2F*lP>6l2l3qr9I zvhItUhEdOzWR8@q$ae%?)5~9f2KXMHNl5E{m@S>|tU(_9?qgI|nlWkeD1w+PwCaB-`375Bie|k0XVUC&&%T!-?o!I=|Bib3|^Lpp8U(huZdy9Wm zUs2aL;$_m!xdEw}4J7%R=Nyrx?tP&S+gE{intXdLU0mp|6B6oTR9btj2gG&6MiCQfa?gdRO2-p&8v6Fi(cN4Zg+0PAi-GDqaM z0VLtyjK>CHN0@w4BH*!)o-T>>v;UaCF{a8&N`AyoZGtg3oaNn}b9H?1ZB78|-(J;k zH^69EsaT0$Dqf-O+O*_|;Jq2}Z|q&yjIXsS_qOK1n<|p~+pDZxk4b>s=lZxLH$~I# zcYmh-j#IddkN|es74Etn1B1kGCO#0da@Tt2b_c5_X;4nMDdKI)64`_DtKq89o^>CC zEcyLrF;s^NdRi}btkwNs8FzVM>UGPwq~5ycy|d$G03%I!`4--AFv=Ly`feG%g*u6S zE&1BF`LTEqE8<%Xn*bZ+I1i$?wAw!*-|cbTHMYETrqq+##tO-sUWyebg2+vUrur`D zY~3=@zY|oYtyUieZ zMxSY{?KvwPehQ3u!<{9unp>-n>hHE&nYQ5P5)yj`%VR1~B}0Ncma@#;s829(nxc z`?O;+LR;fm9bQ*AlloOI>40^`GHDTFeDMbDZr3{&(?HIbN=Qgg^rY-q)k_vV9jxdm zR@rI_YZ8~Ju;7uFHY&Y%3Pub@LD(FqI{99DMBl3Hy4d=iA$a{`O5ZUwHjtV+B_d5_ zM#*Z%jdjgRiAywuAUV{T?$SZ8)(I_<+A`RxRwRXKc=9fzh1cmwj1`kF!)4O&=0ot1 z)ECf~ZBahZJZ zxOSJ)NW`)3NZoncLA}zpUxvq9L(O3z@X>JooLh#hj3Y>Ny@hmHEqHmKz3T70TrG`) z7nL!7g8IWYv+0k%rgJha>J^4*TqmHX8Vu3;C^a*)fU1wfor9+q5_AHnNqdb#G+ngcQ1sXF-Iey?rD;gFcBF?o|!G z3!eqSEAh+Z3adkp1*|LyJ0LSqQwuy0)^utX4oLx^&^v^ioP1;f(0(!sSbSOX6{Sj&h=V;GLMWD<&i+O-8D7L73f8|Kr1=AKjV~xUkrL~go zkkpr<9A)sF5OGe)5x0Hq+NFD}d!@0-opRu{E~p_2~avz;U_j>{9iKT7U~?cL<&65e$Z;*n2i@(eDrQIGpI$7dM6A z)2{F%;_g(RB#3I$ijRnB*evYzU#c!!B1C7?aa~i*xV3u7`@x8n-$tazT7&Pd-GML0 zbMW5Inz@e=k#e844D6n&Uj;oUS9+Kbvqcf{^Ux8>t#ak7%Sf2*!6!y@F)zA|6@}(r z|J{mD)y3MS@t%hRzfjH^bl^7@9s^K33+A9wF@L1S0sUGco6JwJjc2m$xt_r5x+;-gM;l+z>RQ?0F*IhSM)q#f`mBcY2Dl(d zLe#ogGe2@`@8oK3;mjcTvh{w~8B<5-C@-zBzq9ntGUf7zMuiKGIrDy03CgbS3b2^A zr50`TUp8lQIsA6)0lhK*zW-6x<;Z21t09=yJ>kCiHzVF}sza*aKGRMGW3RVLc72G& zK3Xr^B<6AGLpg7$KQ>Jfek7rzA|m|OxpgnCd$m4DP2dI2fZ1U_>uEJo;kf3t#XrzZ{;auJs!c7i^Yk&8d_+Fx?9Yu} z_q)Azc?#VepCq|!+Oyox@Xv3UJ5QPD^D_QwwXRw3P=veCmTSac^byh*X=cmQoUk80 zqL@Ct$cHdvE0e=f(RR%Iy+@SvchTC8tjlz78%bpdP$r>GK2p6@F%FRB*IreL^&(kn4BiJO%66j1^Zv2*D>fH zeBm6In2*0pB38Q$1vH>-DSY%A6`azPGDVgSV&pKo(T==%xA8m$UbdV`E=kAIh{?+V z#358`gZDwNXP(Qj?88l=`)SI=M^W2k!kt@J4p&kAKa~(JVX71tu0ygMY`L>Mw%(;S zi$9}n`+qY!Qt`2o%GT&CT^7ElQfOKo%oHx#W1KEGkrZz`o13h5Qun+J=saD9PJGeq zFTkUd86_<_y;kB~%uVGz&O%CaE$4oyn0$|fu`0j(MVH=P z8fvRWCvYM}6aq8efe*OC0S1fyz4|Uc5JZF=fR|D%;nbl< zs`gebn~5+O=&GH5xvC5I!rQbPr@Q;vpim4sM_@qI`v$PHke6@|ydk7aY^3W?dLY85 z4fN0B3k)P2pSF|Kci?V8=wCv#xhkZ(ZF_K`%mWaJDB4DLT)Cy=>43GHkGq2O-ikq| zJr~%8TxnvkZ16Q!_-H4ONx@K=z0O#HPkz|XtfDho?jGk?(g8gndAOD0UDS0p`-IZJ%zH6tlEKhS54CUrp_d zeEdeyD@B-jU^#1IT|OM7CuC^%9R&=cf(Qn8r)bh+S)ro$wzMiJ@@m85c&ty=0~f&s6^1VK1f~=QXNV+ zN#f)(JRL_GcbN3G^%k5#>=V;6aw%}gKsp}Ac=>0HX}od9n|sYJiWJ}I14w+_+yI`yZr~W^$93!s z@V_h@etBU^dVCVV^YCk*wKmvLnX{aI&itI|sjT(@VcsNJ*hGr9oIqDp!s|jQxedNQ z`iAvep9?=|AU`Niz$ZN;CowhnpHqois)snmMfiSxn&;J9;>({FkJ~CJSnOkMvvfi$ z2_zNg`L;@DdmW=`5fuJ0Zb|a3roBqdD-07_`SKhll5Ve01Xi71z4KlAVQ+K$wjs%l zb1TX59f~de9wR={$o9GLgzIJSmjP9ZraGUyure!jip+8jzT7tbR&xstHBIvOn=cGa zr2IOP3(HA!didhVblD?bI80}qx|6y=_WhF7(_&4HFOn6SZ2N!3*bh3gI0m`%ywh|r zntj^9+fxu)4CnUJ3T*^(Z+Nswp(;`D;b7kLrag{d7%o4{wn_LBvxB% z{7X&6bVL_oq-pphSjVY(<3h(h0f zq(1W*f zTQ5mZkS2dw;>U&*zJQw?B8{O-7`5dcVxeXP@!R+M1O9C*$I#lM2vUPTxhLE?zy8d> zp`tW((C!-Nd6@<8{<#C7u#*CWX2nC ziVA@{QU&$$(}K{TgCCCKJcAitn9TRrXNd0_@cC%xb8nqzX{>wO4tEjX3g!dd$22Ea zYU>ILhK3KQemy8P%*YXLER4X3Q680V572;qh|<=sEU|j41q8UZ!F$`Xzis*3p%kLG zE{-y|eTpUfD-#3wH-%YUqYAYz5Bnn6sK&KfmK(~3cTzO_LW(V#8xkT{$myww2w(}P z3zF&*Ke7(*WNrIJcXJCgkM5!DFV1G<&-Vt+8}v6dly&dy=d&W(d>yuAYl%A}iR@O} zJROSu+ET%&L+iCfLB~1f@dd86L**@6F|Xjgmd=L0 zTobkB^Fw+eUD)f(X3X$#_b%atj}`Lwn}D0a%qE>7;lymxFn$=DjAcBCl7ZbC`MI~@ znLkSr@C-qf6@tte{;L#z0d1J1G{bo!p2e)L){a=kqz3Eh3QK0oMiwmyd9OrM?HSh) ze=aLy{zKs7E&C_rxW2s<(SehJB7KU_`JHAUFJcIFX@n&udyfeu)6O?FguPA65x@f7 z_-7aE=5EM)0(T?8Ev@Q7MXf7bb=E8(lO6y!QH1Kdh946^zd{h$1|$f7)8Va~c|5PX zb?PMas+@TMe82=DodM3gW_3@Uf?km!aGXM7Se_l!YSXf)u=Ase;9CZ7M^YeegtW_36er6R!CPI1H)11H$A{>gbtXO4gqn-#vOC4Za90JuBuY^ z9^bf1^t~@x!J@83Wp!RH%DDATEhIXnF%RUdSZwt2*L2{3sW0=mK+6Yqp+%9n)ugah zo)qYFQF*VZXiZI)s%3@20R1>elDBLoJKTcSX%v@X)XL`%#@^8PYx7}ni@M7pkqT0p zSW!Vpq~a2FPT6rt&+x%(sM40WwHa8U9IhCpnvlAWpcXM1pxi8ikN?5B^xAfAOc9XY zuH-Ffp)=@EW1RAje+e~xNJ>wS-DKbrRnUyAYHUJ6Zq<`s^NLROFazPYh|a=JhQTl1 z6S?F!RBHe+b&es`I%@AnxvN=aE;E3-(U*nc?XnseeMmeDI;<;{>>e8lJad9>F}4;2qZ=MVnAE zE1xjtiC!*3m0I>tu(vsez97%2A)fC&G>iHL-@4ATuZll7YrPU+_!#+9QP~;wl5|YL zn{5!7bp$j2U4+@Ucd&uiZo(wicDMPs(fC%uF~J%$!cFb(2Tus%zS#Lg4c*?DZ&h`FSrptkDwC5CbQVA%-BLdpePUXzs}g3ua({VhjIA^m z6fk6RvC;kD;1R%F0V+?1`7-Q-pWD(wA-n8UyuX>4r%djS*DrEuSDqpfXd`)#M($|z zXN2R!<`qjry(I@j8ghzrVdav1$+tC)M;nJ1D@9@#ukD(oK_H(%->rbumf^yRHtELa z5@t`nHNNX24;N0fDCzbHnqS=s8BcOi0bRN$?LM(U4^qIBT4y! z&ZB3ueYtuwd|hd|gdA+*%8<*+3ine=rv!%g>@`67?4$e%`~Q?VDtxgjM}!GJ{lFYl~B7P<_F{+1P;rQg#3tQ!j~?UHWj|zt@U%d6UyA>0bwh$l;8bZ# zNT8VEH8~P4B4w5N4>f&f31=;tW`wws^af@K#sgQQoS}it5H3MNiyIaQPjmP2TDvH0 zzyx`aPcv&yVKk3G(B2VkgbMoYk^bryACj`>KIgh}Nnz+DFJ zhC-S)m{;&#lS;^-W5x>6647WB9I`e8u~08q9*r50O}d#*u!WpFCRlv_CHf@xW|4k-?VZb_;zE>ydJB8;MZDJ4NCJ5mnHmtldSLuS84teWuN%qsiMMvsh*R+ zIOaVATy~8cbb@}0R6Ga_wXHIA=m?Xdl^7v#njU*k0yFxBRZ~iX*!ibcO<6qi@Hgx+n5DjsNGAp=E6|SG~p6)8Tn3OB3khQ9M}Y9vD6)3Dz9!v91SL z(*fu1>TuP-{Jja=b`*A{RZwh+UZV~1jsjp!=L^`ImfxUW67LAW=nMvg!VjjXjY#2t zO9Dp}oIemcg~tsbUWooB@fO475MJifF{niG=?Ar)8os8sUCij% z9=P954#LWvW7T!*!`M&(a+r@p#&`fVeUU;+jm{tfLj>R>fe)+Q6cwWVd0h&=t(H6l#S|B$|>u4UZG9Y@}=v#o+e%zAB^XJJ3 zA3oTheS5o_YDHUVQJNtv%}ELVKmw2L%vmhusecLFgTxCP?^oNVmBCnF#iKPdjyFk5PhElqq=8=T1j< zb{J1}pTqI~oQzvte}sg!XjfL6j7n6aD2(lPL0+c>?C9sKn8V%h)47AbMDZldWsW#G z@9?W5YfGpQG(+y!P~h&$dHcHwv_m9_{;j%8nwkC)-n3#K!^J!sdu=f$+kq(FmrnV$%|edu3<(Bew7m@@T`ZI? zL&Ct>a=ESZruOe5 z)A`5dfFW2#O(XCQKe}BbVu5`l*$<=!qvY6Cx{pflR{n-1D+_r zQ6#`{b`%Dn{b@#&l|TVO7%{jcfo#18=LZfFrJdim3M6$0%(ebIiVxQSj@~wi`HQ98 z1d7qx6LT3oE>?lHaPrQ|?_v~<%)86Ng^j+%m~Nak^hyS}(qrxOCkS{G=O9D@4H^80 zlTKkKJE%mIije-4U8CqnrF2M5A11p4CNESE0T%TYBjWllWHD{md;XSzuM83>yRdbX zeyjh>6u$%{(5r;7!@dCWWtx_cU+Y`-hvZpxXS(5&VZENP=qfr#2F?_flXpRZ{2@ zqT#fCbLMFo_-pz8b-{%MBJIe3YFWzK_i#y@9WiAuO1;_B5xj0WzSN0h?A~5sMaR}2 zENOpbkYU_nLYgyNl2QEQTc@0R#`J0X++RC)GrP>35?P2izFbiFAdiR@VM5LgT}BRS z`wlKkSp*9ZKT{Yl}w;ldOS?)_aQv6?m~_Br#%QYdNpV9O=W{;~~5DR~mLaa@_7MALF|= z_Ge$TeG1zUU`5BX#T+~141WvVUS>eb_u*DPH9?`g`0T#^oS?Bk83i1L^R9?;kn$nTH z-tW4y-}apAG~RA(zRTg<)gn%?25gD=enHsSUmMMiwB=3a&rSWpw0@40@Q9}f)4`b0 zq;Qby-D|=#2TI>Mwz2-qTo%@r&*Oq>oC`3=#uE)AP0dA9uc6gJinl?@s7ERV*Y}?8 z*JX*cN!3fCx3Y{%>_sMzHx0_*?oF*&>!QULIs5BQuNH4O!=S+&GEmINGw|jG^J568 zlb@Th^J`_fSfrodCMLK3+4=AVQ&KJ4a#1Ap`FqEjXv>b*B!jeQhl?tK(|A4aq~)28 z(~*U{2i@j48Kl(m!q~Nt`Kng)@(n6Nsdd-plJ@PqzIL>- zQ(Z+X?<|F?4wGleZ~P=k&T958L6@n_J$;Vz5ARggUF9us@}av_OCFvUhWR2=KHm9m zRZmc41}ikZ4{)6GuKsFj4`iRm9L4bAiH_0eJ%&e!bBKv{0M*8e z7cV|-lWmW~6J+|&WTGOi%9Z8lV;tCeP9^ArBsr$9xk=Leoi3Xf*PbXC0x!}8zN@M5 zz7WvH)!T8P!TsEWGHCKr;#>BARO%bbumZD(2=|jDj+e%PGi|S5@hF7HI1j%8P(Y!P z-B#$6w)QIA*I>qfamfgP$g<&WY5~tbKKzE@zn|;>i)q1>>0|y^PVG2hXy!jGH8Vuq z9C1wwIeH-ZV%6dfHu%;67(iMlg{}-;|4|5~bL$C1-Rve)?rCyLAbCF-`p5pG$3i=B zM2Krbh#de)rtKF1B8dOf&)l5hv$DMk;PUj~xTB*`9;`P%Q?p&-4Kv~+7&3nwtAIbS zMW7Ae#ozpPbs8YPc0HD0Td3Ab2w*=3z>UAM^B{D}Zddd}$V%|0PB3Xk-|0P;keQ9WMCi}GJZ7ss$09y)Jh`!|gCZI2l^B?3B! zs*lNH)|1*P)C#gK(g#;a20%G??Z+Uz#Y+}8uMPYA0~-blwx z&}Iw)_-T42Q{bb}Y?i-JNcqWh(L)>w_!C04!6fsf>=oJnz|<#S^ZkcL%#*Lh(^JVg z#h4;@efb7tBmC&G!uRR9e0Hk;BU9gnb)M#YiI$7-vuYv0YhyT3)!NRisYGqL$^J7E z_{s_ptAS{ix{Qy%pRaXMHE`V0VO!r%HQ;Q9G|5Cf1dE&Jl6p8!thc-18RXv)P|!-nSZKyR%)od~kf`4To`+ z>HBk@Q?mj17o5Y9byI^zo{N@=kxY=^HR=m)q~kuhs*qw#2HE_{qq9OoUI98M5$hs1 zf3{uq63OX_n$t$LV65Q;#l<(7+FD0-l3l#&_=MibCw2(WX#7o+cj37-VxP`~w#fV+ zl2qmL{myoAj?b97K+&B%_xIk7D32> zY7#6(j3pjc{YkS(KSV_Eq4cAa%gFY=P^2zG?mbJ=`e;7eSQeRW!Fv5#zQLz2#3AU5 z;pKAsCgX1wqrHPJ82Gh-$uHuWgT2+T)hl3nK(CXF9*V3Eu7%h1I%PUNJ!I-18@Y4Wh0Ephi~{H^lC#ez5@i+7@&gd#v7$V@1G&w&pwc zsfjUK)|VEre=zFQ@vh#7#6epiB_>D@5KGi;7wcyL#5FTy{x0dqP)Li&;W4_M{~+wx zqFt2qpc_X6y#kn+U;yL~-`wuT>1{E6*4N4E`M9Rd@ri!PSStWn^oqhR;x{oNz%@1M zp+I^?(hPMU4>Otp;#-Kmowxhxv;paHxk8(P;?u;aQQxFv2E(5$=8R?)38- zF_h~Lw9=i)Pr3ZS-MP_2Luxd(_sNX{)N^G-iA(|in+7bu*BkhUAzvv9%lm)n&BfQsZo^nf3A+nXn9e@Fg72&lcrf(%(`h#@46Td@Fs`)| z^92J{?)X8Gb{(mu&L*S;MdbLKWDE%q+Ed@QoGj2rZpPosWgt;cuqIg!yf}@fq%Nu& zX;P8eAa{R!-;1TAqhp9ue(i#}@@h(?Y!dw2t;iOQ2fA`L3;4;$4+>#{;UkWYT;G&L zKWZ{IqMiv=sHz#uDiP*I;hq%toKe{8)qLs1Y)QAyilSGO0hIQlahV6# zpW4eZ3Ex*wQzG*NcOK|>r&x{eDwot_sUIa_cFtdeod=(e>fjCy3qnMk_(nFql=oV} zkCxYD8`W;kw6SM{o+c9kfwZFI4)e;{%NV!RZTub_Tz!p5A>c|k+xwf^H? zTinvSdXO5>(q(DspG!xbHL&7Cxm~=#j&s~edClUay;E10D({Zyg1wr5gr5*eNiHur zEEv1c@TMJgZ<+(kzIWU*Br?;AFu2hMsnZe4-s{a95y zj9S}*Nfpk;_kO!|d)ty+T4W(~P-pFGcsE7W7sj?bW%Rp?3V-67?%+2Ol@P{CCb=2H zC@@fZMUSWP{I4&jkb*-&=e-Z?lxgin40Zw*bF2mLlFZsoKPVD*83AMkq=;eK4I}of z@w;eOu+YK&;S8cj#0n|zfeaO=>}vvTly9x)v%ULI6DU&>iNkUSlYReH?RVRU_&b}S zWWRcSwzJ$g+wPctT2Y@9jH{-vV@mDZ-8LnF3Q|2CdYr*5FhYyvu+kU*A!}RirbZ)E|1*8G72|FMGDT|F1ncBYZLmTNVt@dVYXsF%qM}lo)LklE&mtANN zK-R8?2y@p;){Dn%szjq8XX!xkT96Vj*7O?&#$`h8TjwU6UBvurJh*o!)OHd%0bL7M z^>9hRAwV1`XrXI|<@<%D6+_fA;n?_>&6P9_*Y0?AtEciT_>g%E1D%Ch%A<_OE&g(r|hs%`Hh z27Bx)X-He=Q>^RRlGA3xs`!}5vuZs4#z z>kq5ig_cF>@>|SvDJb^6ZI$yg%Mn6V8A4}OT~_EP>b@u{%)#tEaWPEj%y3#(3^O13I<7ordS;_f9dEr+It za<;{n0SLh|q&p|{ZnmX>aP`Y`c*AV#W!apT?_scalpxG~no(*g481T#d zakXdboEgrJ;pIagfAK^z|lfc_vO>oeYV zsNKQE6P$y?Q%2FB#YIbE8 zmCEFsj|j#B73YLA#}BCk5Va)M;wpuPjE+qf8NX+AQ;)4jhNEFrHU3bpbe=>uUCxq* zd|^xjL&q%T5y-xot@)-dM?SXm1FF?*S?D(C@%Free#@3*0c$P(x{DU_l(J>g+gVSX zV#}(AwTSlxRXkGf%a`LJ-K~e87dC#cdtcr5A|Jtqo$AH*nn?2bvln|#`OAuk7y*4< z-l~9KzrP=~7avo32lzNS23blH>{9J!nl-T%$Ul5&fO^)!MCNR|{=^4bX?#@GWMG13 z^>9HS z3fi8pe<7HWaWRYWj9a$IuX&wD?nU=JkdE_k>hMkru7P>{;^&zvw;uWUb60~&99qV zmd=BHmc|Qpwks{i4!<{ja3&VrYKuXEz9s3;j$6paM@F~2a;*9+@^&z(dG}A)uAIy? zbJ1?|?@|8j{2u3BXlN?yv2KjLM?dua&c#k-==5DwJ`uznsP+iOS39+q^vP5plg8fpZ*^5#CopE8{e z=AQWv-krtll*K%NdxDfwI~-sAvHlcX9r6M`9$HIiofAdhO56&Z(E0ED&Gya}IVNOX zp_HIBd)o1_1-_HyPEo_e2Di5nBw4Bgw9swx3PBJs&L_312`OjB3vbmjdcYd?hp{btaBC;2jT!{rR}FcJNc2? z`abJ+Ie&NL#WSEL-hy>2d!#maw_UvcZagW(E}OIUtd5y7?oXOL1_ zU=nCMwX3I{gqi;rHGNGZHgt1(#b+Nci8D9ckH+cl?Mcw$ul6VS@Yhfgq0L%y(|Hb_ zxYHNq-xqk0c6b8aVejD#?w0Z2Emb~DwzR8UuGEs7&-0->3|&+P*e1d`)p%j4A3i_w za&Se*oi-qe%E0bUGtq$DG7MN@P9mI;RxIAuNT|TBwE(=(Y=Jb>=^N^&d%l#K=b{;r z_kGj1@mF0x^-Zx(EUzFJp<`7c%MtJKPuCyes@u1Z&Il(Ow}0SOs;~}1auljR47mv{ z4WP6>p^(ZyUz=i4u{|PL^l8A2Hy~xpIZPoZw5#ER0PmDZt z5=5lA^(~E-<-?@Ad_9|5Z7m(3Qp?8Ni?dwPHLG4#e?D|pnYZ7t3tK^6np#u~6~VH<8v!UmRJ3{A{_{2+>8MBYGVWM8RUdOG zUEClRny`Cug?L~3-NA)E<>OBZm@kDjUVrV|(KH?Hj`u`f8n>e(p4r(&@t+K^@Ozc} zYApo5P71!yMc?%BWlmuueGySd@3GVLVCfozQB0b$+vxEopYfIC7^F0fOHl1%@ z?j=6~lUyC_McIu`uUnr^2(mwGed3M;v;OHfwKtF{XmW4-|M{mXp>II?{;o|UhbqDZ}m_CN0y+OT*iBb!|j)Q?8Oa) z%QHlpx5dQcRR30-YnWt>BhL_bdYp2ZDlfMBj5Zpx+0TM~yeesn6wA#vVeoT$^sr&4 ztVJ;bqlOoxT~VgEvl55>anE$CP?L_iXAjuU!z=UPeftp`Xz?3^Jh6=0#1p-eB=iLo z&+F^GNGPWFl#+gFI8XZPzwfxGw4oX%t}7)x2{dZ$o+;eOKKf6OuKKT0o0+*kPeJj4 z1F?g6)9%q)@mvU7ltGKTN4~+Y;({}Edh?O(^<#eFcUD()&Wcg*q7A>UyrQ4^4=lcE zbU_ISVDuwNsW*i~#gF6>LBwEO>AbLkJm6R$D2WBc<&UyaLXGIYO3v^Z>p!(a36Nk4 zurcXA5Vx$2E@nxw`2SsMBZbJyyb&wKrBQ`Mqm@@$vpto4x`)*0x(e8Wlpg8))|^lNl)= zAxJ{ndq5F|zK?VT#5~Z@%8I;!if$b5g}6^m6M~gxj}r_bn&@6(#-b-HyNpW|durh~ zq?EmSCYB;)GHs&T8;{gLItjYg&Mf2TNjKhX&cyxXYs`x_MCb`bKmBXPeqtx5MW}?e zY3kv(x84BUSQ`3u_6}A9YNijNI5pw8>WW=qY-1{-GQ@C;^BAM`xyn2ZI%TfoI;~hD z@F1TMb4A&G!)vB14A%Y+3wM+}q>=%*YsFjt+^%zm7@Ta#5Ria0Yi}cb%V}e?>H8J6_76Lj2{~J+d#Rbh`n`zf3JUpvy3AU8p&{)NQ zdo#fY=$Fnoo$A2L0)e8|VQxj{K!-q)z^DP{9Q=zWx3=%yMqSkLVf*bhN*bsKLaLLw z)Aj5Zd6|dxe=_NW`2`qH1Ox;_c`v9y)S?UfgKi`E`{GaO=yMd7d?>xVm$9s_=th(fNxK`wo+X7Xu{2 zj60mrQ1!!{&pw(W!R!GgnaM5Qr&l;C)4WDZqmU%Q5#O)hijpT}W z*70)=`1kjozijpJsEW7ro>+cs1EkScWLMRbt_4CJ1~HSg-#0gmLFvjWT~M}g7QYF+ zjx}e)O4GD|n;NyeHc>n3B|H+|H6u}78K=!e%S$e!0ZgpsZd3$i5G<^y07W%US z8fDG=)DZ%onAF>EzDqfp?+II{t+j|;Xx%;VCHT3IqzBuz;ui!dO+m)ie1bqEZ9AV} z4-B(0f2W(0WQqKlgzzKYdHYTrsv38}m8h_O16r`?U1`PBdt}aL~QWKM*V{ zwH}&l=xlhA6e2dT$|5qH-P{LlT zUNYCs2SWEp?HqCOMj4n2f6XnRRuGFhrSKNmKc!)&CqDO&JIo@DalVu-l)Qp$Z7kuJ zjshY3Q30ER@I9bIOyT_s&;@g&-?a$b5GNfzD*Na-KfAo1KVOnkMm9mcDz5=&!xOk< zMO@=U48f3_TkshFf5k^36U2IfHW+5UCBoXoc1;cO1p$4GvQs(eRVwqq@md=3c_CZy zA310s8>As-pgqpZT6LBHYe67@4m&33rVFHi{L@TMp0T(lZn`b{y9qKmqic^R{;A2s zjwJ!D4z4!O{`7DjPk;uZrgi5W=VY^oR#tS|%|UeGkm>^XFLmNw$KREN>XFo|PjHl`FN6zq)IlSn#^O|t0-$FZIYWLx&3#ZX_Bf^akF4WMpjV4Q%&Q~I$*IWcbiH# z>ysxDz9ejV#h5ps$CJ@kF1|*Y{l-a&i3SFey$!uwS6c%E1F!9HfNnX=Wx;n(Zbl#dUFN{2@?=pR z>YB)nI^*JaCx89t*M|JQxI|*Is(jhv-#G$hy+^W_L-;La=_O(Hk>jLL)oT5HJ36U^ zpwkNmdN$!Cu)p%YI@qIgD|jv%G4ggW)+g1)Esv%cx>(KPCElzZKU-o3-BS&fSGeK7 zy(^o#ICL@57F@cNdm5GC={Bam%jZ7Sc=qMVyY^tzEoG6(425R$z&RMzY3>x$UG>og zc_gy*(N}lr6U(TI{)1?S;aLW7hRnM&;z$(}{vL4PnA1b0}mwCN54i$pZW@S5{(X$onsc{n+z6H?*9jL87Nz(HX zM(Oj9odtZIV4W0ujju^+*V}MZ(q{f%MZ#RR6hx@jdz#Yly~yU-y^k($SyP~;n~p07 z30A&rJ;q6m)f;H;Fa4LH)|CDhu}?#dPs$<%jdl_^4HYJK_r#*>9t$UB3;)6aU_)QC zso#&n^XD#RDQSEcYS+cxY66;1aLDqiwuHzy^~E&|A>q^+Vob$3n1ImdZ}I$s`5W;^ z3F`VU{vTy;9Trv8J^o5dhjfa7(%lWxASp0(H;8~VLw8C`gQy@3FmyKz(t>miAs`GX z-S^=8et)-~``ml~J#%KCU2E;V*Iw(hP_a3;v@*Wx-{fH!vMk^JJ8)mfIe$d%$n`$P_?4q4d=W5x-J zIT#MJjBZ8Old|k?fEmh7`7B?5ifW4X{2m51#n6jHnPH1&qiJ|mS=BqEBpzgIyaF{v zpDFY*Zx3nWTHZRREzIZntrNwp`9W7Ifu9mkN)C0pHPna7=&G*kYf}tQq#17o;hX$HV8{ zUtZ$j_yMxh26(dWkrzC@v-`E2z)vf!+?j~M`;!vq<90`|(1mE_NvJC}nu#+Dvz;S6R+DUKnHFICi z-U;~ysk0v74-cyI@&eEm+5rQsAFSwASC*m$uu0Wo=Csxk`fl0ZGD*g8KSnzhh* zuf3)v_k{$@>htP~Uh(@zBtgm&by_D{hPeJQvnKK$_1uA-A>^kSti+P@O;5UMkRmVt zOi)Ns2kQ&>>)O8L)5(`*h#RJqEw1l8vy1%|g}<+lM%K)1!EZ~=WxV&-O$a*&hJZ2f zO|blojEwMQPos|f)9G}hr|4?GaeL!SE#k+%6<&VnXe2De-Jk*0bYJT+n8JL2XCt?k zeGzP#OJC{RTl7hdCxZf7r?(4%fo#XKO7<*%xELi=zh5DblinM@>RB(1OwchRhapbm z;Mmp8L|L~pFg0J&bS5*saC z;~!khFGyXiQ6Dk|)xhlYiwKK^>_5K;+eAcipo-|Za*>GNDlvX#sE{snZe zxEPqP@sBlGPPi-VMd|Uv%enFiJm;}CG+FGIPQ?i`B~%6j=1E_0DRCaIm?p`vg=b(U zMg{LcQRB1wyG)#aM+RPaJ^h~}~%;7?uosDOQjI*Ku z7lgfe6SD2zDXo@YKPV(sGAB|z2UGKYAErDUVkOR5#&kVEhk(Qc%&PTTt9KW>vd5Y< z*#$|lN|$vh$l_WKAR(jC_@E>dwlQo{?CJvm$C52p*#P~apXc(M6Mb-&A5N~uA0|#SDCCfXW6Fr)_%^Emr}xFc(C@kV%XQkdW1ERT25=At z*E!12Kx@Oq+1F*C(OV@*Q8EBX!!WYWtNue#*)|032_=!eSV?rt3$|;*E?=OI9q=I0 zKb+|K+_Yv2{Ua3!>HBrDgz{91!09RU<-n+3{>B#9tb*BJ`G;dGrXyA%-&U$Bsw7T` z7Hj3x%S``)zo(i)-0_N*)%i~jtx&y`g)Q<}C2%^P6U-BDw+lhQUGDc*LnO0G#8~;o zUarFZo-L=*)VglI1C|mZWVpb9ix zlvXsSh6T*Ye%lFEi*y>TCH)0rTtO)0(dfs!-ucLe821GEG>NyaGwDv%6%}dumg#VN z5vg*Tjp=@V%~`Y0l3h2=+%uZZXGZj_`pABe_A9x%MZP5yhc|@wbmVO=wpM0Vl7zos zEP{BU#+;KWP}zAV6#eIfgPsnAp0}g%*Mg z4a;hHaG%&#)PkH1ub;CYv~)zI0yIaH?*VaH4udduI1uDf0-=P=n!|2e1j^s8fo%P# zT;`&adA(O&6mivrxU|6(Eq{$gw&JN<9tUR?cySQ-u*X#hJ zs-1z*UTo-9Tb1jR0Y#gON*7tAQL_rJnqS*8&USeyVMZtQSxf=vr^@x9UT1%+F(`h- zz}Fwabl*rz_U?!H7@G5Et#V4W{_WFhw$NeD zSQqn7(}dv5G_*Fm-E%tyF3xDAgN9lNbIoA&mmP+UTUG)OBij_?SNZF?s|SQujp4_X zWCHFXqn}4^+X_jNOjM&ThsLpE>tLRvcftx|XjrF@_ewJ&TeDZUJIQ>T#}+ziM=s#e z13Syfhr8upt!b`p&G_J52mM+cimj1Cp+*ItX}e65DEJL+I^jdlpXM6pAHTQIkZngg zBlpgV^|=OBt+ogErjlvl$v(?HL+S7e6F<_e|Wa1c_?c=NNz|+)MGx=?`TLg^s z{Mx=7wZbl%!6hX0VtQ*HtElY$Gj`Nk84_Oi*R;WxArzNfiFxG^*UQ@v7PRa^4Z{X= zh`Q;fU{N50261jaXQWNK8{RgV%jYKl7_r)>KSMO^F!0um<1@L-y*)K{FAm*KJ_wxU zDsY37&~HRhLH;`&1;Sx*U^ha@`T4kZ(%v{AhsP;#;kYLPYhB+5`Jsp1>>a<4Z7?nMF_m)Uunb zQxMJtWW_m%(cRlx@%UBZdXYkvmvCbbTL;%2gxg~uUtq>vB>VC)t=_lzufVa*U|@de zCG9%cnTzx=fpm8;)Rp6@1?P1MT+SHs>V1_J&fykiaY#SU%o2kc zCxpC@B)sVzbB80;+=FW=$~*4ulJ`?R0;oCNRD6W*xMkY~u|9^yu}OJ^A6&9kv^Wzu zt{Hr76m&7OkLr$}4whytd+wB*bwoVOB9|sp$I01I8Cz}0XPK95WLjje>}r9^Y3{!3;|NIw0V4Y&Gfn#PqN)Dj(1XjS7X8@Yva ze%5bsNHH9t+@T^!-4zl%+EWRMG2OD7HHIV2AvZse>y3Zd)5V%_cbxM zO>QxYwj@o_i*?r3f##j-w@uwcVmoeQs2Sv@jmWLs#0Kn-rU{eQes~?yQDBHsjCcgt zny?OM-safMMQpc0CkbcINQ$ZCuI1*|aAK9y@|gvVw81)+g->00_Pib2+3)ApxL~qK zWMY4kG;#{{linp)7;uC(E{n`q5$|nqH(FZwPkm@q{;OpsYmjyY<#z7h{Znw|+Y66l zVdfvpV*+j#0}i5_;S<%4;-k`vKmgKpqU{vA2KJfYmp`wwkw&{vx&a?my6D9(VF1Vp z-T5&l6qhAX^a}uFA*|pkruYdw^3)ngw z5*rGX+Dh}SVm$tikwU`>yn$hPYB3rNJbf(v^2Za2Wh)Dp-k{SWJFDtNildf8w5r?1 zqggYLwL*ZHCCBPmw&)`A$BMiq=dmQaeq!-Fz-O$7A4bO~_JaIIdX8}``7z<+p#=kseshNa%m73gOEbv*D|Fg^}<*u5$c zq|EU8W&Qlk$eFnBO&^|!PTH)k*|H4K%*(z1M3yo9>s~M>@VP=AU?jmMKg(nUP_mJv z{#|H%+m=|*cd(*MQNMJfNk=FPu0Nb?{!-s)6=6BL9L(I$Onnt9Cfe#r4pCOZ%Tm ziO>0ObK3rEMkw&Pftf7u)j!1Ob!Tt>54~F9di!rKoF$;}Ttojm=N>2ie|i@iW#Jlz zEkbja0!Trua>AoHUFJMWL5>?(;&GUYABRbiXFiY`xNIum14sT}%XpkLpB^jn|8vs( zw;Z3x$!q#!r!=!p6RxG^Nc}kI@W=6l$0HC9Kuu}-A4N2F@O;C*sN*hohws0Y|Bw7U zw&ih)PW>1wt~8VRs18IUfEIXTRZzYKy5tDuKb6DF1m5_6=mekuS#`zsFM#r~)ZTb3 z^4=Dx7C;^~(|GJvWj(#0_LBu@L5Gh0 zbm3z^)BOu%SMq8KC*7rqo``y!@jx^G_XhlnbSHBc-DLvmO`J*z=s}7jp~rd)ZCv{S zFH0-(JZeVEnmb{Djv{4ujq`u{|6_50)N^C}Q!@YWTA_ChpbPO@ZBbKjzc2i4*2=or z=#sJi8G+Y+W-%&#LmnL;oALdZt;%&_xBH!65did($NF1Uk1uyIgCopMFd?S>QX}i- z>qxxJ$w{L5cB>o!aEth9^gk*gq~USW7~yz!ApjNlgh=4AOOC`IN4oRb!kIkK{t&!J zZ9*fxE+Gqa6u6JW`1GS%Hm`1I*z4a1%dLN}%R5uz$j0jNzohzk?@Y>TV|*L#s{0Vr z6DsTD)AZqR#bg(8proahOf3%8|4V-@C?M#ijY@eQNbyO+u0t(HQdPFMXX@7PFi&Xn zcZ}5qcKP@$4l{bwQ+}s&0GJf5dE#_dhX4C#2pFGT>^2~W+buSpTtERllZDYUz8#Of zy?Io0r)_F#8>kG}k{-vJ2KG1&<5lb)$(SC+W)r|u$wgq8?`y$9A3i(|0Ut18-do>l z%_d~QH{^l8Ctg`ET`Er&E8=^u1D-DmV+CTxa#iQ_p3aB#uOkQB(Bhcrd6Zkc_8qZJ zP4!;V1s)~-wzga7sKjqb3Mnjn?%?Q{0>d-D1T|gKTZ?OC0zm2S<|{$oUvq^6PrW5O z7Y5X}FYvH%v~vNz>WBM&Nk#on65dE&sH1w=3Dh${@bh5Eoj>i|ReFXbh?L#<1q=9Q zeue2kWxnqCS@ZjQ$UfqF)h;Qdt4o^X?dz~W*P!!*#Ka$ofb=X@Pj(LglfFCLQTS0J zT^}XV^(_MXpG1y4cEzWkUR{8PHjQ-=;>FYNK*F(9)9&tFIoqj+O8Msin?>?I?bMT? zJf2WbS9j><5R#^v$w?V?x*@^K9q^kutJ6G2uDfij_X3{$t3+LT&$&ghF5}mhw33Yi zSjoOr^zvYFq*Q8QQbsDZs5f#rAi9=^$E^mPVr?LaMi2XCc6I~B>Qc6Ve`R=tV(A$0 zYEzKw;;TRf|MzxX>r6>M{_t#si^W3TV4vwJNG?iw2+aks3%_EzNC$xYL-{6)XZ|;} z;NcG+{;g`C(Eq7t;uKVCsN?4~U^*n&D=0gP$Q z&MysfwmJ>Rckm7=&D`bAhbQ%XFMyOl^TaOqAKHzZbG_kB1+SjiYHEZ;V0+UzFSaP3 z1EHvm<>gWuulMSzzkE4O7datSks7J(=|P@vut~MHGuf>}Tw#BDAtCi}nRJ*3ocIQ% z=Yj#B7&Gret4co4Yqcyf*W~ck3sP@CXLySNE1Rn)PLsj}&Icl3DjzahjzWPTjoKpM z6v2;z|M)EE<3UEEE})*cA6Ilfs(Wx{gx|y88S?bpuh14HOKCFYu1?StUQw$tk7E=u|4RDp zx7HK`Z~bg%@$C`rT@ffcGTRPctW7-67(Yz*f}E?~D*k&0PmM7sCZbA#?&>d_-kpiV zTkpo{yc6-@n>jsWgD%G-LZ{#uE_c@>oA(7kl(_T=*X@RJI~V&nq4%5yFgDz*V3Za% zBD!4m>UJW=7Q250^l&0Q^|qAmmRlN*MXA}8uTRy|$YImH#QGfT zWe%>!oa~9!-bwcHJempBBVA=f$t^G8F!FyC^+Eky%yQYGuJqV)tPGqtk|5sTswUHz zRmlljRkt86fL(gEPEMge40aAO&P(#F;MG6ipT6er{6X^YT_mKLa!x?AY?m#2yKEff zVz!^}2lQdSJ>p|3usG$x@}aZj;y&cJ&>N-M;EWd)-pAkwL0;cx5p5%*ji*Ee1k5PE zCK*{+L6jcEndQ7n02PWPcF0--zjE8n@ZR6k3gJkw+ zUCw^jziPW&R8*wCcbIU{6<*qJeZ@)gpkRy3ZVS|8!y)>Ste=F ze1}z388_B_MLhpDh4*B(OI5hi#NYlhc zN`cQ_5%Wyq2NiG7ppc7Lyuv}HN%M>5W`p%QvC!(0o?ix|9K;O*l;fM^oR;0+h;M5q zPV$#LmXHoC6BHh@vnf6CV>NwJx3j4>ROtB0&+xCyJ^az4y4Fh!V|k=b{<{C(%lhSB z+%^)RQX=)pMHkfD35zTZ{Q^D`|6~Pe=IED~|8ybZj%W4z7V5;#DnW1vzr2(?+HDE? zeZ;yK3;2A5=oD{BTy3-+E>;zscBwyc_hQ)y%@y@DZrK0}KFKhor>|^5{mR4yWIuRA z!S54|qmcY3xDqKPXdi3qoU_@TNdq09<{Omgc%?J$LZGTP2u|DVb*55IKw-wpZhpBU zxNh|d2KpF;8}YSv%Gkm4^UafOMk|e-Su>KKTiaw6pZ>mo(_t2cOUJSk&Bw}%byBA= zAHwtOnpG0M;P^Xh!d5^-f-iAZPr6Ob-iy(&_T+i=syX~>72&#o7-THEu!uCdB+4$fZ4z+ z%ll?2sa*sjIP2>{h?cVmFRP)2{JLbdZZ9kAvwD@v4Ue?BHd3eDBg6QF&Zr?3RUoOy ziW(5X5YqA_S7+ifuXMd<+wP_F^k1HWcvw@DPwvNXU%OZ~vXlLx&0)(vn^PfLG40Y4 zftimM4Ayf$35h63zU~e|rCsFZBPfM}E{-mAaU`E5(Mp!ac~J?;NHsj}+8c9f&I^Ez z;<<-cmECE-cUGn>inWraK2yHvn)Qs(AVN1G1(#>xq}*zl;=d^M1(;uN!sh9=ilS9} zbW`LN!E8=68@AOcDOt5JETig}gPMH2ri-kacd^T_n?~OV#I_7dfT6J`4L*53^PX<~ zFB-yEh?L)RAR~c?2tfqF`DR=^g*DymWhw{I^Ia`-NMnjhQ`1ba*@WXE%HtVTB)hgESB)=yBRNwg;i)GekV24g{^g;#P>v<9h!ArLR_p;Fma=uECPWP}njinB6K#kZCFpJT1JJJO9q;8-Upp`poqt^4PPUtJVize{UK|e-2I!~JrPF!{?mL+ z{=71k?W_HZ;c|{i7y;!<;+TC=v`M=i+nn6ST&qWT$%vv zw%dRB$cidmLaqb;j;pKmDQRiWrZ}{&KZZ6{k8-z*kj{J@Fx=XCQN3>pF@#cIIjd7U z8+Ur4jhiI5941(2RFA)5EYYhlW-U<%+5O^fkO_-a;aKWCPfoJ#au0Y#E$Y+NF?1nP zYvOO_p<%Vg@jehc1{>z`v=b)UK}t$m=6_ghB9`{&ovB^hVd70}LMlR*9FO1LU0-1B%xG0gY z3n4`*0@mSll2?XFE>+Kcd&3cbs-LBqq=od(PM2q>(h@1`8Fb0TfQhAp;mzRky*WKw zL_cUw6MXb>Eu%?rwbgb59k%I!O5{xSY_+uPz4HT8IGX5mE!gLCNHEeXF+6-UG;1qh`Z653k??TcZ$ z^dV!*`LqXzX$dzpBCCB6TN{XZq#>TH9mMI~v)4_!Aa{WtEK@lD^Wk2hwQ+ zVOsP7x9MkdfMWEaDUS@PABxkp@6FyzVABRjpoZjb;6DlFU8J*&uExn-HO5oS0l*oU zSjjVZZ}$DC59PD^WqRMYpfkP`J7S798}*xip>u{`XB)dUed!ZGdPUt7{k2nJ^~fMS zE@Mki6uo+G=-84-WRqTD&BE^fLPU$7daTC-Lw{h0-2rXp zo30_Q4m*SCR+)_0azApAT}b`$f{HG^D>}l24&-2uO8yeaHnAL4>O$MTi=T0THLQc? zXu5r#AKHY0NVG{cJ;R`{yw_&n`~dMVh4_COwV;&%P}7cm)BId`m-kD{sjQX$^3`Xk z)3V^MVWR1D!%}=TE;LNNE3MM{B>z&u0-%r!`WU9HL( zrMYLrBB<^?C##bfi_9;V9L-FfQg|4a^6NI6&F$acxxR0u6q!SZvfc=?bWvGNeL9{j zaShVNbz;Xp^W0fSW2Jp<%y&3j^`fx6?htz}{{)q^QQq{Y;T#Cz?=S zu3t7!k)(-KfTopp!PEb`#0?-Id%iJX(P*n~vNI~wo@FP>$dF8)e8ohB5wgT7T6?@f zdfBh|`VXa`CBLQJ$=uH%PRi{j_bbckKeJ6_@te6Zvd1YGUpJ|>icAf60}@-kU80m) zOfjR;@#N}B1_?n2OAZbTby;O!1grQu?Ly1w%OF`FzW-T0v$Zn8+JwE2 zOG0E>8+3d~&K|XNb`5fg{8n3hbk~(7xP}A76=ZOD^?hp^Ka?Ab#eyOzu`ZX8K#|%L6bSUfR?ic}!5xHgM!T zpQ<|U??0r(+H}TpqHT+ej|-JhG&{{UKLIr!GM#jsU*rf?=#1L#D_g~$-i~p{od&!V zR*h7~9=or36_-RK@`dQ>t?$<;+vmoBWsQ#0YIDvM`)u<$$A}5KbPTvy&!?xwE!u3E zE7?UeE}`t?-W2j4)fojbYsy~yLM#Pz*X9<%5J~0MzLPMlq(p!iUd86JNNNPuYk-mq zCj6P1+Vc#W5O$9aGI9o)A(MXCgATaH=$;a1JkK|wm?aB|$W@)|O`OI6Bv%~NIed}J zAgdDwif5~)cDthm<#cC;ketV)TVZfaWro#pdpnr5mgC5xc?rKLbBm@Cni&pR%KO_i zb%OC$%pCU}zoBEFQBaIP1ODl5_X4mrT9$2{;*55xV}yx4AkjW`+D^b_t?Xeow<&8< zP#*OO3SrY!Gj2p|Da_+{V5!o6f5WFER_?)0H}f)g1CQm%vR)T-+522l1VkQ)@P;pa zS!V@y2gy@{_0L#m6jdw2|C+m?lWwr~QbzAydWF9Q2xSH^vnE z=0ha2e04G@Dy&d(lM56gM&! zO@0bRae1>|Ern6exBuDN!Qnf#NC3ebTkkSfmwNhp3*EnI4zxl3R`b4~=|>X-5Yte> zN@3svZ?~h{L6hO7I83NUM*fq(+#1jz6(1&u{QbLU+H-iZB3FO1#aGMdBIj#gob-?0 zhf7*7NZD8nNXCZ_QEo0+Xqh$LL@@eYV!P_z?}T`K1BcVs0PfN^d8k2ZKmzG4fzPY; z=%1PFIN$%gx4MqkpLpMx`uDi=>F|pMM@@Fi>6cYZXon41`{|c*OUnLp{O&bFi3fPXd5sTZTLy)8NbOEH5r{Nji2+m zvv;d?>ov5QkU>0M5b^9+Bh)+jhLp73b@GKk%4(Aae+jGs>ff~b<-wy0HsHNnluPgHw z!P`IllXcfTcV{9Z6i^}to$NXf4bp@DGD4!wol^5xa4rJbY})(2kfo}mv+1W4y;f9l zVmuf2Sq5xN6}DgApW~pJF^Ke>EW~*#z7P6qTC_Tf@Tb&!iO{Rk_F_esif=VF%&s|D zcSc=dFljxLMy8iwEXo&F!)tJYYk`BZo+Z|u&3C#cwM1Q(XjiR(zoOV~9{FypdJOlW z+pT}XxT2GCi!I}~(+<~#2iR)li6aHNf2=F3D6788+o{Ix^)#+gTFY`&z3?OHoqtK; zP7)L|m|x;J?WiQ4)IT29?I^U-8aG~lO!KqJO@|`XszJZjSiH6su!8i}n36s^7U8FV z$8rWPcd$N^^;F^>n_SY>Z``r=9`=^sNxU5?2=RO>FiEP*id~`L*o(bXnSAeJnrzG# zp(qRmSc*TjIbK^7iDr{>6QAawAkyW`i_}&cz6Vf&^xHuX_#iI;ZC)E9e?x=fL<-#% zHV0#XGDCFf+z5wFL*76{x>|{q5DvZ#3 zTF`boNJ_!D-q~%_e?!zE76F9I!07=T?u-Z!Zv#ux*gj3 zcx+OrGX~Dqj2R=s6FyZD*Y;4u$SlM9%C@;(J_4-@T~`Qav63JCLwrqg5xx&R@{=vj z+RS~$Nq2MOru)4}1W)~@9bRn=yh;95rLD+@a$T$Yu?IW)4BBfulsl$ z4wK|$tedH2*H#>o7m3D0QswK}lYa%weZ|=mYA?)P&`3EPqNjhvrSFo>uAdwZeZ8^M z9eKpRF602HTaoy3C5!6N0^_+WL-%`$W}k=nb$9o;*)M|Pe@DaI_D5H~u?Gx6Yl3wb z@tt)ATU zXu{+nC(z}hprCe2+^-s7bKUZdXip@N0O4#OY3U{KfxMoWUQTe4A;rC)*#p`_dYOluSVg+P= zDhnUH^S?;bv}G4EHAo)%)<(?e8%T_PaUdg0-ILA(!W=1kS6QOeKmQc+Q{2bAfLau4 z<|{_E_&0r94Uwu?8d&dPy)t$yNitx57G%UoBTKm3%+-I*!lkYs^E6NreIivkp9+dp zgOBAz45O4@Do(n?z~1Vn-GaLE=?$MFgfy>2Jm{;)`d`B=>4={`5`|J!jTL1wYB7N1 z9ggt2o&p1!VJEo*k=l@U8s^Kt6l=~;UIveZ1;E?A6`7j%mVTv#$>wWCjPw!T&>s0V z;E(ZBhy|voAiL2tuC==nlQf-cb#~Yp8Tyik4SXZlXeBB(dos%-(tpX~<>su+7-T!?TW%|3# zwhdqQd#TX5OSmYp&8Cn=Jdo6> zWfqzhic`1{r`U`XL!}YkV^EMSz$~j@qMCj0YP{8lzH!Y1b*F&_K7nj;f_mFPz@zFw z_bQP4M{}shLzuOBh_Qz;Tbmp1aegrk!Ynv_Kllu6UOf+?aY8z%Vh74##N4=^^=EQ_ zX7JSC7_O@Dn#-s&;_=+;B?<#m?C5h$DQ0W2(eA(To1!zX&R~)Cyba|GO4~!`H|P6m zUDi!%XE@v$EWN07x9;#fZ$yke$0BdC2rrQE4V8U$2K`J=ZBR;1Ql(KftN!cI)mjz% zZLVsVCTLb)`DW_fWU5;hyRkSZNWpk^b;BrwwQRTF5@ksxedype)tj8Gx@Daj!*I_$ zR)uc(b8S#Y4x0WQ^pmsw$GN#s&)qS?hxTH;Az%o3FxYhbG8ML-%&}=7_1~^i}1{yS|{;A2-RA4 z2igw{Sk~*fW!Zs<%bRRb5TTDBJ-w}RZh2*IBgfvFm+1B&f31ssmTb%aL7ZbMYK){Y zK3sF$vFl>xDz)qd*wL>cW;`;rH!|rh$qcbThV&)>Z9wyi_kC*<;JZ2joA|S7Yd2pIeaarZ>gd#mc%M5ovWt(ocEJ^bjp| z60?YWip~ngIvpdR6Y+VI){lE&q{s1VIJZ{j9ehllE|!V(*m&Rk`W2C^L}zCP17QR9 zcK^jzw*gx~;^iGtS*N%i7PLpa-phq4`>$9ipUHLMcK;K`x1Xj~J;n@ZY+E@_+(r+j z0EISvyr=vV2^T7&F5|p)QKnPV6P*PXiR^tjaLL(V6eq7*x_vk3U$8E9C~~vvOo4Ty zfYw3ukUX+Ef}5y>dA7CTJ~OF#duv6MQ0p;MWrR{BIo_t+bul=|Qua9?lQy3&RV?Q{ zT$ss+dFJBaml+uD=0*Oj_WVXzTo^#7O>IT4vMr% zaz$II>yCuOM6$~PiZ{F|@oENcG1@AB+D^L5pi)9N7f0}Q{^PGDaj*SNCilN%^aI}t zomoX+T4nc}ZhBb=_HBCGfKo9h`M-btx`t?BQ{9xKrNodt=C|aGs4O>@fM+(q_ zD%e4YDs~+ZB)b70tHvtWra`~i9y z=cH_>H$?-|alh5DXTFt}6U<5$n559@T@&l#y0X6_E#DRK=t=CC8<|+V0edOKBm-R1 zK5;UH*yP(3LOI9MjnL+|-V~n$Ru!#cL1w_eEKJ*a{yC9s`#{i2GbRVP+u&HGh>c7S z6`LN*wC(*0QP|aM--zq{_UlsH#5(H2=aM%jFY!Y4Wye3AW!E^HZ~ozVYgvm`kia+E z%RZ%ZX|D4oRzuw~##d^iJx5c+C@j;?kKLL1e%$wPykls~?`*eR;Zl~4bg&xb)J~~%qf$h>*p251Ecu@Mfsm8?VQO+eS};MlVbPYWH4gw z>w!p?AqJ5(dPSw`2r8?id>!1NZu$WWeu{RV9c1yvy!+jwJzX+BHGq=cw^f*Vmgr(c zW5?lhUV7O{Lbz){A&H*8fUcpal^jGnu3zW@3A>5dw&#~z4!*}(?5+TB#Tb-sgU4Cl z>#Q92NDVxX+*vB_$Y-_!)tMt6d1#=rSDJP zWDDvDYX8n0furCPPg)Vk92!e3cJ()L>*S?&(%Cu4I>zBkNmAQ57;nnyb z7673rIEbT4F3@BEUbf}Y@G3K_E;2|Ix1|IR^_^P3@ z*{;)>c06ilD5r&dd)4=V+3#H<1DRa}(~z>+cyVY%dtU4F3U1g)A<`Q)Ze`z*WC(Qg zS@}UbZ0DnbG{?|qKE>~3Y%U$mv^Xd5pI)_5K0^ zgFNp1OM=gSz+VI-i1ikQ(&X`_JP4dtvfw{{etQ;C`)tJO{JRhjTTk=#M^NoTAjM6Z zK>AzYP9WlUg0BeAcCMf5s3i9W)nSZ4?P%r{JE|2$^@`Mu(V$}}?4v+7dE7K&=~rhm z0-wt$gMuzvpm>yQ8h9ydn>q;L7hu(@)b3a$sjU{71UTm$3CD$N2HjojGBt?k8VJ6d zlrtFl@>(t7o2EvRy$w&Wqpn^RXRg#hJ@WDhK?TQLVG8b5jq6HUKV945v$XjA5m||x z6OJo$q!irk_-Pq4z!JH0A|6Cr;ho4L9(zbEI!`^tIR!+&q!-x+?VHO4OosdAkNb=; zo1Y0)gfmM|eD2SMa92tBk&iyJI5Q`e+?iL`O1%HINpq@ex5?K&S1iE#V#-@y_nP4C zp7vX=!$K~xyK0AKYg&LNJZe2Z&~2aXurjs}W(I6TK|f6a93r)|toXaOfuTrQYxZ!z z6{GUiX^l?Ln?eqfRGEOSrSNOLibZC&wD@?^^JNpMAnkBJ!N{#WY`t)J*yv0YTjrYK zzMBM>Rex}Z0YOJpIW2OofHXEkv7$m<`1KpA*;c(ADmR{E<;Co+QKPc58+?6EMdbIz zhIi~(XE-C&wQjWUs)+ZKs3i-p)j#D#wYpSgI-%!2dXPS2BQ*UMasBj}V`!YB!pX%M z5j)BLDgOgyxEir|YvMzMx#NZEgY3KHTcXgq=FfQ`GYrye?-smQ5H93@EYsbXGhA~L z^sZ~VKAQ{E2VUs?@XMBGh@37g>!818U5>%A&b8L}=+HoPcECOcNG0|dd*#M!`>IJg-T@=}{TtWZ}ND4W_;6sU!MD+nsL2q*b zd1G6M>oRAu^V4&rQa7my?pgaHNwuDyxi*!rtfoaBkh1KRHP?b$spgY8KAR=XF$T-x ziR_)RpzYsW*2XZLoM5vThq>1gze!fyL$!uYU9ca4%X$zq+0v3G)0eA!mEIq5%;oDA zeZF$YIWNFJt$&Ulqj+N52_zEq-_=)o4tgLL*cc0qe)Gs;Uh^mJJ8PL9zMp$F<6ja) z1C{mHqcWdR86YN$I3y&P9R)beKuXUyj0CxJnIb8mb4{89YIqIuM-P1E#NTYEo zVP7_qjIqJaCn$3Oz60;di>YT$c&NA3b7aj4nMOeqRzX&ez<-z_0An7NI5C<Q+Wt>hf|RHvc0#wD=|^=XSUPt60&Zt?CziI(;0VN=%03W1NKF) z0l6R`8&U7Zr7s{(^saMl+-}l5ca#0tGJ}O2GM#~8Z&8erx}?aE9~_1Q$5ViHFKU3O z;2j zv!b#^_8+xa`MQ&*F|M|~*I3YlCi97s`&m2?B;{M9e>@7X-)1SWdb_L?iTo{WAU|Sy*=&fSm(-?+dF3^o(s;A1|?ihx(YC zzH0?j9%twEwSjjeUpg@%xlce3#brms)_#x6Wl#<=SH-HL^%laYYX~p+e<;Fik7>dT z7oqo9AfevAYp0P%im+1-)418|51k=a&BteaeE_zYVix`+?m~+_l61Ft_%9AtrvRl< zKpV@8TB60B%0i7h_NVJxFbJfy=lH?o{4R;9Fk@N8K&;K3957Epes@*{%@m=z^e&j!P}R-tbL;~ z$S`@gAkB@5$-b=tNji|1hA-dDsh}B@5i42%WBLk(G9m37RG7D5137k4@bO1g7fDxT zVjpNA!yOfF=4p1F9_x*u@%!^66#&xyE2sKf{e3QzmNa|p&E3xt;dVV$Y|l&{8*Vw9`g8>k*Yaxd8V;5O<*PQSGk~0#wIJphXzN*V$q%aGIkC1GU4yg+h{=*X= z{MJ0N%-RVS@To!lC@!mQogLhJb4FLn3LeiBV<^|6 z@Spcu2BE!Kd>ZRPeE4TSU~7a0MRb)-qLPJM@<%7#PlcDym7>{3WhFT58@i$vDl&s< zc%PXb^eR^KIJJl>3MS*$@3!wzpQKmB&=_H#bw~Iara*UdXN2k^wZNQ5d&2W5XFEdD zHO~WnRc@!gn5w-%vith;Wz4o5g0A=5kHF4PQaW#KJ#?;*JxC`h8N=onLVI6KxfX3- zi%vgXXp@51rsR&hqL;y6JG>mW{-rP{TwS*0V%^|W)ghMMGZ{S_M{>5e+-*U+JO42& zL(^H)g|2LnL;Uh;cS>!ht$n^YznxRCOOiFM1JxGi#Qz*;)lEb-`u@yW+lU0W%ZZ8U z`#iSuvUpZc}D~)aO*Nu zWAEGittg3^;7mbQ=LqM9nqF9DS>cf(iU*>xVOv$mPERjowOU=-WsI?n*DY&JVK(P$ zuV$)(1%OjBfY=pRETO=C23Xt}2Wh!x)G#1lP1%7bAyC^VPRwJ#RXOjWh^R%v1z>GL z>TU{5@W?&r=Pi(`_DNK)Wypn|`&EBKaw1>nwc@z26d6q<-%c3LZKI#biAIEw?t(8| z<>8F4rZQ$&_BU1T(QNj$ucwxU>OT+E97@&f5IY#PruONpA61A3-aMxasZ3F1!Uqq> z3$;^OD__*zXKd99(V3=i9^D<7NU8EVc{i9(6a?~RdrPt&KQJ|tH5_WeDa!R1%pLSw z7S#`2@G=&Frz=pRJ~OwK}`7oc_D^4AHBKjXd`4$b~vY2(afqiP;PXEGj;I5?rzp^7C577OB(FWFmIl zPWRa4cg3P*awVO&v1OIk>1^$>Leg{4nswB5<>7tAG3%OXDoVc4yP-u~>S*^YT56Tn zj*+U=1dp+=gy2O~h4>O)DrQG^64zz7Av_akl@Nq-S!ZC(9tEM!AyGG97gc;!#P)fC zj;Q#<<9-fdZih!?GUmu2gJbFt3%9i?dvVjkBT=b#d3qE%hyLwl0>Krs7KRQ(FMoEA zaM?w3R{JD4t8h!Giw~K6*j1!B=1uQ+0Qwhc zT4QPWfp17}YAXFkNK(iS&;aLIg$8!9P>@9rH#K-BF|-Y!va@SgS|&;HS#BiK08X@? z)uTgb#%wIL{$ovRr^b$gTQ!x>WL4bMEGYOa6DgBbvjX@2n#Zu#XaGjh;KfMC6R<^a z7RyT^7!kPd0&Mf@0*HOx!Bug;W)Wt}q^|QBaX*IH>~ZP)#YWVUC)C2}RyvJ?H`DuC zCgn?~z-9~y$+pN5x@<3GbY|S5kWbyJFXdIuimUw<_br`yWSxQ)>mx~QRd}av=lL&$ z#hlvdsgv6B9%4Ar2DuMhRaY;{-c%8$JZkdW+a<#B^5<98`Dc`gg1e&!rQ}KGI!ODH z`NY+B0ythQ@m*EZ606@-#);>;OudfD=* zNe(9KVvucVG9v5Zx5n5$ z4k(B1SR+Dy%tCDhVvkiQy58OAH2SykG~M z#0gN4PAz4YsswnA*ebxID@vCzv$hMUF3Nrl&}nq~G#Th2raW(36~Mqutcf-vig6^^ z>UPWZ#U~k{K3DqUkJ-0+Z0cRX^kwLs-BfonqX?!B#^lh+zg}~AiL)}4obZ)sob}R$R*x<30*yPbncT~=(#k-IZ)hYu%3{Xcr2!NIC#>(QD9WgE=-W3NwT^cg>&oe(5+)XGBC9K}H&U=kmPEL5D;t!J&svq68J=tXx@N$Mkq}?Ft5P?n zsx&ELaUxTfSy@j_GyG%jTTqT+&g4*a{W9Y~JwI?gs(jtg6IytPT2T*ddS%(kdO9#< z<6J?EI;Hy_GdLd=w?CcYyqPl}&`5TzBCFoZcBK zxCg|*#PwmFbHma=3~N&Ggv9mu=^XPe=}m`ULb_UZ`|n~1MmqF7s(^4f8J31ewQp3D zg=*hpCmL8mL9;0|ig|(esV}nM`k}FFUoL}4XKE*rAoA50?roIkWgL$A?s>(dq|(sx zzB>}uWS>^0>L)x+8$wxdX9ehE%LXY~H6}>{iS4Gqb*T@@z@>dx3p|qzenM`@-S4T< z&>B^3U;GC8I_GMkk8TvZL-mLR1vk=cOtw=6cF~+GkU3jACy4Mp;?AT#5gtc^j<-bm z%<#$bc*HEO=H+9rSl-7hd75#HT^Bl2yrKTnJ12m;>{q4G7{3s$TRUS z*|8c!429;+pZVY9rRN@%XQT%j_E8;(Xr$xSBFQfz$IP?9sd=aQmbpU2;Ly;Lkh=+Y z_6ARVXzXYMoLg)+rgFveFp8|8&87R^Pr+i=3^jroH{SF5sIqOZIkSOhB!wl=C!$m2 zj_K7Ut5{v3g#;rZcVqs^D6-1dgVl^wqQ1`^!(MjQVYY{bY_b^42+dA^WVE+QDv=;@X^z2wYVI=7WBHp6C&s{IR7cL*lbev{YIuu zDr(K=z6^P5>E!$u7)Jf6*61zs@_UA@>&#!w+QrsO$YUXkH}1Pv<)t-g-b(pJCt4Uu zgQRi_$`APq7KX)mH$Wmv-$zB7Vhi&gXWhnM;-)U22vX~nD0GW=Q&3?!V@rRTgykTLNVK;N?W>1hjhG*b86uIZ=(Y`J#|VAqx&AH^sCbt{ zo)HWr;g<@*^zFLg;nc{560Lv1?FGoB{NTEo^V(e1lnNlDvg-K7^%fs3;iw~8u*f>W z7X<1GLm+S`j7GvHb2($EGX1{rRQGJrZ1bDjx^H~iqUf6g^t|db&yx%wd*7yY;h{m$ zEXr}E%|ox8AK?fMwI24ls`-5*ml?5bP&9ssC%4TUaM(bH9yY?to$Shh!v;3NfZZj7 za8gbetKeeAaH#)j7XL@5=6vj6I0)rjY(SCY!Z&dUmsAaTAA^& zKmw8^llQ6NjF>J?21M+;f%UXuJ^K$~M#CKEqqQ&W;2YqAW_i4o^_C8pg!P^~{kKk6 zYmOA^boXkXNtkCe61&fiD?>cZkE~`(-@qZFDH~hs>bBWa13>K)m)KZErJgq-orA@R z+!*Rbs;SM6k1Z1{p<^1YpATv44`x8Hc>P#*&Pbr-I`$^7>xvmEaEU-4|L5OKE(f!! zXn0>d?yqc-1Q1Pm7%0x$@Uhwro6mYs1d{|s-l*NxU?*gslGeR_SBf$V`=A<*?4;c> zq0+4@ufXQ9bfKZ-xHdcQ5KA?h#F%2F?0{u#my7*XyUwEE!H026lT={+_IxeLL^75R zy;QxtqOXxV?NE*M)kf%S&T06UO(Y1!Th~|#Oe=}|5Isq@wx7l4mUMAphM6o_J8$vU z`EVbEBvQpQG?tWN-obFl@6M!q;{lQ6r<^*%Q&*@}Y2gai%7#01|4pI@6Qw&DxlRZs zZ_jd*^}tgdHS4eUnK%mZHuwO40O(?Bc=a9`2xuh3ebTHwn|bxxa>{%Avm@{4`Qz0X zwX~3{m$G{**xcLazk4S2kd>3&^>B2!WXQR&5-s-)4$?cOZt@-DIGGd7ra63zj!ok? z@$0DBzwb{mlPXfs8;eY`P*l#~c(H;|$yS!_b@Au>5y(z5E+$&YGO3$kJ)O&1+Ec=L z_I)BG$OEkM#oyL9T77I;?ZW5r4lU6~KBM6f7q_|7^)Q03Q=2OR_Zr*)q`A^Wc+$QO zJ|ngC6F;EZTKvW9B=Pc|dBU6@3u5BQk!>QrGCk+43+I@2{jyTAa_uo+yl8x%oQgo& z8{bj*v}3o{g5dG&=TF7l%RhVU$Is(>`bwLe$6ih&-S^?wg8jV*?;F1)6y2J^oTPo5 zMG|aFlcV7At?{&zaUA7u;&G+Ma{e_cZ8_hO@TuYW8#Wg*?z0lpo^T!Nn6CcuG;LjBv04MLhip0seHLz$^MRXeYy`CQBxUWVo*IXuNMe$H2LZ`j_}&toBW2O%ezx}fcK35>$PCn zEt*$u-1kAMA+D8cAN!5dB*=^QrL9dv)j!cgnvfh-;2e|?mLoY(9F$|8srA8em9V3U zvbe0tp)zfY>blV|wl~KT@%p&e&4!4aE%n4C$t$H|6_3UwZ$SY|2um1;nA0M^^l&Wo zPkD{qA%lxzRc9#BHxj9n!fvIh@Mt%~edm0!6huOEu6=t%Lc2OwpL`RCz0DSTEPoh90RT#bRjDjQ4J^R^;}%r+_~zW54P!#E{A*zAw| zhv>_z`AB{6G*-_Y$0pxS;H6gIECN15Hbv)^6gY=SgAxpRQD#f1X-{2|fbPfzXCR?F z*P?ALFi<25Ae7l(+L(}4M>UD{dm=h!i2(h>E4N5F9Anr9#Vj9MtLlt&Zy@aMF_o_? zT$?oF5|H><;10+Lz~A^a9N>U8>uVRLTctsJ9I7p!GS?|5&(r7Sthv`2mF0CvH3JQO z#DNGESG4s5p7)H^4Z6LF8b~$ZHJ(^bJc4TCThK#BBgdLBo$p3J-%&VM{*XIoiRt;u zh9XUMLr>ZBAH4z4CsMKYLXbUOpVilemk=cfa2WD|IInYxR zEPdvYpeM>>PFf;8WMdT3(>nuRiX+AfUjTC~P#%`H-v_zsRy2K$9g7PVR(E&&_wJ_r zi?r&jwR3V)2yDbe?p;6s&)^m?^-FCb)<4ylHcA3C29mMl@ox*VJ86bcGKO74C<(`T zr^th5M{&_TDo;Cjz@mZuM&P3QA@!3FFue4yq%Wma6DRDzJe|ZGlmjt2`K6iBE;cK& zDBsVEL$hD3yY*ItAJ8LlR8JA+nKnW410eYb=6;_z?Q{Pq67yJEfzR57SiGamrXmwH zA;JDN(w6Z@I`(ZwuttlUA^Te9Vzx|RBhTx-V>*12dt3s7l0H(LED2C!wcXCyo2FQv zvQGrIX1^uLk0=4Df!xtmnp1)b+c5|M4OHubT2>`8_|t6ze}#bJFch9TePStW@X4%c z$D_esJo~n&^wuk8EX%T8JU0tS7vY#B4(p@zOHK{3ug|@vK;DryvB*F9COD6`s(jdMMlQmJYa zZ0i@*6HE<40#cb5Y9S$J-!hQJdedRS2ryL(;Vvdfnvd;{@V%S7_`DKFygJz?ehXD{ zFa~IFef@Lds9KZ>QvFU! zx6fEN+Bmr1tTw8QQbhO4izgnSP*O;9!>vA1d%PJ`H$_k7c#TXx(`7NvRUKU*Y< zUuD%g;PTFmr>a3qU?!`&rMO8Y5Qs~;`RNQKr7gj)m`lsl^Hn&KwS-vJk|K#<^)8`< zz3)qIg}gTRnc5u{^AW-iPRa#qH2U!fBOhP7$CRWx{=7iMJ!UnIyB85Ui-P`AaYo(o z)~^;n1%Cuj&EE8p7H3&?ZmR5sRGeVNK*@aD^!s ztA|NFYdK-65~0ASrkXA`hD$W>2!3*}6i{mWSH^@Qg)lrZ^PGkL(%&KHyFDzsP1TV* zNwB8)3~CwQi22ZG%YTVtWi8xa9jOPFYN?rj6k^P^95e1@9VJvaw!9WQN^Nq#o6+yt zUJOcFOaS&Hy5SIHTiRGy(DZU_e`v3GSZv||ra@K(Bk%aoP%<25rB?ljNuQGg0%C^E z8BzT@M{M__hvxgZduMaSdr$+3V@=5)On2jHoK+?V;scKuxs3_!upwgF&?r&JGXSTc z7q%(#i9Q^y?C*cWU?~D5o^v-*e7q5=I%g}rk3Qr@30cR$m07$=bCm@L?;1MUlQHJ)JxEfy;&>G=Dg!pW+ngpD^K3?qEl zFx}5Krkb+k-y%0EcyE5;;LrdE37NeNWo^|C@VgP1Ldkl%%zV>LLv?6`>bpo{*dOs` zKYPog+9^w&FV~lVc+iO5gzKeEZGTiXOMGQ!k|+u3_=QnHi;ogg(VOvK@&{_qNcWyw z9FR_vT^6aM=wQ=GE?$uTvE+E(H(~E}-$%!CfiH4Set;}yx+|u@J1X{Anj{NijZu*L z!4{VmngarB@A_tfoF13Bl5~ywTXe+L2l|QLT$C0iMR}au$JA1cZ|Lv*!5jD8pnTF2 zNT^H8#b}@YVKJ#9xD57gge?8M=4GD0vEkqzu!~4V(8Zpb;#TL z#1#@wlafu-pj}Dd`7x3MC z$){V@NoVlxPNXKUe#h`u@qq9t>d~0y_F5HT&+^xSqF0ggah-NMf%h3}UR=5zVpLpF z(ZEF!w6In@Z)T}Fe@2V?lJH?+ap0B499-z3jT;nSQ?vQ zXGK72x*EWP0lOP^3;iGgon=?)rp4e9|k1#LQLYZIrJaD!@Dj(QuyVFfc-*y%4FF(N{?vw=XDY2FTEbCD9k zzM)f*e*0Z1Rf;RCoQ3kYUEU?z46**1Wq33HKtaYQOLMVE;=7dd4rAVw!Q8M zd)mp=7oVsCg&u#d6t&G;ZuOgIH1O4R<_ceQ}iqTgGN&J1hh&ztTH1g?yML}wk%c!V?g13AE5OGl3x}u4FRtJEA5H% zUznSB4-pVh^6ODl467u%(fk|Dv;b20P^IR=pvbvAD6aDRzoHin?81NT#DJ)5#nlsGN3;ibtdcct2;xAuAd6C7?{dDm^6hb?iH z0-#|;lR40bRfM81pYwI;$%+8*n<11d=_+A-t%Y(~y`@bd4bY?h!RJ+f@_)MdK7pBv z76!+KUnkD>7+S^hwHZjHElTY^HC1M?NMKKK=WkRg!#gCy!%4+Y7M0?em7^Q)=f zUC^hY1juB-pOkgWfzggH%l$80?}UxL3*o29fPA9wBO-jX@zxzzjpG&{=kn7{#s@?+ zb^C8b?h=1Tm<8bS0plnH#nfTqLGOt754IB%4*CHuUJo6>b~3W*wYsFVT<&WT>?;De zH<2Hxq{5ybDhxXD&#pYhfpjmLKJT87g-d9s(n~M>Tsm zQ>ZUZDd}H-)TXIVTIsPF^8G9?lZ}hGDrt{NgpjDT-qMM?-a_|rUh&6tUf_=xeqzc( z_sy)*X07Ns6Te*+(gR|10)Xg6f{&N*-3{C%)_-w_l*6cM6>&_U=~kJ7rkC_>RT|j> zZ8$sB6675!BMn(OmU^1NdeQltSQ+@z;b>6nK!e=TK?iJ`2#C&a^P=G?15mcY&mY^9 zFdn6$+CHFp=?+|60sjM~BA!T_{!P$vTDqe}pg9nS-dfp6L}&fOzns=Se;8XIoWHN7 z++H_)GV;Ig{6CfjLpU+V1M}m{3R<~B(Tg(%E*@vh?hSx7!ysvE;{W>vfa?MCa^;`f++jk8 zPYr6UYX2}LMNt1*u9Pb;V7q$%A44GK^TLU$9=d%0OSJ^PCNKxhbSa=z%Wz!i#c>mU z0$fcY@9_)re~15nJ_l5nC5H+s|G!qB|DY|Apvx27SDX^i-`o6!T848$@5!}w=MH_K zeCRXer=mi!nm?Tjum4Y|CUm$EuK!u&{x6f0!1%%#c&!_0=9KlWWP8i@{&lwVqE60s z!@tlDc7~H=A>J!|B7e;bnD#<{2d@Iq)Bo?&p1>HEsY0zJzRqe^Lc76^(dA$+AwTg` zNxBj!f~p6U zL&i(vb^Rx~)$LewF67Q=E{zV4?N{oifi`Z>zjhk18~0ZVr%>Scpc4cRCccQ64WpJOnvKUrr=JhJ_Y99f%aIb}Z)DjiSk!}3)JV+=Tg2Gf zj47;f!0wa39K9t9V*CsflrIteq5d#04 z^^pc9urF3VL3}YfIC2bAt{j1b(Cd4bX;fYt5-x9Eu9(l237pWbV<)LO7KF ze9sem{MIe5teg|#EU!KRE?z&MWVtuG*rnr`I1I^V|Ga=ylA^xuL<2NT_&q@Z^(VVu z{|;^5|KrdaosMbY) zs`oW7j|vgDU5W!!5TR7s0p@Khw&>hQ?=K0Q`lp|}9x3;?cVg)cLG zfl9ir^~=FgJZIA5;s++6{_3mD?eARRbXBd?5UhrMb=5eJCbYgEUJRmAPEdO z>=3aEFvr~s|5`dr*#DcQ+eGfQKHM32E3{M559x> zO#-ZCC(ZvXvN-}!pBiKhWHJ+e1!F)_x*wptUdjKtxC85s|ECmjfH)dLxV+ioGW}`k zA`O#3M@m|{y6t>d_(w^?psmhcY~SZDr)CFwjWmy=d^e*$6N(oVA|$ z+F-lfYgW{uR?)K#dt3HPmDleGymWoKH8_mYW?II5CU%|uUZO=U1irsqhu3Mp&yn}D zMdwPZ*F08h8_Kj1|5V#Y#uEMZ7WlyGOg=|BXwv`G+iV%zY2sayGl&U&AG; z08Z=CYk+Et9;Vp02a*56yyqQmbvd!L2|Xlr2v#6C#|5MJm~o{GS6fX zedJK5(K~~db}o_ImLsVVK69|jNVt0*lj+CU(`AW|ns1ui`{Gy^7kPHxWt*%ymse*G^#aV? z%@v50qhmGoC+$ZB_oEZkpZ8^=y`jafl`P(7GaR39^X^zsF1-RE(uYefiK|LvZEO8* z^93loZ&;5TTAqF)U0zO2ojla5a!W$*M>o@hOD-U(#7^@vfQyz&lf~$F|7+-7Fuz3fm;tVkHpzHKmbH@#P})Fi zOXE7XtObT0-iwGpumIGVgexK$L;e<8?qyuEj<5#rrnJ-ct9J*pB&KV3EuDrGs(v5r0``t(82bxTS^S~zfnn@sD<6;+(-@jf7Lh1oNckua=E@~DH$#0u zazcpM`$O|}d$nqT0msqZUcd{?)^vf0j-(6u+%x9RFN9XgiGd9$mYPjP+*v9w<>$Ws zWH&TSUZ{jIX~O7s-`fmv!rio^3zCimzwV{vn@4Nntvr^|)XU=aVc&3#(;oUHH8+7} zfwZ#BdTS~qK_4I3rs6#gdEMM-b}92_Eu&FdMkc;nt9K`aydBnF+x*2YFbbk7rpZtVdtg?%yDJqnz)PIE4UVryqc|*-Ou1&UARboGx);joUYZmY9+rm=#cn~}mO+~2vvZ4L>iXcmd zf0BVsIrz^irEEV)5EWe8wd8L5#tcT2QOau`QC(a36@fKQ)zNZQU{`6+{fU}ES5edT`+LQ>4xv&BaWXI09JUXu; zSj7d3PV^UP5S)e8KR|Nsvq|}y3_#V52NTMviH0D@ViO91IUX_HPL~nY0Dd%iP^-&< zQAwMAwM{klqvqqds8PFy{R30g7{YtEt0=H`vs#6I^B;ci^(Q#fiH+R&bnWHFD0@v0 zC;*L1HqWScAlc;?M&nn~+!G%lrgy%X+Kxdp!x2u;+5zq};(p0B00@|-^W(Ncr^(k2 zfF*RLT$=TA&%YA<$1E@s&H6iUdZGD-mofNmjqR;mAX&mSePz<^npN~77PUkS z-njcKmv@WxFc3z@!?Ew8K@#k+j`h~_-E6N+ZAOSbMlFZ0mZUM|>;amotXb<-$6=E& z4n{%28@iriV-K@tyW{ND8UXM#8ag?9xh;+XJ)0~-LxpTj_`voIW+*36{36KdQKJ0) zD@jxy3y*VXwky?9i4NB5IeWPJOJwph|kpRO^|H zkA=%%Ni7aJ<#Rcp&&{|egkAIrPacdRSK;Pi)~*Zokw7sG=ryrhtic*NCJZY+Vf=U` zhm3o~2hI2(JYfJ+cjSq^l2?R41n%Mb59R<>^3V{#uE&&Hc2kbfqHlJnd}r zbFNP;pc(6jR_DNzH&aTkdR?g`wbGZA44C!Mb^>QJe;eXkT>cky^Mbk%66Mgb3=!%DRW9=I}Rst$1!ZmJGEQK(Y+u51J zSVq}_LRp;NNyvJe2V8Q>8-4G9!3}wU9M-_z#tr^u2N%~Ull1=0Q+kN!*=&g5$jTiV9%vzximiD05l=K>a0``cHl-HMQJ};vazm6h3b$*BO`|(Vr zW=}jZLF_l7N|0kj{bTg3mYdCXr=9pe3k@HQ1jTS{^cyQyTTDU~{C;wnqattWoRW!_ z(V^3tzCX|BFFlKH(sWTQ`%b!`9XC=qmi{^bG>DCJU5|3P;yQXG?QVBpdaNeI9~HTd zCucX+61F>w)rK)}{mQn|UGA*YZj52E!6jk+nkDvo*x$g(P1E0FO6uQ8r|&q1X!XVO zY|J$dfWi{@MK2vv>`f27;vW0S$j4C~F%vC58xWmv{0ncWU`j@X0w@7yY9%}h=7Q6_ z)U9HHV?@(@h6R6E?hfagCm}erWp4wz=lMWL2&#SKiCMW$t;qY*5y7hOCE+3+3wZl3 zgZTTMU>1>h$|yK0d?|?nb(Dml|nk!4L7 z4*V%?Ws|D}E!O+oP}i%r5oW|BX{%eTz;brU*O6IJnB+7^ee+>Exe~VQPppbDwza{y zYYqs#TC+Q6)4%>t4=FE(SN2qqgv=~ylCJ?dFzXG-=csC9@%P2Is)@bV3_K2+baN3_-%?jdzY9n;HIpIuUi-zuo1Ul`_aUcMRfuTlsot*R3FHSR0< z#X6MIhO`!|Z%A5IKd{p|v|8$?>ckqd=m^t*>dX8e!zL}an)f2Zw`TiwDX-bD)Ou(` zobGON-aC$BM8gU&F4FTQ2g=$F%IIfP@Or*VI>~Bn`}UHb<-16u^{(p$!pZevQI&wv zS>&+a@`iQyy>nt?eK*1FC$XTwGJyVrIA7s|sE8-rCkiONZOn|jZ{^ZUOMgf22#{~B z7~^cwf2O7JzYmmDv5`F@ydT))N>#G&6RB<@z?O(w)K|8*>755qe%%(f49N`Z9+yBR#zS;WgQDIWZUZWXk5py{Sw1OQ!fpGX92PlVclH;}1?z zFH-7)j8wvce9-2~ZztHxf=0F+C}M%SiNyiJFXFXI5cBZ)77Q~XrHfxa(g9wKN3ygh zf4Z;c)t49{%)@z56L;$qfmc2Mz%v?!$>F7}(I4_7NX8L@B?ih)7RkN8<2R ziQ9e`s#m-ll_;tu9%p!p8}#l~oyQj6h24oFDf?><&(W871g92|TBlp=T%VMGqH-Hr z|M(7|^%CGaAh)jvG|HG*dus*PXu@|zx}GLijfcEcq(?t)b1?`e`N@4r`JC~!{g3ir zDv^YGIn#82X~ihy(sn@jI1e`;nN$uYckZqr%n(P4l5L{LIYZi{C+iH#fumI+q z>~(wF9n;Dlh~|MT#{+*Lb&<=hyJmS$V7F0HO%Z6(rCe~W3bV#x`|YAwc)}P_Rqaj_ zKkKn}g{g@_F*~_nu2j8(R#nFr0nJ$JQ0+?I5uo)fdfO&drFRs;%^~itC6mNfyfm!uOgsF&`7om@G~gV&X`%VmPuB&%SAde%sHX@7}}C zwt?4vebcxbKh$|7)?Nznj99xET*tt;viS1Fj?I}D;`oqH-{HL40KZ9Db}e6v(zIH) z$Dus5EDriW(Ty7HVy#hvkfuA2M8%tNRU=9}`1+=0+KC2{{Ms%^ov&9iMuN*-ynYB! zF+rE@ld0VJVuH=jm|`sEs_&Z5n9u=<#UN?8N+&mmKjir)*d5e9PTK`XDKKpp1`$qp z*VdTFMjbeq?f+8x?SEZZqBLDNHbV;#XH(=cC(>5FheK%a5zE%n1e&6VI23|v*(@MQslRW@ zMwn)5iH_W9K%U=uULXoS&r`i}yPf)YxwuC$Zb8g$6PzyEO#|a4`e&h|-%_<*?r&t; zo9S;jwhpM%L7)-d4ZG2I!rS{~O@2>tEwhaY*3TraF%z47wyT+q`SoM#?OE-E%B^}l zV%aFY%C>NT3lu)%Z(7mCQ`PYbJl+smDGWas@IuoM5lmbd+&f9t=hCUx@e`;kXH8c1 zvDC?=t{$Cz=mRh^Ut=ez{|%}5Mi>=-vl0|6!Al=Z_BjA|*2pPrlO^W8%|`Gs^CW(2 z_TzUH!5iM(QP&OE*8=X!uOPJLW4P*Cz4K@q$s?!yh{05?K21i|*uDOSo7*?3}i{L<(x7y5kC!{5qUi}-6w*^Juf+md%{xq zOHKBg$0XuhtCyH&riqPjr!YQIq>K8JQnfpZ)!}&L@|W&wiN@?d0<1i1UIQ;KL30#R z!OfDww+M%Rn%%Pe6lYvORt3nVE#UZy&u5@)cp%7|49IXeb(ub>C9}=VUhzXxPO7EJ z2E}E!0Zm>!ud8zRP*P!xH9Jq%UU8y-TZi?c+}>__8x4C%VL@h_vXGDqu(v_=klX#1D@U}!~0j`wLbujt*+)H>ocsGk4AN+P?4G5jw{3}-pXA^>919K^`Wq_OmN z>X52A7TLY1yJ@X7fwEq%vlbhuroN-E8XakVCh2M+d2t}0DXX$mV^Y#|l(=!DAUQuW z3{^}=dehei4ZpFMZW@d{q|cNjn=z?W9%nujY~!y~F>wevjE`BT`O&+Sc|G}WIz1`# z-d|L{wo|NS+HG-De3EfO2BQr(Wd>vXg4OE ztSK8m?fzk25cs{LSk`@Kk9~eEpPtXih>aXWiaTe~>iE1Sc$pS$z85Jki_RSbnmyxP zv?6=XJ^8VX0O7~bKZ?X3RqeRwK+|2DIL}UMxfn4Q3zFAaMD(X#0w^9sEP6GV`uEve z&B268{TE5*Ag+w>M*)7G-%2e3jItgqw_f3Fl(MLP!@#2+XNc!oYfx>d>>;0v+SXbD z<~$I?I3SO5Lo2sRH8iZ}_2cRd;m_X+?85zjUU6+i^{ri=0I6lu8E|B;y z&`64mj8%ly+DJC094uJ3n#N+&MxdkhuDd79F%9TjSoKWI=bd<#g@GTr?CERn5Q^1_ zbNR0-@mIC(2K^Pcd}A=MVh!TgO3m?B_m-dJk*45b7zUpixfF;O{@AbmV2;lb{mi40 zivySrvRcTKvmsZViRj9+r7hA8?PQjwA3Qh=X7i2+3X=m^pMHqRKxXUQ`U^(k7jufL zoB3=E2P65Oah0nq$;&rc>|J({(^c$S)oG{}`pEfOT>?+=qZpe3a3QKH@eL z?W-_=yW%M<%ILYK3qLS}$dFl*ulBh;zk{Bw%)^kA5fFBawWOYW9&4{wd_#ysWV7 zmu>dP-0V~Nbar{J?0msNanAftAi)fy2CJRZ!lEMHvYkD7zl$G6Z`g@Czx8#-xh)*)#2cnbcWOTlUVLY@y z48f5EUWo;LT8q@-vHw636y5O>d7fm;>p*SvzjOW!OEqkul+QXvV?OqQGT|jtHE^Q=6 zb`zuhNBF}f`I)b}CjQZG1yKHaNDZLH2^-}tuW(KUsj1LQdBdHT0Ko+mVn91x7U5~Q>Xt^fA(^O;nFtLO6-e1*1_$hwcfKe~`E2CU z&h{(oiP?LjQbg)h&5CH`Rwn0;$hPwn*0t6oz*~@-cAO$?U{hxbUp`61K#bgc+MqQl z04Obw9Gxiu|3~X#FM5G+e#ExJLK^oSOT>K;acnXz7YCE$7~)+03(e_e@9ucI6SbMn z9qkbNzFY%wXs$=DGu|FEkl8}~eFtw}t6<5m%W%i-eyq{d1AEI-qv_% zb_$DrqNyyw9aoaKdWa`-?nRpYT3Z1h1i<7BUjbDMCQ{$ivuArqC|h=x+V1x31z*f| zfj0`;`yV`NlYUS{y(5op;N3nr+mS7%dg|h7?SgJ>3Nk**BXUlEO5$P`@3Ex4cT}I5 zp7wrUnt0Hw-dFzCzkBu50(RW@rl$9%Xmu#j%JeeJVOqsNX%#Y1T18UY_Sk5Ri1GQX z|Ncb4>(LQyleKcFxwbp!l`tg}og#{Anh|CJLPnq*VXoux{E% zd|`&9kl1Xg>L3;25>L~#WD8rN`^hbpThk{T53cGO)Di?RyN^!t3+n)&mWMUD*@y{B z-O|!$`hCzL$}|9<;n~U79cgMu*g6==H4S53LNHRoYeNYZ;Xr!`oI-(xx^n-E-$}3E zy=xny`3Eu}4YcTHKmKZ!c~`Ztj!|d+C^|)L>tAsDXDn>~Q-41I6sX27RjW6&ZSK$} z$6dc>=2-hbfC9y{cAj^E{;c88Q2QQyPU8ij59!XjO7q_6kCKt@)_8{8F85Q6GzTI^DA+XCr5bq#k;+Z z%5{-u)vSKEC%Q~Ei%Ez#cQx6#PPveW3c}mXp~>|fj+~wygw5JccUKC}S|tMlpSSKYP`RYF z`u6OqJOfK3j!eSupT593gnv~d*@C~Dxl9UUhkBW_+jK``{1J~~`(G(P8hVP1pK8Gv z+;=i6nW_B_cK7C-@p?KpAMQ;0cdc$K{ZKS@$g0*};G^3U^=XIws`GJVGG3g226{St zt4K+GQrJI?9_ct-j$(WrZjgm!+8%z?j+JwW%@s1vO|M8X$m$A@+0`Ic6RZP%|Ic1J~*$!R_3i*OKe>FsdTdK^^Q$SY)zxoNWPpQ8lpP$ z$lYq!l6kKc9GD3asB;JZlD0MVj~EF}YS(I#51_B$rYAFfN4z*EBh^6a26SA&(|}gG z>s~dvF+wZd@4qjg9f*u87}_R>y&1oPO@=$bcn$63`qd(0SOOYonma?j1m6^}@_)2K zSO3bIDJ;pN|Nhw1(DTc+|M7c9UtUeDR(psYCqq4Vn{RT6r@Fgh=%L~{es-zn`Os3x z=ku1tL^Y4of;3E~<Ld z&3eM;yDd@0LxlP*J(F@meK5=REA^Xg789w27%zCm1HFCXgYO6o(t%RdOAxT9kWZ(d z;|ERii0@n%v*CCHj{pQYr8Ah8dL0}Jd)Y4pk+xNHve)E7#lIF6;4 z+WcN3s%3t^a1c<7PuI~J4d_CjD9z9(tRhXeLhBhs6C%tizDvelzrnP7k&|>)q(FKd zRI1yI%oIYK_xey|HYkuJHRO)L5%h_w^zat!wEb)QM=6jXd~ROfwL`IHAcs5QEX;o& zT3YJ1sK)w_v9dwk7TY)7e;xNrl3`z-lHq6bV}Tc2#pBEmW!GlX4K^d~*RZLZfwp{v zLGp;IV)97A!MJBrI6c(SG;LpBiv1>wl1Jo8uZAI5@v^UB9@=m3cwU(Wn`yMx(8!vU zf3^#BtLJw<&N?0+J<7gcKOYGXH^jInA-$T5AYRli!NR!nmeQ<3MZv(gv1bh{wc2*` zn2oRO;a&6kR>5+7sI4-uSXU9ZRGBkLQeh4PD_^$`DVlAx21&_(!jTnnJM_$!iszv^R@9>P75DC>CHV$?2*lP_PdNNUuH`5n5VXwU1d=FY$9?NGj@vIgPJrL>I^I= z_pFqs$ILr_9eS>Pn59fGaO5-dtkm8m2XBA`gKeOC%WE~{Be_Ne-!q7*4vsi z&CvV7zQAPhKf;NoO=Vw2M z+5)Nl!?Lm>CGzEO9vdH_b1V?Xy3<13h9(<=lvPw;W(RWKUN_1st8VK62_e77S@!D> z%25jLT|#Cn?ixq%Ggwk$g6du(OcFGn6~8!ceh0akZVk8`(K*W9h`b9k=O@%GU=H!D zV*@(h*0Z%t=+57?0-@KCqmUM2(}L`>%Y@HOJeeiC7nbRtiSh)HkLat&m#R%NZb@FH z>0R+uJW=27{}1;5GAgQeeE`N0LBJqIq#FbUq`Q&s8XA<&p}Rwxp}Rw3Xe1;h1OWx4 zhVE{G0bz)D<8#h)Jm;)+{{JuUdcXYE+8_2>4EKHStLwh5{1EbivCi!&lhRSODir8;M1My!Xg*du8>PL&@QcQS3wzjW%kt#K79>Lw8 z;PFel&Q|EAPov-^SCfgYm?PS-!7J%x?5>$)o7$uG*4!uhM`I9z43r64TDU0w2dW!! zWEv4<`fwy*ZvAJq5;r7AdJ8JfCQV;x_K^(bSz?$1|547m=GTQXiW=XByvjujeSIBe z*l>NNU_-O&&W@~|sD8&tv#Zwx+agZX%rBwzlM@s5(=Kf-oA}cS9SR`CI1F`} z91rDtTU~px%Rci+GY1CK!%LU6hqnwrF1wX(VVTDZ*`WH$ii76#I+jMblD}A+AD8Vl zCNQuzc$mj2J|eETtcj3XlxTvGoV*GHSAWt7HQjr3mJ0>vuo^>jMN$q$a-Wit(h&|! z2Usg%J&+z_tdHX z%@tY#d7+2yf?ZDO*xBB_z&tZFJj^aObkkR%0!$Lb9L!MVoBn&8hoZQj^5gDH3bxS=zSoS3A*}m{+Me?#g zGx({j97~_`N_%{32LsxcEQA?a)&8(>eu57b)m0SXQj1I_Ku1jV(XV*dBWk}KpJ*3W zp>gjQb%6UWR74^~sja^3-mH$O6Jf_dFN-Nb%<4T}uN`L@c}I+~6104tS3zB3-89-vIGI=A_M?~(Wm(tX}hng%R9lZC_JkW<yF@#(cG1 zCi-4~auwIt>`2#vJ({UvnqfI?j+w==v)4m@x&w&}Bj$(`ft8T4G5NfAhHRJ0fFOP@ z1RBr!N29Pz%@>~GIe@_*tkvDrKsxfCLFlds*U6K2YA~rE&c^G6Ar1THcw(s})_Vej-vsg#NSDoUd)i6qVn&qYG2h0UU4Ggebl0!P z{t@g&dFgMB=aTD}#%I|nb|=F3L+(VlWT05v{aAh#yiOw9*Q{(>W>TTj>1M$dkg?KG z`|{>Vny_ni!R?pccFQx9<3*b6bsRr!&Lwxm0OKQF8K$iRv#EG=easmbYrG4(aJUR< zF895F4(@=AT_)6)>yoi^l^1cX=K9F*&DFf8jZR`8{U9qQL69T-jS>3N#C8(4!+RS7 zOvasW+jXAclvGs8pbPJ-uuhv?Uqq0)JW(K`Hg_H~or&xBMbtBUg_I9n<*SfiY)sV4 z?^>lQ!w^~*Zi4`?fC(EXry>Dy9sw!?U8Xv$avqPdmyIowVeeyqYPpIWp2zvJFpD`E zW;CT+c)qh9^R6Bo^mRYUYVi2WCONS#Cc-PsyG;-8EtPhmK1n@z^}1EeR&k^4XPJyq z8!2Uua{AuEsOCcD~j>K@4 zy%-pnSTVG4RD@h+csIOz5KHwQV-M;Asi{|EFTC5;sZToRBeEM{V^b&H&9{ghXnWnz z0IJFjfxctfu^X+HosHq)ImKni$)w(DKNw>-Y$S)nw2V$bNDb9txK#i<0+f0kvGZQ~G?H z`q{fP7*Sm{iCCd$9A(kHEbTKvuCzrz^SL~As;l4WrXHd%U(aornua?YU zI#Klf%n}^g+-%XYM4MA}&F6}IEnC7b31ucRwtN&*lji>E6K<}u-?8HThj98(!QjF1 z@ycEZQ8E{H-qIHXE#;9Nm1g=)^ekKjz>%le5P-X4Wbf2K+rF~c~a(sNO-gNNXS`ZI6emtE{LDgmAO`y)n=NL2@ zGoTCFv)<#U;D;}5?i+;7ps`3uQ)^oq*j0uOd#LSNL1sk@rB;luKt=CP0`7aElI^7; zSz)1S3h*3`dBNk*>sLD?P-)b^tAKsv$vBHec=}Ap9d(VqU=N|qIUU2V`qm`W9_`2| z?3>XIS7W8VT^Ds4W`YWqzpgz9sXpzrqROmG9jWs=(VabsLy`7JnZW~WILxRAcj~JS z1D7IzixSWT3e~l$0LIYnR2x!l4&94!#J%nmr7-{XL97dYDe=s z)ZRS-t`dNic0WioZ{glon?MxlT!lM!$15*SM3Me{4^U&I{(Hq358=L_kJj<1UhC|$ z3<(~JtukN^yGx9Lr{`)dF7bBI-RS;W?rudcD&R2DpJ$*&%HZP8O+XR`0DJgQL_b5w zBGVYri{vdRc25I-N!I#2j&2aGEX;16L&hX9JX=cf1H+E(0{FAY>Snv!u$}hV7xP+U z1Xuk#%WxHAslr}ks()^S?tFK&=b``{M9lDjJ#58*Ju-|;i-31bKq?+0nFuQ=mz>{! z&%&MdIV!D=gJF|!CCg~EB`}M>aWM3-qhR3}t#xr_5%`CHJlOWXY2D=RqrcJJ0Xi7) z?6^7yWM%wONGO1V-}~yD4y=v#*wBtG;AK^_VsDJFMyyF~jpOMSj)(OEajp6JP%qc2 z*B^^w|6Wx7|IbD3Eay#ozW#_$9DidJvS&m;C2xMUd~k zxx-yIe)}O=c<3>Tv0)3w zv@baH2F}Xk(^uyF`R8))iAy$G>o>8Z!x=i$ml)V2G!r!j^N1e8@44aEbki(_ig33z z&`Sh=O^>kZSH9L^Im86L>s~RHUU|V=A|{B^2Kp_g2u$cos{pAyk@ zcL$of&|~jFlFW%}+RNU*%f{P$HcJuEKo?7tMA!BXAt(9M_aWT&$t=`YXVLxMa?YO{ z(2SrUe{8ozF2tJ;7P}6|UAqDPN*@W3PQsh){dgpd%oo71=w++d5o#r1Uj74_f1!|O z!~+B1SED`tAmtov^_QCxArGl{NO|(6P%wC;KjZFnDCy`LdHyMxcInC-OW)+ zna8gr#~WiQ-KYc3?tXOsY%g){*rv_TMdGCLOxhq=%m+b2a2D}TYyfD<^#P>s;pbn@ z5Aw*Kn@fcPn=X03!=qWExhGd*SSaQrBc;B*YZN0VIELz8&n5wI~f zkD!3GXYhl;z|k0%anPjt*R$4WRTcdOp`|*4J5WjFg0CoKqIZ~eonR^@!j$pf7t_Ri zPSPB({wbz@Z*zBk-VyEK%k8*M+`LDF1c@rZM|`~d2=stb9MRr`4QPbU58ftB-S>1c z$t5Ee)0r)r1JFUfJ%{7Z(z)z7&of`Ec8OD&xOHkWlrkR3hx(2}lEkiM$dO(Drd;5K z0_itSM))F?{j9WNPca@PU(ilC2e>S?-fe~w5LqBb0|E_{SC->X?C{%cWi z+)Gl`)Sr0^NkEfC&Ipm4)R) zE|(d{Su|L7Uwwy725<_Z4G{qZN}nT=ViXsSLs@GWa`~NceD{{$MkZ1*#h~U|ePouI z*Hl|oZLlzb)V12fC@WAzUaS1E{B!0vNvP>Go-CjN9)TS|@H`mW_!n#Xqwt~J>5s?8 z<~TcQ>f;%>gjB>Y%S@&40X9*r@VBDk;t(C$a?E}VA!ZT9r2?A@(4q~vs$$#r6-=?H zo2YArc^AN(CF`BHlGtkA{$!(ZNHj?{`?|bxUsVIj%?g+e0sgeHBtRH=^+EbBFZ47_ z{UqJh`4z)Be?&%f91=$CKObl8-%|YR5Y@QU%fUwl;%i2x(dFYKvzR2_yPvhkex^5l zfpSZ;Fxp=6eANsr35o=l9!?GSv zDipn=J5xs}wn2@ubW$u^G2RNHs8U}`*3=4{@BF)t*|FeDqv)4OYl9KEY#G}^(4_L(1!Eo}B>tqdh2JC{ z%$J}ntQ=I-7aTfLyby507@NL@&nt33`m0(Zq^GIn`f$D@-u8|4M2v`_MvR(RP}ka~ z_zhD(jwKz@jr8=ri`gM^IT@E_hcoB4>+1l&c;6r5v^+0*j1fMxvulPkka(*I9x|g- zh@F)wr|9*z8%SfYK{js42qgg!q&_PT`WG-))W}(Lb-EsC$Vs;j)o!_SwQLn>*KlhM za0ScSrdi|5*6l7~(%9po_k_@X^$*UA2W3+eenAxFf4HJK&3EFK$!m9l2t%^}6mF&f zS{kEt>&|xM#oA2$>U8(PlRs`gXm83$Ei}1}Q+zW2EN+)a)Z05#xz9Uy=s#2~)iOxBV4*P0LYQHu0(U9M#|SwP zao|Vbv}DgudZX8pjZ+ZMocVKe?UW9AywC@g6p^bI`?xx~FB9NESC!qyx~T=N$8Y`c z@QIiJ=_^;74Gqwt3e}YRHm!k6;`2_-XMNd-;fg}O?2$VQ*0@t%9h_e)1p>$zyUNw9 ziwsNPlNA5gC((`To^k7Pmie+50BWt9&lj(Q_^h0!l)G)5Hb6fO5#H*1l%qNsMN_R7 zZ~pZgS!0PZ`TB#irAdBTsDQZ36&@b@JicozeGo^wZJ820Tds>58|&()eq?l_@wWMe&*A$syZ&_OqTzcfkxtRUV>a)RGJhO;sJXbBx|Lr!NI*T(tAx()2* zVw<$bG|!AC>n0nGb?EN?4J(X{p|tnqf~lu|%EpmOXV1;JihST# zVZR-Mcxv;?77&I;-=qn#+4V*zveATkLkC?4LA-J%hT9EvQdhdyJLr(qUJ(w#56pbJ z9BrJwnyS+ZeUldIJ~ePh5kb0nWxBl58Pf@vwY61|eR#xvh^MJlu+QF_6-G>HPG%X; z(^o~iV&kC(G>-E15~n|`wN9dQpE6;^)z2uE9)s$lW?f=wmtQBrpePk z^i|we4LppGpU6{9fZ9$Jyzcwvhnym!W#0stuawJ_%korS@u6{mIwwQoQu;&oVaNWq zz-_WrN|ZGBSNFbR^J?l-8z%oi?h6n$FH0u7V6 zofx5~5h{;7SYepSi!ol8T7&Snn+JcF8?#e|rfD;dhI)a(H#ao9Odd*Y%h$BOA|ENl z=Q$V`c}W-=r?BhUg2kBDm93{@JH%>t=}^lb3_#^f6&48MwH-#}pJ`R;LWIeWo17!% zVc9L02FhvHJ5dj#T{_HcBl}<+?{0T9zkE-BTzyC$HvHDZNj6xq7O~Q?fwpCj(`mWto9#fit|G~O>#j?6xvLAS z@B*%t!H}RylFSV*R74l9T-QWt^qqH$*ai=l*Dd zuZ&vVuBJZ_7gjS4udXvNqzstOchH9Qo@)%0MXbYg!D;~=%49@0`42B;+PT=P+8me2 zYpLAAmB7D@qK|HKC~r@(C$2Tu;JwXPEbCwH``J>IcTwM_@bzO8r!Uoq-U>Sibf{Tp zc3CN5-khWFxlxSf|r)MjNbiN`qaZ62u22w5@*xJ|?mCMY>n&7VSDHuKy;D%Z+cM!Qu z0;bg$U{o6uBPPucKdMoQ5!bSMyzj(UqgUZlT_4QwBGtQ)N>90B%InVgvRgg~1 zQRnAe8I9!7u+hwHc2*4#&h=-1#GA9IHvsm;aPd zCPErcSQ^83TfJ}4|6&#zgZE^$9w7yZ1)ty6e>N-rWGc1H=i#_0{$x+~eJ?Pk332st z+C`{gm!P(ePzFrA3wE18-c@){G&?$dz9bM&LPAr@I3i_nJXNtH*P-CF%Z8~z!^EfW zSqkISeEYOSLsj%mrMi03w#O_VcTH#eF{8u$bTHqpzEd$vcJ!8Y8hownN z=z?jjJ@9noxK@u!zH-tPbIlUL=(D^K0*MO){GAD|;+imDXvM1Fvn>g+5ST>Q&$FMt z!juC2#$O=kh^v-;^kCFb8F}|Wnqc~}d4)m}2B8;#vEv-5;FGAO$av>B;tLc1&RP6} zE6|mH8w*WCug33#-J;V;N&-Nkx zakzFdP5~AAF=zcfq4!?smz;bR1P&XeWwQjdEowrs=;4cwImf!Epwht20_SMy6mm>Y ziG1;DrIP`_vnxd|f=bPwV`^sY)wA`E1~91LWpuhj`J=jxvT8#Ufjxu-R-#dc=dZ2G zoU-#9vmD>+@4IPVX;nIL*JqLEBI2OK6HxHMR0NFY9NTJTwo30A3_l{)PK5rwQ<$NJ4?&!YYzgbR&O@ zGT0pb@bZj7bH;1BJ-g9WqRqvb`}`(6N-pySrHd?VU`}amBItG`?3e7tf`4dH2c1@Z zaQ~w1C;i%&F%~NmDvsv2hBAdr5qjfxBo}q#q zUb_U9xFLiDsS%ceFr4%y7yrx|)AV4}kWY&SNr+MshS{nW4<8O+2aP<*cJR1wQ~Y!@ zccqsjXwh)Dr_=qsW@Y`2)M6}z&2ZwY-1pp4Q`zIkY16CEu;g+>8+||tg9k8bD0t9j zF3@krTEgcO<}9mVE1q!IGZBnx{Uv?!N)Li^0W|uV>xPIDtZ*o+%-fpa0vqcvnS+RX zlE|>&Y4`$s%WwOG5yOQT-ghfD%|v^6H5RN8s=>?H1s?0ysObJRPd{O}h>r*?w8x1b z)zYh)i+U<9--6kr9gdN7et#k)ZUl=s)Prd=1rt?tr+Mjpn&tJe6MTP z+6yOzcEbIrLU7>pVuw9v6{9lRVW$fTb@ZAq&+VQ7+^ic!wfkp0Wy|Kb!LssK$S_?2 zN%M69-jH)7EXTZq9!%=1(@QVU_Ty}s3vc&!&qJAd0yF^MKJRCcF>g5+eR|D~xXI<> zZEy1zr+VakVc8GI|!cDFf z9#5S&W()J|@ya|_s<|1z#u}vNKS){Gxh%OMwB$}lX>!H7F|=)d;|Q&tL;S?RKw%3& zkB)+5=^W}qj2W(YBnBEw!VC!Z4}82;ipwZ42Q&CYNe)wNF_Ntmfi`4khAli-69i-Q`J2&~zTm$W;F2UYTl?Gns~4p1+0 zoAV5&Mp?x-W(ia)R@|(TD zo7SzJ==Qn+iQl|rh_gJvh=8Z7p9AI@cs##v(c#1e*8+mFVs4EKGuYWRAP_OAs8qVB z@}%>uKc7vBj=sMBAi%A%TV*}Y_sZHP;a(gy6li^4eCTuV@@=owLVH#fSD;3eQl>Ub zuW<%ReRZkkBVx5fZ5?nFw5H5P0p+SvE(#)83>dnT^wUi9xhlU5t)BX_hIkrgUJzkq z-o=~g#UKbE$osFLmL>p5(&rw3r6#`9AuXOQryotoX7jPEcCc}pexL~{CaSqijo8-j zQjLPQv9ZH;4*VP+}GM6&Xmg zY?W2Am1l77qVUwW9Op_m9lH|@&Kw3T()7E$QNn8n>OUNUd$>n;iJ1FRvsa>d?Y2#| zlX%oe`@S7ns+vw$VZRoBh_7YeV0lh$2(+9-Y8#9^?$45( zzN9U0F-bG2ogg!67d}!NRiY;>#|RH9YFQ(1@jYPGe$9CE_*2dKHJR<(4E-;}S2LIH z99_cFxmkFxfBa0bdg|%jwq;POLp=a`FJoH@c9=_1Haw2L{9ZL8QRREa`h1)XZIY`# zJ-2}f!`#P&QL*)dURSfV;Z8d9A{4`f0FlE{y&9dC|L*Fm=c61p1y9}bg){8cwp}Kj zvIc%)F-``%3L0S6X`1wzOZ|2KQPgQ;WA|P1jR{D&wXg3r(f^A=V?{P;@4TuSAR>)q z!u7)jd2#zZ7YLE8KC9lxztU~nY>_&RmunvWA?=)z=Q1w|brMcV!4fJXJKV`yE|z#N zVJ&erhD(aOxv(-HwK+j-K)pg7-qpyJ9m_FKQy+~UQ)>{f#1VKam=M+=kIOmZm#g?H zN+#8!b$!{`uW--*%61bnPbGkIg%&DI?~n&?zm%(6OliatUX4R?lbrdUE`7#Uzf~$c zX=u|da}167G`oR^i*AA($7s_hKmOu$%QLTisrz;5R4LB7Z~m%yycNx|qf#UxjW^TC z7JMM6IcGC76{Qa*-BV2zPE?`ti*?7jKn4DZ#VYZN6~Eh-_JwMNb*0LWxo7i+wPN&0 zn!6|>X@@fRXAk1-Ln5xW>+K%p#X4-69^?+0>Y9z8n5y1Eah*d&JV~4S0dX}U@kdvfN4Fw#L~eH zR)6f2%9G$r@uHUX!xpkw9Eaioc-z6rQA#7xRf}iqA;WY&*4-iRGAY9=fPGZzJSA%CJ^>G+EHpp z7ry*6CBtq~`qn0GVil8@$uhm?{TJ>jJJSRD4jQppnMh#A(aSINaw_Z>tGR}ZyWy=*7mfdHjzLax`Qs#2n!F0U z!){O5mPydVpZdFRJUN1|BZMDu{y@~I?S64@1y!h=p^}Hly1QkGJg>5a4I^aUNX9<( zDNN?QP(TVE&;p#*boo2!pyD9@Z_>g3F3lzR!&M0g2$Skg&N(8VpWPY~KIg9uP`(|{ z4mA;9hK&k)2G333f^aQC4Ie)hm?GBWvV_NJpv;K$>RkH^c=hc=?}dy)bWazLgFJeZ z=^Ct}vWC&stREQW{n2f{OK~WZ#`nqn_WrVqqZLJ>;)p$c77yD~U;Ua$)?Hh;hb7ne z_4I*Qy9S(}aQLfv-@-)FeTDO$#ZbOM7wH6Dkr>)=M3}E zklGv{(nf7E4^LPc<+dvs^t zagQ_UFo2-_`66P;0>Mvpl;4LU>JG;L)wY42Pn{5z~v@ z;YKOV!8c1<^@E?pY~5{KdCzPkUE=Ri`KC&qc}4!bI1HBgrd{3hL(r!4B-L-wOCiLQ z#hT2k&07(fW`ym|i0qB_`nM#N-EV#F_fLIp?+b&jciF){ec3xMWAiY9UGJQb=wIlraD29ZC0@5xtn5IjyShdTO^J8O8gH()#L_>-#dR&=2{BzAKXXl_TcFucy zTKI?z>~*Y{8D+qjdBbv7u4x^t4YYATA%pAVZm&{oa2&gw*P;UST^K)w-_ByZo+mR^7fYQb3|`~y zd+&9t?_Z|lF6cMEKOaAX7UnWa`D{5AHt{VAmW~8keR>2`KsaHPpej_;nS_x0gwcHn zd5&qFK~!JN`r{fa^MncoLw{psXjqWh;+UPH<|IdYHPyvCl|L*w|P<8aTpA~=v6rwH!+Sl*Y5m8L4x+VjO<{{NJ?kAIGG)`*;9v0R_LUz&{D#4?_Oy z$oGCz|9z?dBIm#9`kybziNC9D{tuu)?Z$ti`wy`GzX(u0DeRqY)l0@w3N(wF|4FD8 zgaPUC0;SCTw$nrO4nP$-=I29nF`uqPU5#QaSN~`KCRzTAdXjNoEOuxDrCnBk{xW-uK&&vvW@R(5FON{g5&mmIL60osE`JY++f0ESSyuinF zPZE$zr~k(;{}ZkMCx8Aw7wCDVKD1`PKB=~P)To>8yX3z4-_n2v`vpp10Uk~MxfaI5 zCn>dp(83Qq+{(=d2j(OGlm*uFe)Zk-fR(YFTP^oLgbK}w;_rGg3JafAz_0)RC4eTm z|4*I$RrLI)q{*GfMaL{l3NEo?C`C^`E?aV)RdRjx8e{1yBCT0gJD9Ef7|s9m>Dy!zSAabac{ zr4B=>w-Ya~kU^otVou~WHyQj4Ob_cFU_S0GV|FZm@lgiR&=)NhWW8>lV)AtY&(RcQ z7A#Opp^&^EwSF-{h6arjdP{OBd>c0BKFK=m_Db)jy(GiCmNR>G3cc>^*R$TA2bO7$ zh{RXCiNtibTB8cj>||pZ7Y=7v?Q4|wV}C36kl)r)@V8d)hD_gH2@DJepZ=TG?vA9^ zIla<~3b+hC9i1d|j!%7Ip=(ku#W1;vA%O$1`U_PS2>|5UJDz3Kka7-A$3FPuJX969T1Zf*xQc zg(rNF7JC7}&;MW6G9xfS`{1{{!AO}=eA znp3M)I84yc(3q67Jwq48-B%8_Veh#Ia&Xsbl6<2u@F4B6`C%@vd&oe{P=r~u*2|~D7++!TNFGZ!`e4VfGGph2O zqFY${a{|CKN@TXjASs-k1dUWN6jwcO??@ieIWOyl-T17mb&!Ca%9pu*>?ZFs4ab>a z_Ia^uYQOjPTRARn^v)tTUE zBiIk4GUI7C^y!XIHXG^6my@9mEx*r-cJ@`yvL!k8y=jgI9t3F^AL(;`6_W^5Lvr#+ zSH4+Yh-NzOpa{}4C#FuhdmN-J2PaWAo+pwG{_)hE#R6F?*trZRf`iU^`3n&VF=3w6^f zu=C?$(NDI6@b^p2`eyW51-E=KlU;lYI=$#VbV~t&oK?szLDfo#eUDYa$cI&N+l;3R z?q&@*p444C!&T-S%{Qo$Fa!#Zfw0;K1z{ysm!$f(%*T0T`%)njUlS>x_ZhP_xP?nh zMpNhS8eYm4?4}f@@6IiNgus3%R4yd+n6Efi-K`eig+F%FhlEvz&OgiF#oAzNZoiHu z@fs)ltudeSMJW4in}WV-Gitie7IL61gPJ)mvKlv88LN3m(wms5gsPg)9)w3kB#WbA zrIH`wX^4*tzh%+k;V)5*PykYERSa* z<_2aqg!lCJ%E0U_FE5_b>NeOUUn9wYO&Whe&U@VIbDbH zARt=?-;-%0&C4Yx(UCo-dM?n-N2=uTXt zfiU1}(qF?F9WJ3i`!Sz9!3S`%yD>-A9SY$PyT0N!tim%DOgVEiS`*+PN2zSR^duB~ zAm-E5dOqZ>-L_-R;4+f_St?~_jdo4;V$ybT(%LSp^tR0nt_5=aW^9Y+e^1r2gf8vP zyD@9^kA@$44W8LZ$L5t9J-lF4p!D;E*ZuNXf|-GDAxmJ2CBT+ zTCg;EXC`4!{XVlVaAqm>u_a3J=;ybKw^zEZ`*R!5cFgrWKgnkbOtfy=g2$AYwCy@h z?CNYh`eJO4_tcbrJ>5Yo%laIf*Indwo*f^bZk6o3xj~XZErmH4L#k^E%rNw2a$3p| zwwtrWB~|ON!6V#(Z95(T4Ny{jso1Rdn$%3M7>Y5j&cr#Wj{TVv7Ct((g)5V=nWUZ` z%np;>SBz})a?Lm!%I4D_{itMGL|f}K`|RSV`@B#m#ZZZV(|c@jZOtTrdq=XuyniKR zqpg9j!v3+bvxYcu4Q}rG6!y#!*}GIz{JV_v)I#tjrDyw-=R8`T@Ez)YPep$(JG*QX z6B6u9a}N&>HkZp!xOjLkbNnuAZnAcT==b&Fn`s8WsuY+W0e#<7Q%#bc-Uq*z&Wq7a zrbE)dm`JI$hGFJx((choTB&FJd=m* z=C%+fkgR9N#pS{FnDHGNWB`lUSmWc2*G=#x&}*kH<&+y|PNd;Lx-_7DUx@qpb`GiP-b z&$KYx$pHi70HLC-UAo}b@zaaxondB9aSpGH=dMe%H+tO6gQ4)uOp?@zUA_$au!r7(9nKY|bKoSr1{df#?=1his>Wgg78 zKt3(5)L&hB^Lq1$YgSwh%sD9u?mJ)mj(nHUAm@!=Za0_e>)9#`Qb}Lqou0$1W@*2_ z#E!@{@N1%9I&rG@9fAm(2A+od;Fuat-L{?{BimxO!GC1RkQf_iQ5VtshMX z4ExWwxb19q>U1FT$u)t#0Eu~?*()=OGBQ8B-hR9wQ`ONa&k@(&Knyfg=%T0z%nX0?f4dI<>e zCQzbNsof?fJd2q&f%l87*>|4ENeBc2VF=L!)4+@la?XTOQc^4_zSH%86Ij^@q-niI z!%S>yazAe)LgYetHtmJb90Sa+bE`l-6jduYEhqLs9lym84mV+!={6$ zg?XS!SL$%-qgLS3Xt^Rj#pd12X@JSiE7qaeOs{FBPa9}b5w>t+<`=c6+>$gJVMI7l zC!u&~NF&2qIq?O}v1^?jJ|>*GIS8HBAi%Z8RCsBt43n%p`-b zp?L|hw%-dK&Apho zsjo!5Zd&c~Wa>2co0DbUXjIz_g(VWS%g5CZR5X8JNT98cPgb@RSP!+Ln#!*=B49B! z%x{%EeE~3WJabK@u|Tk~x`De*6>5Xt{RdCt--=6ZxkYfa757S8XqD(BCT*WD+SFIi z0t2&bk39A}eILNw$lK^8w%p9-oX+;=3vTyu=LRLC#uwQy)5eSB2u|iLZ*P2Rk9S$t zmpZQ%x&pkc39d<_7GIa#@5nk5q^Cbmy^!Cx5EFa_T1tpHaZ_$|bh6bfle#3Uhv`7$ zE~>?6TzeWr6eTR8GxHJAV<*BoC*)eD=4Qck^f3tqs7-cO-(7sCrv#j`T*jO}m9uHJ zkM6GG!^aj&U=apvR%1mjmNXYU3Y9zhu#}dS9ZjT(bi}afs-6p_gKL_Bnqfg@Rf1`^ zC`eyZxV+C?hF?d*qUN#?2pu6RIItIe+PjY?!tBYSZjfp=f}JLIu(7RV1+xCdNR8>L4F?e zE#=DZ_C#g60}Rm>u#_*6qN;8=ylBVSq4X8L=rKMZhxtFq+nCt}vk8y>T>WMkpmj1D zIb4!z|8>5yzQPB$)AI@BXx!HTuL8agQ>x54VWR#pv)Gt@i>T=s+;{VVp<7Q{-;i-b zDRN5kUj)B8ys=wsS1@ot>*vCI*cUCVUX2+Lrx-4+^wG|Yv4 z`XN(LVMwDx(*2&UX;p+a_A|<>RjF1t26fR@-sr2ruRL2fd3$XN);B(BbhtwB@iB;( z!QRNp$wW#{!aMxv3>}~omH1KXWjgUUtcVf1?5e8P(^i|Aj|OGl==<0m=7ug6ILa!G z9f9E~Kzoo0#FzmD5!JD;wC2*HdC!1&apzf?eW5=e`qWc&5(aV9x0E`(zcJuz~x75*F zJ5@12xWi+&;!~~Ku%E>GCF3#<&WB1?Fats+l;E!^Gj=%{%Lcil$-kx(stV` z%E9)x#Kn02GK?GVcd*WUuOG;^D!xa7vc5cqEJ^vg)EE1Z^qSn>2%4!PpVJu@Mf%$5 zdrsTnlZJA5`sUr7bEJGz%$jm~H~LZ(V*6o3GT>-r%3L>zj9o%LGY9*X@a2+z)*P=H zCcXzp>|-pvfU`iv=L}EGkkS{B;N8@vM-Q!jr6I=|_phKzR#%@vq9YR`ncK(ZX}X{= z!_Ku8ufsOl*#?{A4F09e6Xrzr;dC21zpIHL*m>FW`@0{0ITc&06JZ*Zgx3@3Ob8~dvsG&7e z(&v6P$9?9LaYAw)W_^mFaAb2|1Q9{aVMCw&?_0D6l_A-^}u=y4tNlm`>kD77z=S$$93Ya*LXm@$`mbgc~oux>82OludF}612qaH zNq~OG*g4V|?)QE|b$XwGG&zpZ>`>ETJLSZytQvo|kQuH@e$rBGIuJtrh=zIeq}{5D z0!pENbE=Z={gF~dRwMXCgTlg4fX}eKKt_i$c{|o4@v(v<0t{ai{(k@?LEOG?M1f3E zs~@XC`2NAGz2!X>46TB?E*h0@`sS-HB+Nzf-E)Q&$k{qUVHMPM|7*Q^V1uh*tlRszTA86QGtkVl|#8QD&j`4vvdda+Rl6+Nr z(qEf!##u6T+BqtMr!?9Z+($lm{~g((zg6vJ*zghNcL#zstdf;^RF3KAT{oS~!*>Ml zg30wo3qCZH+L#RRRq*+G*2F1tmfjEXx$9kubux7EqK`~4+o`9WVLlVugGar0Kb!h@ zN^GS`VtTb&LaQ*4W7D^l*!y3W;e-Cte*&|DIj0JBP3LWSI- z*Y<49#n7d0vd((X{+Lq~qSsPac}){Wd)tb^N(lD|ug7fBTb(azi8&N@GGj zGRS}bhd(t!Jw%3oJ@z-Z$N(#y>u$KY!H;tYu(j%AZx=@`z^}giy!nxCiA8w*Dis9B zjX$-4sJnB=4iiy%&bb$w_N_X+AOG}+2jvGpd_emV?)_G?|9pL4=RdNFzkEdi{o#58i!CzW#c7 zgUOZ&XPhY)UNloD+L|_w;PA1EZl9}Q+?43lrf~DMja{fO$S*Ks5FFzB2dTCH*I#}i z3m1IQK*WZ4dgayEnH3+_ws?d{Q=|Xk2bTB5AcUz^E50@nTK0Wf+_w~Y}LQVdNb0WqFO5Vq~ z@T2#2WzZK5B3-f42KNc9j4hfQ(Yaj z#An2xukBm%8pQcaXU;Y&A)2#4CSBgv$rnt_p_~gLeBxxYy2@S;qUo_(3V!as#0_g( z2)wVo@`CwZgV*}?A0U@$BzKywIIx%c^D9)(1J7%H(ZUaOrPngOwu|h$m=zk=TsKFf z_|rXJ_xHz2Jx9%?fle@41$jb{Bd9S!*V@+m@#PnvH3F}7-CFNs1p_7qv5L_ykeOrD z?_ZcC@}4M1zrI|y)T}VE>S@hKe2(34)2${_ygBuj>*T=;&;GZ8Ee;aR;=YQ=(WaEu z8o~bYq6KC$%-Vjit~9v#lFJ&L3)cJo9OcyHtD z?>)ML133w>V(6OdZZeVnzP7{aCwvBC0taJw{T$76p`XVP`|Sna;a}AW@(ml-Hu-y^ zegF3I{FaH?a@*uA6Dhl3V}ksBQ8yF4-gy6N<&G&?a?2zYKQ;Q)Uh00@cw85FAFuy) zVVa3-_4dX_;?kd9d|0LqE%Yg7+3WXyj=Fw2x0hQiM_rhBm^Q3sb^Xtq>6&b_UWoni zg-7H%6$#aBjDvo32j8*#T=g$Q?fr=F~%_#^d!2JP} zv)%>4W#?&~_|E2iU$<}T{XHj8h58Fd=F2^L&JNSn81@1?Ed45{pKnM)UH=ZQ?ML;# z@$?s|W)+9^&h2_%x#R3CN%orLTBVWXM>LuqD@_p1?ys!e8zYY{?55H6v2yFAEEWBI z)TP^CQtEhhtucK>>Ad5S#oX{uz|R?y)7`E8wyNb#D? zSiLV=GIZ4n`h_IE{tC8xbWxhFFlgHEP=EFCbrK)}PXZL`J$barUmZoLhkXsi5&Wq5 z!~gz95T$69#)NuAJ^u7(zgD3U)r`4=Gj{1mqsgh;}_{`nzelVD90Ai@^QhOyKT;_T!pQ}v5Ti231R|3ZSO{FN)e zRDm!^f4Gk|mNqz^H{W>G{Fv&hLJcC1Ea3^F@4N53DG?e?eV+CMOBbzze$0FGRms+f zr8z2|TTxX@KmWu;JbC{pw)Q*G$F5zwX(U}2myqrGo6A&v$&Ab0%bNpDsK@Gxd%pK0 zH%lB4qSIk}uwNq$aSkEp!SE3y&FTpI4_tiNeM2K&?LvJ_OpM(Br5*SZ>S0lF z%WZd=?NApAqV8dJ1Q8BnhDb+PZ^72eE@a{SheZJ_liH%#g?g)g+{Z8>dFaqV3DO8? z^dCZ)bx*-|h@ip>5X&A36A*XZeV^dk#u%XvoU4meq=pcQze7XAG@5&woHhAuw-^Z< zrvLuuF|#BZ+q7nh(fc#{eW{L-W&7kU)Pr?jW4#b*&Xd8q5&#o0zJz+*@9+A~_e@>r zCvus5ykvpos0EUBPGC9r#g|?#UG)A24k*5adhojau6x|8nsDq$e!b|U57esTu$$Lp zWrgzsQNt+M?wO|^H!Bfv-k`*4RO{_`e8*$;045I(?%%JLJ6U?KO_IKS`Y3mg+XPH$9unfRT1gjwWef|11Mob^9lVj<<`Ha%wxG*TU(8JAo-OZxWfZvqNX4^|%H`;t`_yFaLW5hLxd*$MVAL;$ebzj9j3mhlueJ3#y*QBdH1WO>Y z+kT9wv$YCrvBvA_!PvN16_$g|_W^6d7oWM_5$fm%tPwH60Rh`yaGY~)x=p{k4$}Ts z8ml6#3fQi8FR**SH31QRz<_~fr2=?ivI{Hh>?KY=r^e`H&%{Yn1m6d&g7XzNH(T_3 zMYv9;PMJF0i04+&$HE2g%hz9G@}_$e;wt6$vku90jc&JYH;BOBayZJ^=cMZU z!+VrTVzj4FzBwaGo?D(QpQx=4k|{!9Llp4uv@S%|+UweSI8t&-LRCz2)s^H`*A}&# zc~(U@dtFxlqQk3=?M+vmkid03dwj03%L!9~{OvV~^3RXE>Pm!$V!E|IL`|^xi3*~f&q;jl;B#pB$Wg{3 z5!)>L;xqI8*!~?K_XmaJw3;LT_SS)FB(B^KVPHtp3*C+T*dfGx$4v$ znOZk_W*5Wp9QO=F&*Q#<_OU_)uR~aWUaw17;h-*v`n~kOE48j^nAFp2(7P`5<5RuA zROvm*)TQ?hY=e6ngm%<5d%Q-$t4QBB#r53`6A+6x#mkF&?}I%~x$bLSkC&=l4cbP@ z)cew3KI-nV8YN2Yu+Xn`y?(FIdjnRl`05v|yFS%p#JzIzph6km)77uXmSBRz)i2Ws z{~-YqXcYn!>RSb4D2=e%HG53v^ z%@>pJeD^*TO8dFLG(ZG`$Y_Z+R^51nH$J?9A=IM4oA$9sA2EF~FWCOUkDr@wz0*S& zGhc+}zOEk2Uz@hA&9U@2SVex=QdsT&?x8=s#aOg~A4GU>+Vt~vDPnzOKB8hj(;r0m z(LU{*^UN17^lyVkcE7ITh7*V5wt_Az{_UA1T>LIROKj&sMaaL4RB>#By&py59;Z1&rT24U_2D{fa z`Vf&o*0qBPxO>0VP8)WeeI zwO3wLPkK+=oqqiXn8^}&g5o$3vHJKw|1J>ya7=Tw&qIfgFybHjIZr1J*REadA+%Wi zM_t!yB&9W$Sy@Nrng2fFwg9oVYpq9Ef+4C4W8p2-+uJxrKN~K*XofiteF^mt^bu8z zsAilKSZ#u(+};I#thea>8=@x83D|(F)m$Ux<@J$#*Xe2v>qjp3e|z2=^36A^d|qb| zKd-)aj`?wnZL_m8)t2f>x4?^uS@_{wKbR4{|A|g2A-987!otJU0%c|c@w}~sdbEp4 z8_RA5T#bmU!s+raJ~tw%od>pue?BG_@VfO`hS$OH_B+4p{!GC6_Ld6V$lu~!2e$9o zGu`llPd^GKG@t(O<7QIKUaxuc1pm2y&Mh)bg+{PP!GtV?VhE`A0^6E7H{NOlP@IP- z-a@^7`(C~KnkZ^m1Xu-PJH~bS^3Oe1IbotRR09Hvb-XR%8I~eg`C(1^A$R~eK79F? zL)^f3Ba0V=7(}pRvd&)c`4Xp}L&&G$%a#BW{ScH*o*dl~VmLn2ta~BqN=Z@g_(=Wy zQFZ2=^DdBq8aM#~d&O7FWut!Y@Xo`4@j`#Fs>pln;QJ2I2G<)3Y=l;*{SWS$-UTab z5Yca~2*}CFR-3rzHOJ3B?@e3%Z{(Y}QCIF5pRj@zKYfL)g+QX#NBK@vtt^B}t zvvu{(Se=N#q$bKbz1J_&^WNLj9_Rg)S6*jU*H{z1cA?(vtp6Zi0nS%kM_4U{^A9VZ zybD%sU91y6@cYO21Z$;*_qpM{U;F>NR{rn${l+Fn@vA?5Z~0(-f)V5V^&Ns6EGVo< z)OGu#;9B|VMHzDCX}M~RgVve%3(~jSDgE&uY2xvWk1&mLIThMMVE-8^!b7mf=i@e=lwGVA zI0p{wvo?|G=UyO_CQmgJy|~^tZQNj1+`yjGDrRCffVTI;b^?mz#inXt2jY*^4hbVjZP?}8OGw@l2^>%9IQ)c@F$ zuDZG-(Zk}Ydt!yTMsVFWXjXUsiLRJIguT74eQKwJx;|L%Sy!6YRjt>XRoD4yMRm_P znL7FBS}m|mC$JvXYjKHAhhT2t zQD^v(iZ2O~5s~tX-#p|N(;;{-(CATbanueLe%FXlz>gnnhsgqO0TW>h1d=3KGdp zAr@*3gNbs(7vDR-bFcpRcKPAM&v=cBewJus?Qa+AasL11kH0qw7_IlM$LZ&sFYv^L zy$38PUU}(R4>8}`uB{$%t>O5v>H54-v>;e_A5c zBZ?e(Be0sLs;XMAhkqDR$Jh0Zi4O>=h%$uulcz~7E#aVl|A9vIuqIKKe*UTcxcI1n zAZ73SSsHzG-g&zEMSm!v%$p0Lca{4(wr_i)&+S4zL><_A9XWj1-G6)i_`!A4Ew{TT z5wLm))-{#o73RKzRUIgZzC;wJJp$8S51zv^VS+}wx{{35$lw3^N0Zpnd%M>7yS0RR zEW3tP4wi*uq5?S_5H;=nS%N+zx(i|{qS+yu;TpBh39N3q``#b8g;98mW75=Gh2`s* zFS_VblRp4SKyeOY0v10|A-r7!5nua+f{0v*YKYqPRj!}oDJ-|8P;YM^`8p6ei_e$& zZ@ykPaZzU9#P4$?qk}aZyv7a^=*vKNzyv(!U>_y|{& zr9T@TtIiWiCW~W4gnxgHB1c)PpLbXp22tN%nWjJ&F7`%@fT1)!o?Z zts&Ig>$lkB^AX9`!5+tb$)%T@hV*t$1a?I2&w z^mETQ_Z3WL!1vxt@`z;iS6??r6VSWZ|37=@0UlM+z41eD0YYe@_t3l8l@5XhL=eP= zy?3#GDpu_6Q$PPU5EM~BnkcBK^xivCLQkWH(98e4vzg`YW_MEvmuz_Fd0;oY_s*U9 z-Lm(-bLKrr-aJn8LHG~s*t&2n#Jt~P1%ef#NRd#ocdK2-!@8>4PaM`nwy0~I`olW~EnDx^P4^fNYWTXNJT;=S z@o=}|+V!b*VE_Sjy*#d>j9siA?*TmVuS%_}c4}SEs31N@X9OUkH&iL8i6fDC_evdD zfXLSWrz+as^u68@1^=oF{P5RD`S{OrCSfdQ0yqm2%D$ij5|`>ALbC3U=XCag)1szl zOAL}EY9#Ps)5kX^RFqK*N|`8OXFYh|r7?IVm_(iU8@UHY=!}Q-`iNz7NVGfYs8Lfhc#Gdt z1ngkeCTvepFkszP?-`NA90fDEAii(W8L5FvTYZMXtaLnMp@frAkDLe3UA04f>647D z4H7HAtpjivxC>Sgb^my$IPbX)Kl!h9Kq%#~Lygy!BMKcib>kdG(Vsz+2jVl$Ik8R? zGH0fsu4i-*s*ifZqo6KaQ&1P8)n@^H`srjs@1A#g1u8d^#9X{)Xf?d?EjGD6zU-Y{qK{HG%9{`n&tfK zw|@r{>T%QZ%<}_G6cnP|ULEkfihrJ)ZA9=P*)AUP;4_G5*+7E`b{l8%HC%=IRu^1k zY&IZp<0ka2H(pNHo&^#0_vj1)2)RhExnSPhGy*%K&D*!{EKM{yqqSKI#s4>rESx!g zYMOx-r%)dsA1`0Pe?G<6ix~AbYTQgCEc=+q`>pzrK1iq0hZ0>wwI!q9AzBav1WnOL z6~041rfKw~M)}Xw>9O|s4Yi%D2=y2^dGhK1c>Tk%KVg-XprSy^{{1Fu6P6E%oP~e^ zI|}~?545R+MvY#2c{}qU10nqVcL$oN$WZOYcaJ{tv_70vFwyIYU^Hq?3{SfW(tx|w~ST|zyMiHCJ|gcWA7zp>u~9}`>5vEj7pu zzHhA7b6vZ3Gh#KwZCJg;s+YI_@42&Hi2HqS>L-;nFUMpZu$whwdcbS2Gol{H*~lM< zseR9q4E-jc-$13arU?=m2BLK9(;pjkS-MxrH+3=MiQ= zJJ9R^vp_cemmNZVv0@QM5Nmn<1yV|d^7PoxRFQtFie~;ZJDfs20#<$+K2(p{4QYA` zJ0aM*;aZoV#}2F&VM&7m!TpM^SDD`@9P8hy*uQe+vXI9;1}uB_>T6~dz*-U4Jp6t- z3ubjR)8Bs#=Ha&vwtEN^uq912z5ZsvUMuN@ogl}9xywr=zxwR|Wdua2)M z3pbsz@A7Z|O&9Gn(WRAC;77zag#C#DqiucHeCPVjM(E0?fwrU7>gBV)%gaWMriJJY z0Suob8g}TcGP2VVN$;!$wl)KGPyycah`fJNMe^UhUh*de5$lLFM_r$4T|+|DRa)zM zqsKO5Q-Qjk(&VZW)e}CwQeQ1)5ZQl0%@kvU0k3yN;-*(FuAMB1wryHPEmQX9mlwxW z_OS@D>z`LWMfz*BaLZ~31R~!DB&d3 zH%pDCw*zVrq~V($Ecr9~2Ro>aYW0Ha2MX+EAk-f?;w#iQsqBf=#{d*&lML3V^slG+ zdcB(pGVmYjdQ1lgE{pNh^{v+RRR-(AU>_`R>Xbhuu)BHtw`loR&!O~epq}Ww!(8_e z!9Q7Tfc~r3m*v|$_r$izjVm26*HR>>MjwaHijpri0d1hjd%F%_Nq_{-903aTXO6A6 zW(xIQ6y7&iUENKy&cjDO^v#QRg#d5hPmAb4|A$MbP>*D?gTMJajd&ZNI`2mr5$X|* zh=^({#^Yw{UiFxU07s$Ti!xJhdTGM9raBOVh;Z=z@V&P(B(CBZ!ax5Acx)V=%do7l z76ut-zY)i2BXIiMo zb}vNAMEGp0>7f?3nl1fAQqZZ)%C(z8jztRGk`LF@|$p}tRFO-!o~ z>KH`E%$o0pd?WF3J3`?x-(i+ZqsC3mZyNF~{5Wig;5^N)a>W%_>MVy#Ow=B%kdQkd zBLfKbdXMugn8@f9>XF9+NyanMXY>tGSM#sfSm!JqBUhhlI-bEyeHbpGY*DnuytdTjBQieQIHI%f(4jR(;J!%`au5 zQa9}^6tEkJxP8CR7PYC_W4zI)s*ndyYWP;CSKjNrSs;?>ZqTUiQpP%>q$X#5UL$y0 zsyLlicu!j+B3ogT1J8SSTEC(Z^EQbq#5+U-L+D0b{Z)8JGS*-P)*7#BU2U{3cv@qC zVwOoV8Eg&D=iSx1=6+>{#IW-;AtoY@7j5;lyQ#&@cHM#adZGD(xTeylSJ&maB!KXaq_>D94pyQ|9+3gvwi~~GL>j;TO9h$! z@2T7X!PYyQpTnxPW9P1#d!<^2n~@Qr9{0eoVM9c`f5Biea%~`L-e0Ik9+k^A-~~ZT zxW7Ri$T1SCT;1(Dxk#U%aLoxPp&r))*u41Xf(X@D|L<@;fW?ykjF@gnsI2v4Hq76v zJrU_k)eAl=<(g)mB(Rtb^AGCMb7_g@dPuL}`h|%1+te}#gLw;Li>e2HbcW9R{#WcU z=P%Zqw7i6w5riBX&T=JY>9mX2L4d{mq(?x1J`7wW2KSiUN58XY_cf6H`~CFK_b^iXk-N zCU>VMusot(&hW0Srrz0g>ckj93U!B*P>*)saAQ9o(Gp^u?IZjyixn&8?V}yAa6_mE zOGJ<&(H){N(~Dxn@+QgZtm)oJR75W$f*QxfMjad(_T9H>>AUvOswU5^G3QtCaz7021jHz%6o6WZlb!+zwjcjA9+^V0uS-^>(+)G zB*;p=SSLG$demp4*wq>e))N^yCSYrWWQ_+?2gRWnSiS0i8qGuLn&;yAH`s=?`lo2Y{??2=l4Qtzngo%jghPOKkY-(V;0?{~B zfgu03M$Wg_WU(lpt3?HpI$mC9pWLU>tw`v&bW0Jl{RJVS`L9#km-|v}UtlQ#fzDc8 zAUPzytDyoq>VhQV8zVPt2heb$w1)li5)v5zt z-ob2dPzQXxZ&0zmSRqY{?dO}{Emfd|*tuM1KfL*Cg^-p*&gCI4g4b$4aWTDiyZJq4 z??EuHqk$r}?A6&Xu=zs}7lM0`bQ-~3we*?;D^6T<&ZJP^SqH^o35lFHuzdD?{pxc~b*YcmGSM))5IkicmZpiqC>2-B~CLVa3Bt#vAX zXPu@8u>%o8h^7k_iR!EY)5&+K&>Bp{rBEN9LOmi-F4xFn+!$gXzdi8f)3S`Y_kl;% zlf9Zb#vmp@tlgwSmH!M399!^!ZrHG~iNFpgq26h8ggzqCUTo~ffag+gjjU~~wmg`z z;FeHt&)XOkLn~LUst+Y)Oe7(qdl6|5zg}b2qYo-5xCXrYwtD}ofPvCY6COe=gz&IO zZBk$<TrP9+ERTRh8uI)(a-h_>*thW9t77Q?6X zzaPD;0#O}}_`FgDI`~_kFl~h;OhyW3AAl9C4$hS5;uPwK4*psbm8}dod*yt!uIkkJ zN+Wg!N+#>yAJ{`wQ9HA!s4^zftAOT@KyqOm6PS%+MSL*%_yf%c61Uw{0sr()S9CRl zKll#$7U1`qkpf<@U^<|YtVq7vQwNM;Sz>2G4O2Ua^djmX)Wp+>m_^CRKF>(I(p$#q zQ9oWiY8Nb+YmT4v*2DK#z@Hz&pfbg*5+okpp^3HAEAWp;bRMo3>({A&ymC&DO?q`Y zzlR9Wrfo;#-HZJK>znLKPI@{*eRH)d!0`n?VOa9~qIo3jvFB`mp!cv9!0`o3H2XV) znF)yM#x)P$|2%TI@yd739I|ymOg*pFg=Sx6MyQ{te#CP%hd`hiUbb%MD=bp*dy9M# zxNb~Pn}qEeA)b*EsE-+0FRRO(j!=(07w9X_ZwS=mMvsyuOBQ+uf}L%`H5dbc7$`ZD zLVc_AFI2lN^{-bOCmaJ9pt4@l&h}*GJ*+Ld_qblFR;zAS|7-Fj_uDqrRJ@llrE^Z~ft6)j~$0!)qQ<=oi)Y2=$NtP{kx}^iLq`&*nOa z=&6D{EFoZ*12OLojcmQ`(j+ObNfno>@Qi_i1wq7hwDrxNTQpIu$J*xo-#tlO_Z;vH zD%`G-z_)8%NYDriAJi30s7GA`b%5gPRLh+Y)vn|FS*2ySCbvzmyrpeGLRiE}y)?F> zj8xBe|L9@=IuOYViysJtddV=p_G1^75`F7eVBfRVn{f77_09iT2SSdgCg|;VNs@_p zuAou*E4CGpfe`A0%mP3kU+KP8dbIS|I@)#DchGdo~6llJ&e zyJp%?)JI?a>2cjad1FEa89Y5>byZ6Bn#XyMfGBhpALAU^^tV;RNdvW*hfQ573Mpma#pOzB5Z|}VOeiJE+ZwJ0M zKqFpvr(G}$pX79*9=@-qP@*g?N%3Vw+RE9jpl(@epW5gYsDJ9&7tI4d`T#L{$>K$FOvRu;<(~TpJ?zB%aUu467PNCi;hgJX3{riIt2;6q(y(V%KGXxNk zIdt$>X5iu`wMw!!6rcU~L-p<76ta)m(DV#fapzqRNR3*x%(WVJW3ZxedT-l`uDtqM zfe3{N)j&c$j)|VV``gLo}Kn|i``|2!` zs8kz~j9w?4_1pKbIKki`#5r7xzxdpf^f*|%@VkZC8g|=m3H5z$ywwaOn&>ut@Sinf zYK8|fVY`CpIQU%S9KvAUdX4T2H8757-`n+Atz5aPK?Pf?DSuDS&}#IO@nCra`=3;*Z`)xQKp&pTrNL(MSzt1S&e)FZQUArnIuR!gzpJAX2 zgHmYs#NWot+}RM+Q|#A1udpY9-4OP3dO|%s$(!n|A>?#H62j@~X&)+~vU5X-tcJ&Z zCG9K9ci#?@RjZa|xsT4ev-|z&2=)DLzuOEpS+NO%8ElpUmFs%Kdas4K_c@b7Jw$ZO zCb5Hk%ei%Hm*U!ECRMW(I|K2rp~&I7t_Gyd%850aCP)F0wim- z{Y5k?L~#rTK-`|ELi}4QFfUfS7$k$dyG?>rRht(G`2ByXY?3&~Vx(6H!*_^iMN(SSg+#Nkg$Y#Glj;?J!v&}6!ob1!#esx#+Y8TY$s)&O zpeE8qU*OLVU;9wjGj?qxeuW5nc}%ikVBvX95F5yr2SVb2?%Snpy?v5$NUd#jxnCVg zE_K>1wrAAGGMc18xT%nBj?LnQmtI#UF>DE8{{KTyT>k$Nmv0R z0$%;Nu3%sc?RsZov<#n{al1a}Hu;_eNFaL%P^ixyjv;HIP@fi0!9oS)#Q_6Nv>v|2 zROF0A)g!turfz)`v9?*GqXP*lIbEoSxQb{!+{oDi(F8Uan3f%=PjWotH)RBNeJ7=2;TVOObhjh#D&-e(Hx@f z7)|sWDxvPvI43m15Czs8OP4G%`>|}<@^Y67UGUaK*}i?N3XNZc^qY4^0%IKvR$=-- z1di-3PN5!k4^iPA17i>o{Y!HdPp;I+M%XQ(%$hkvBb6q|5uFL~$YW2Ngk$)8lg@}3 zrUPW@S@l5dhXo6^1$z&B+@p@{EPeXklIn3@z=-s}Y4onYAc%A4ZXF21;3KYUfrNTY z1xJ!)M9i;Tv0Nbfhw9^_k3a1dOFfAzJp%*<3KozDA9})TC4%#M_zy$OEUQrc2Co`5 zYncaCc%dVjHAWvquhj@tT#r%KuU{vl)XzMS{SEAK?z;CuouyM<#Tw7G+byBq=@-9f z;XFNme=&)81N9e!tOZr1gRKXCS1@38bH6(!S|8F;;?$oW#}@`lf)xx#G*&-r)P?fn z4?{H>>ryiq8f=}+evV@XHbNM9L4l}<#M_~K>g(!nf7h$KOF2yvYos0%;1;Uj_%iG0p@Hah%$PyB=e~zbQeM3OY4~^M+z4bBgPa<$ z8$yC~l=Osp9JkF{v@~`GxL!`uV*=5VfeHq)u`kgkTnFUn=SO_O1JgXFJvaOO-3^$^f+ zQp+uCjRA`qBz|3|)@8v8W?gkw%dbj0aE2t1|NQlb&ZP20jry+>9bHi%79#Pje_1eZ zjv2TPcAWSx9}a&bG8~B&YpC!$d%X(izg5s^^x$64waOjRDD6{1Jv`bG)x9)`KQyAc z2XxzNBFPIEP_PE^D74A{0>ArkOZALJdP*m-6 zP%t=vq_?p6$;k!xIGFW^5-N94wQALMR{7Q5Yw(#A>hT*3%RpS`P_}DO*u)9r1J2~Z zEYvIYH}*o!AA{>XO1KF1MfH3@lH}`Kd4&48dVGGUg7n;tr;b0{dy^_S5+wUon9iRUqAop`TGdD~bzx@BKdaL}cTsJX zD34IzwTb7x$0NE&2W?CKyeH*>_VGH4B}u>s<^NRJ|G$6ArI|T!K}}D)&etTUkr6LO6u?@sL4Z z$sV1xVFyAW{&wipMOvuU0S16<2`8cc(I=iUKFqd{-+lXy>~ch}7gsOz4jnt22s>CW z*m90{QKqj!=*7wQk#9lVP_p_Dc90iT5CcBgcvVv5G++c#gMFi!Pgs zW8{y+Wa-jHW-#d1+Yr@V-yAnM-+xv?eADJrgT}=oikrmS5O?e#9=4gDP~T3k>+sT# z(De_gRUBsLzz5m35647Iy?UAu@N%iHqAi4a2uHJL%`kxum$hzd>=5j%6?m4TkMM4{ zb)X$6=p)((8#4TE;v7OghsBE)1iWAKtd%|gpN>#}UU#wouoy&XeUD9^ zy>Y{OwPPA>?tN{0{a?FjQdu02@T9f{(e%T<)9ao_)90r0q$WtbK_k&is^9vzGfKv@zhbtWa}Hx@03o-d`m%Tf2SsTg;)RID#F1sXT^5Uwcfd$|NDD&)&Oj4(3g>#1K@KN z`eKvPChWcI@&se)QLe->V>|N6U#C3yQ78KN`n6jH32hPGi-JDx+@Ih4!|VlY1NjD= zWr=$BV-RNUhR~v`bDgvC9)qp;t;RD2YzZg+I$j64mw4}8@EeTl=tX+%#=VIxXHuxg zHXzi)lE)6d<98DRJf55EZ*7#e2i83Z>~TI5g^N&+em>usr`G>$8qgJGLm+Bi#I z6|ftsI1f?3V}pI>m^+|(Dqur1d`{XZ@;>M9lzTOQ1kRfYnp@&iJ+6_!IV%M-XYSMU zsj|+(`Bev=K2=MnKuMW{)&00e$0K1bu1V-42Cv{Z@1MJ&nnvH>qvtwoa_pcUtbk10 zbwI+u^wQZb81zIE=!u%d8qxaxb^5Qvze#`u&MW~6^=Fo^sXaFe^?0y>Ed{3HqC`eU zs*vLm0U%JpPZ|Z$Tl447)9K#Ry$?s`3;hodPlztJ59#4f3hJWu9 zg$j!eL?M}oF?5s7v0{g0UMj%uHGY~89+ zkK=pnPT>i{Ux^Z)#Gi;bMP#Xy-9Z%? zmoHzY`*Vi(<}NF347JV!4?kh1WPLbzzw=|L;?cM&95( z&LAFQV8?mGiFzOgl`Ih{Wy+TIsl&Dj56TcL5aIUMpTC=ZiUe>N6o9CK;|kk@RS^c4 zFl`;t%=iw1YYk0KTPiBbTQ?#xG5s9V?gRM}+wErM74`*~*6KW-(8oR6#}euE5uy{s zuD>V$q2iw>f(z}(`Q~JXV*(a7;0-oNfMC_5s#Pn^F<~uH{DpcfhixFTeY1-2 zI42=~#>CVY2#a=md-v>?&(w$B>Cuks1da(Ct&O_yU;)8?`}Qs7d?{BxTBC*P`uN>L zp#1E=@0(-Cc?@Iy(=G58t*^5Ns@16J!`{{lKKoPln`5Pz@^c=mSmwJ_p%}i&DCpxo z_djf`M(na+y=zN^A609kq@*b!?fH^}j)CXM%ls{CL_(e!EOoUvWLW z;ig-?QRk=!wmpdGgt&!kpG{J1w}F9(xVSi-UOnAddm(YNzfg~548(i7x+4hbLIo4 zgWr719p-vqm%;vnkA2F4{VMK9m;n*H9lH!(;YW_>v`K1dg2bTNeVo~C;T-9G!%aHy zSk8Qe>&Qm61q0_&kx_asVITNDcwyQ-&TY(oK>uO8RI{ch2`(zZITWkhw{7#x#z5V* zG;$ZhFRpPY7!>&CtN$7A_%qcvh^a_+Yp((Dg@;vEydFO|o?$aou3WVDctE?b3Mg$oxo!e{lGHBCLRS;9R7>cqap@0kCL6Z{TL)WIF>H~)fteM`SP&9%@TJ6M0y zrdW-Z->i}3hqV4kGdNX7#a6qFt;ftjShmD$)0sTfe!p9f8=OBFc!5}Jk9GS!Ua`HM zI}`O9u+G@p_|Niybqefna2-VfhfSL{8tbjdlBLY`vXI^jrS3|z%-q>C<*&bfH^(jd z2=?{rH}tk2*P~6bo6IqRXn8QKuD@sKquoEIBK>bf>R<#c=d!z8q=Hg&^_B;pJlanD zwpvEG9{B%`9@OI$_JOPQcgPtr-=Sj{Gf3wg0KvWK?p;Y{P!#N~aOLa+I3VgAqB!o! zFdOU=9T-G{^3r-dVh{x91AfPrELtG*=gl#Ls<>8Q5Ec1uock4ZEmK>kIXXy!;||5? zpO3#$AFe0y@jJ}Sl}NqLkBs(l}$SfnIxzX@epMjQTSAV$hgIkMpRp$=qpe+tC}Lusx3x~Y6pDIH`_+M zLQq4o=OZHWKi5Q!*q*Z>()^jO+oh#O?%HLY-{ZZ1T_aJK+I%>L^R7B@&_l&=_}x3} zDO>!gNg|6$VTX_Ak%Z&|0)f&NeD;G5TufRXX(Dc~XtY-c4tATqK|n`cd)31m(efYu z5$%nt@2DQw-F5JzrCJb`*1-fUm!kE;hyEiS3_w(~ZFiH(2jpo@h>6HuXWMKW@M@Q} z-@~5he=0_9@MG^>Cnvnez-a3>?Tpo&Z4Z8faScEo9$XjfV6*)mulPOQy=RxX7n(J5 zy2&BYQlGK$%m{lpT>o(X<97fSahO?ydwmH1couJ_&jDBt0V^o5+ra=ct~q#~!C)(9 z4K-}k#C(tcP#^A-Q&N&O!EHeemMNa*I*;Y{@87TYbK7NxUJKW*S$*2isHpQy6`Vhh zt9{GGsW~XHogF%BV~NfJ`8U3h85}|)V zy~ot&&WNK@s@QSCd9zq33a^?LJYr+8B@{zifA7p%C}CloRRdG(?XnOQApvn~IuE-oMIpn#n{ zgghO+wOzGR`&e4r6s6}b`Uu;qB+Uikv;;#Re_v5je$sZu@Ad7Y-3DJtfCRFa0EPPO zT?sNiAe488^br9>&LRF|DRIYuTtP5K7HqFdR#cwNT%Hm;raoD;k@|Bo`zmGfB zwClP7VHTftU;dLRp}n(dVd$0BmQW<>RU*24rdHEAh_&6L;99s`hsytfG}roNd1$w2 z)c&JiHdNe?TJ*$9ukCdOvLxwBWc!;9C&GF@R0edx!)nOc$Lk+HDHgbUN{jE_9y=X1 zz)Y&2&i4u82))l>69q`OGS~YP41~H5bO$gn&L!W0R0vqiLn2D1RRyK=b+{1yAkqN} zM-;f$QUzK)(-UM2X5HANT4Z|OAVu;#L^-vV1_y!4TyjB>KXr1%SL%`OZkhC!yqrqP z5eM8xvDE0ugR`lNO$A+lX?yy+@N-M%<pvivJcUbr)ox zy97Y|;-k*h=mX!;K5D)Z?aQ>QJZ4S{PfHh>NaK~Rh%5@Lqj7Z<)k@jJ-**TM={7osegSJP=bM|NcIG!deIy#o5XV(mx}uymyr`xKtAs$w z>Qzv_n>o#W?=6w@wi0eiF`Mfp6LwUincL_fZ> z&@5@0HO>i7wa`)J>o0hf+o2+v$iHjjdM1=abDo;N#;Se4*6f){WIVX{h-(Y~nQI*E zh2@MsOia6j%tAPmN%@;Q&(-0w-H2U9noX**cdgx`*PpTFQEPtJI$I@SnLWNGr^P(7 zIsoV_%Lb$QJrqKnp|cmu z#R>!5R0twRVT-dkeu4L^49aeTt+Da5GH%24=V9ojr;80K5)Bn+z88n<3f?w_d7>S% zZZLyR+uufUZYum)kKDl(yY_8#UVz_XsVHa`nKswtBS%`=7t=oHu`K75>U`M@D|ACw z7VXO|Jm-LTKOze^()o3>0bI*WvxeNjZcMqc_x-h8=;io=2d~UAI|Lxp58zNXs>*O9SZMedGNai&?ejmVDem%{Apu4ppb~-m3*FcAuB}kQYeik zgfq!BqGab-z>qfla);(!FirekXZqd8Ci8w5LTVK+;$Ex~qiYccX)am;Y5_N05kDtW z+pQ;g`pe6}9Z{JXsCL#Jqcpw6nszr4&ae2AS=2DHB`2XI)dwi?@e-%^&D0O2_w*f- zzJZyqwG+{l6{nr z9=V6TM7(?beO2;JZ)ize4tD*~z8|3$Rv>t8?)}NxKNd4?w9eaoqk$4v}|9edqRd)2}pb0RB{(JSFnrG@U zg(=T(eJvgyiGtwtQ6`L0D2iKyMjexyw@+%-wEZRF9A_^QUb;1+u4G!(5)?!}`21BQ zjpi+N*~EuT9#Pf)xH3)L>#;QFfXM4e9O|j!Zc%7c8vbS4sRn)_yY7sA8SYelGl(qJEjVNOY?r`` z#+Hyyy-FO7LL-s!u@q4$M~}e6_YqXV-t?}2g!OV6%TMVWWg20)_3sa(L@2`SKOGtP zq-UBtt-W>gBRFGF8)W!amsKaB8LJ+WLHFXINV`iCna+v#!KZUY4k+|HcdnA`I1h8b zJ&|hL%cG9hav}sO+BJT#&SJD@U2V*8+NOp|Ka$n;Urk0Rf_yFz*9Onc;}{y0{y7E>ut5IChraj&J@F&;JJVLV3eUfuCFyW3f2Bu%-OdIVwds%gRMI1Y>oTIPs zuBEJMOnD70>iKKbF83WUcAIuvM8^fi%)#)!y31y-C-h?$AYD}Ogq?@(jQrl9>eHTB zu2HydQqjlPeNksswtbjX_t_N|wI{^7UJffQdRD|*KkZDNxW644Vn2LoG#%T+v$>+T zgt=*VQ`K4`P+mt3go{OV&l?H)TfJT6z3I%$A$OcXnjsU8xxT4L%j=9u!y>NS7S(Ye zW}tJIX|gKdFz_In2`fzQ-%oS|+m$D*sFv!w2g`W$jxKbHtxNQ1&bO6ol||u-F0E=| z*hq{n9)y}`SD0McZ1K}|UE3xF+Qbb}daY>N7>F(~sQDWb4EJ2oX`*TCB+Wr(;vEjW zJ0}4=u!evF&49M2y|jnF!*e+zY%%Ft5L2P+tJO@;%jlWDS`NG4Ms*8%IB&n1kl3d^ zIyp0I&Ct)7e9vona>-17V%=m#hW?a6_^Hprn*xR>@CtSM8MQ7v!m7~!OJ|nuhX%bW zbuOva0%n63c}D1(>9fhg)JC=HRqzC+@_>_a`9wtK!yp4eVE`c7Lq;y?d$Q>_SWb%h z)?;ct_!)dotux!BmX+z|V)#8X66uX-{ALECIOXUU_VtKiZBgEdBnz{QIB zi=l+NuENES7em|YP8H$qKa2LCWcJ3gU1~nMa^@cD6f|H&TL3(i9Jt0{c)sYnXUeSf zCME6jmAJ>~OQhKMDA4WN#K*xRDH%6#ixvmdSj-YfL{tcs=iyN9% z(jLa!oq;fw4oJC!EgV#b;G@KjgJ_J^*pyi`%gw0*@RG4x=?pO>(PDxRMk*(1=6ik6 zkK!pr7y$L?gy)0@+#_u+$+iRL&v4SJQpD9q_x2QWEF@5ROzUg7r(BgNgg(CRh2{mW zBl|Kuc!&k97KXmNIi4@%B~IT6x4;PP)OrI?PPgS;(dCWA`TECm%pqDEhG)b;sr2J< zDO!eRVlO~U^rtGOz$S%+N+d%zEC@a>3C1ka0d>44)i}+EHi62y6-|8+GV$kMb`!C3 z-*dJuVI>fUqQ2$rqJHdsOKm1?%2xhsiBZaeB6l5Ijfy*fCdX2?^JmeyK8Gc=t7e#r zAf4Y)*guvRob_;fk-moKi;YZvBM+M7-}bE1wvnlc9t^Y)!jN%<9(T zHQQVBLe0Uf+{?3tVqFkN4Xc5?s@U5`=|%d6Tuny$-Je;khPitA@Q*Xd-9miHm2usy z;^uic(XvONw2iP#{%}MjU){qE>T<(I`)D5UcGgF>aJYD@@KOOW)G43Q9bJp<JkbcQs#a^ea)QC@tVy+)gZq#yzK!=}PG55N4sK6Y$D>UNVl_t)<7(NbN z58#b8AWPX0|HHVwj|N`8G^0s=`@BfDybNKd?^zEG2I0J3E!k0tjs1t~4)Dh11w7{b zGQgy@hz^Dy)#FYex#j@z1ymlnVM8>fzHc&SbkxdZ(fhcM^~fnd>WU}^92Or!sSFAg z2~>?Nh)bM07W=l`AXj5YdFG3z`Gs5U#ib-6T{QeXVtkn7_gFR^f8 zz&H(gXgN&gQ*!E(W9Oihp7|nA5mN_rAn2Pmj+D$lSu1@JMD3!&&Y1=Jk~|I8Rm@@a z6r&5Ya2Uk8N`@tBr%`jFMOS!}rE#NP%1XYkW^L*7*(8nPJwI_HG*n9tq{q)x`SM-|oZ&%b#(sb-*$eVawH;zzB4}jz!M< zl|CcZ`Y8bVY1SsD@XZ6wrn$eRnsoh{rFH12el<5$DBE3T_2I;uElqdv|4qi8JU;UB57N@RwTHWB%Q^ z={-GgxeKV=x?0Zrc+N6}NtDtd+&P-H~oc&h|q7Wwj6m z+qIZ5u}un!Duc;8_yxB6 zbv@kp?(7Tdnj$ytfIK#CLZ$RLFm}n%E%V}8=4=1%kk!>J_h&o$X8+lali!t}vuMg4^v!U4@JW9nN?sB4 z90s(Q8C0kTRI=Xk^j}d(^i=-CZaR!Pc!zD0`^w*J@uBwDQB>4#b)f(HoL!w^?<$^J zlo9Rhti}_P^X)oPk%%LyFD&ev`)SNir1M=tX120Ix#18q-7F`X6qqk zr-KNa^dY(2u=>@td#v#P^3Dx@{o+fbwLG(Cefrk0$vbR^EDk1hk4Pic^O@2mDW=iw zWr^=1yC>ugvH#>9xqkG=Tx`K&GU~2&Fvo!LZ&BsX))NCn<5BXyj^|F@F=htW08TOg z_}TyC&5$$_V4>6lP_iKi@BhnZ|L2tsyzlwrcSr02*a8yMxc-X;X)2K3TuRe&_GKxv^yy~>n!q22CBU;pu!z$YU% zMPd&0=8g(J78V6|rxoM8d{(*WuP+MUZS>Rx2G$%cH)}N5FETKrTq(w+RBY`fwbgdZwKq=AIZ3S44p*dC!<}~8!$r!~@P{C+vWC9B$5P$unj|&@6?CHWs`&W$ zMEAqFp|8?0TQ_GG4XolO-G^UC7Zv)^2@9p(7d-#vqpq%wd0&w!e3Z#+N6Yj%_X~9g zwS5PMK56H_-Q&ToVSnvgw}8nmKlAuwaPlnaa&TZ zJq$v>_@($UJ9$F4`^$Fe(z5lV&d;vh+4Az|FwfBUgI5kRQ64~x!Fr7ic9N9V0+pQG zG=yY=9#tQWTJ;YFHy-9^+%GCT(^_bvtO_vi7Bz^aoS%NxdYag*KD4=!RvOoot!>gAsU2n|p9Q|K(*`NI3e7`q z75+6a{Zo+IMgJ?D?0+Oah)I1(J1N9R(~DsLvH%!$YGGgmhz3{Bu*gTT_*Pkv(Vw5{ z9q$454(EN&1X_@b@JCL+d0f2~1_w8ogXeOhOu<^K6Nm!bLiZ{4OGv=xkVlxbEldam7nyW*@UK3U^?5Wby^KEK`)-AZd%>U_?w zse94^p)Gk=tsa3wZ%_Fs;op9TH4cYniS}0U6qw}2f1#%mCzxF>> z+G1$*DH7zJ4&n78shu{idNe*~)gJTXb00C`;+&;oqN9_@@w!7cTBCnXkM9rIdH~w@ z7I6SKGpK2$#FZEjr5=3|`1nwSJ%iN^Kp95H-PECIs=^m}I;XiJ4xb))yuVVsTOu^j zuM;wQq5~R@a(2(O*wB#EbeF;Q!uKt=2J)zYf&?^qkrD0Kn8THj--sJ3Z4a z1v1wUPJ|0|)h3;TkeO%54IkqF>9GE1+r1#9FyOdB5qHErU@HQz`K^)jz|K&d$TJDO zW`UNyo`73R4=au8-7#_c`Q&?ol2zmW)hkM&HE~QT5&L4FB$jASL&uPs#7h= zoCN)mg0ssfpzf4>ydI8R4Gvp$KRCEx(^D0Wx*}`$!nA4?|I28rw%@0~5N3%Q*jdI6 zq|+IU=VKOABcGTZaCXb2P7?@!I~fFSS3B2ueAHl6&cc1y*U-A>166mL`z^#x0>|ms zg`w(;e959!Is(uq%nw4{F~Uv?`oe;Ee(2$8(u7z{mPW1A3M!%PZ-*?}Gg1r5HtY_quhaKs@JScfhIuBE<(4&(G; zEd9~n=FxKyAJ;iemOr;^?EdEh;$QFZTb;j>t;t*rV0Ka`$9IE}eun-l43K9&lWC>5 zeWZeFMZW7aBIpJ{PG9_dwZp2Z>YSaZF41*47c%Qc%?j;thWGVzf=~CCk_&CjbErL0 z*3_p5nT)06hZ0Jw6?1RT(41x7$;{k#wEKRT%vq`Nb}eUsED^tx8)zv$EYx}CQ{ne( z&Ry(qF;O4PSYhY%v*jJNLiE>!U)37KHoxkc`M6dtl-HjC;7P`EJgrCq#+-ZiW9IV@ zAk&!c5H|^|l>Z1uqMYyQLc@onA6YRe29?#~IJRx`f}WmoJD-X|nipq~96#OGDa@As zD%Vqlbd97wT}Rt5SFPGpx8($$X=QVM9FajeBEa8lKe|3SJ6+5hw(e&C5=Cu(@$l*2 zMgbR|ze4h=t8#JV;O!Ek3G~w#A*+`5XyTxM*c~vT|22lgVY7Z@c*K#UY*=o0EN7pv zY^ecKoO58*_B*gxVDq;JYTnI8G!E@*=lhPzVSR8&kh_tKp56X0C>dzzxU)hGP`!fY zbcgaO&j_Rh9&hi)HBng`-7mx-u71fokcM!~c<%eu8@lLaD%B6p*_Z^9Ue}K0@bn6j zOt(1r_O6ODR~fC|l7VVbib~n==TQ{W4h>Tve=mXlHKzT^z}F1{kM-5?cBStk74O#a zt*C8sY%LOJjn?bH)$VnU)5eQ+hwIArwxT#!0(ZN)?^m<*;E}J!z&sK=liAxAI5ar0t;`mbyz2&o*50vbm6(4WAmUK#@%l}F%lfrJ-^s%saVbn$_1pXE2CU#i7W0EE z&>=t}fS$z#zDpd}{zZz6JF#*2RCsscv~s}uap`!uTw4rE{)S5lI2vKOxA8tpshsY} z=T(i+^?HTb1DD;EYw}FW!0(SWqf2r>SSz_g5z>@jUoL_C7LUpYpI`~SvhQ~%7!uQX z)BKeI#xCYPK;w$}5Dy=!elUzf?OP=Ve-AeC?>=;gbh14v|G#BPHt0~BaG#qwNx23p zD544ZH@x4iwQYRpWyJRmo~w38h8=gmYroI|Mw-TSI-Zd4OA}5F*N=jTFVtW&6{oQ+ zcPq~Ecr~4m=Ya@;_omwjGqV+uV40mzPoC(?yWdMK#xunp3|Z2^B)X|yhrN8)p1FmaelQ}oGm)sM$?2_WTGJ2ks(D;ojX5r8{y@g7ru9m#9E*g34R z)5&Wb-|1C)&?z>hZQgEZjYSo`$>d<*_cr-iZ;&0Bu%T6DDqcG_NZr9I*x-cK?7%SJ zuAR7`t;vgf4K6okmJ4b%0%N>4c<#3Ok6z2a6qkRkdY6}fZC#Q-x8=_7_F^~&@tF_u ziThJ!GB9qlJDF=@{)UvL&ni=nsI|&0pV6f^t})||h%JkQKJZRldPO5z7v_1v3hK-s z))Y2B`_gSf%1Xw1=X1~^eaJ!sXrX*jqmKx$v+~}qZ!9z|-4h0$?1$NrZDaV`53mXJ z-?_y`W4xlRBukZ+{SoQV!cKL7G;5Z4t@(geSQIC99B>> z!8nx31S$cv5jb>x`uJ@oIi*R$zDkYFN$bCu&hgH?aibsSQAJ;|rs5 zrfW(gG$nCVzcJBr+`tC~P2}m4exZ$j4pZ*Ulz2o= z``w;r4yr#YBwq#_$J%DP$(eh9p%r9t`r9Zs_}Q+$^PkKw7vogZXIL)3gARlE-k%oCJbqGT4P+Aaq_<`rdB?m+coy; zXXSNTXp?`uy~ojOHgB$W^%Y){#E%0$YR2@t_RiO#*{K9Gj1tM`8}Sl{gM0F=5W z8b_=12MgTNYt)&Fa*|%^{fb)g;BTYL6A*EXj4r+c?gb1e(cX_|Xw~q0Regf$-`(z zS)*t&z)~F0;oq zAH*oC#j^&a+5Ab@xM9WgbP5F$R>y4nJ(O|9#}GnzrPj#SshUMIUG#Wd3pw)i`(KUi zf6abqftDANci8L6K-t`-uX&<1-^H}@zc9HR!m7X@g22Fe@i&^biW~}u1?S- zGWEot3z;hodOZHdQRueMTib7wx?v7nzQy~GrvBF6d1q6D85OfE9uK!uR#&0s!a8K>0^aXWZ?=}7A zN~6g%eEdpXhjYk=@4rjFs~G;=r4^zR3E@0YZotV4X0^QcWcv5lOrx0q4wHAB$by-w zW;UBrqVf1Oy7M!i#1TMHW8EI{{hBF}mi;;)78vduXZ_UxjAtymH%Xuu-VH1X9I?(t zuQZ8Us^rqKzEPk~Se^(Ox|gL6T%7+crX=EVR2+To$-e2=>C(?-!BK1Azv}Q?=f1t< zu=+V?vjtq?V9fbKR6dvTaZ((wqACM-E5J%gt&Qe` znLs2+@HhsY`pgM-a5;4cXxNvJWpHXO{D3A7nvMd5K%2S7HgsZke9Z@wdYABtVv>Hkp@%BYXAT*OTq!3Nt>7R z0w~1&>l|Tjl_WN`z)@$*70Kmn2oYr-jtKZeJLG$E9*7l=H63+|vHrrS?TE<0^?Xg()V${oDU8%l)s$I`ZwPcB(m+ zfZWK4=(etTIflX3e{Avtctp6^Y97$)owfYR6e!ML=iHGcw?N6ReBHpUTG67c;`1~T z?DTSGw=27c@jv|jFJjohq#=Moh#!*w9{?MF(31blTl@cwmi#vW^177}p7%NH#Ant+aiJmF-Z!1Bd=H~w!*oRc%WcYsoQ$yqa z8~gtMKqvU}0RgD@Q%9HT5&`v(;hpj7b1-!x12Z${DAZXRU}9v6)0DcAHUkpHFNz$6 zqhpq6|L9rRuQl*kz4=^$>Wh$2n77pv!=7-5MV7u6TN0?60?hJ7_;=3#EhjbjlTM1| z077&_+at-TWuSf9e#MkGCIFx=!3g6Op94BpOsY9btr8>w_&^1t<9W!OP^cge{9FkK z$lw{)0{L{Wj+a;$r(Pc=J0*^$urUF2u9IW>tIgay(@vjl7yf{UCP>di3{s8UH|wc9 zm)Tjcf?L1BS3W1>T>X#jX}nM;y#}{x3SpPNUBO2@V$%TGHF; z*YXNVLUx^4?&d!$M+@I?mDt_lIe?4tdSB4eK9<+Bwq3CskYgjY7<$Lm2|Uqt^ALmQ zK%F;Aa}~f}D~sAW^udgd1>6fgj!Bq}ipq_d=n74{LtHLT&7x!C6ZN=%jD9{g*zSua zu&Rh#evMXVv()|2@u$Cr+N#ER%7%~M(dHC{Im!8HSNJXcu+!htH zSS9>}5s+U92aU{>^*xPQ@ zhf_InCpj+xo6ez;#P?P&UZ&4$D5zF6}JIa*|3?v z+y~m=BbtwA{i*VU6GnwmpJanaI-e@1>;~U0;~5Dy*r)uCZk@{abHrshMHtJT-o8|Sn>M?)vk z->hg&D&M9Fb!_`C3N3N5$p`)K^1?5;{nv6=up-~Cbx1Om=vTBn4%~@wEI1smwkrxth*=1qdp+L79bz1BQ1U%Gi=;q<2O?K&b`(~FN zic;;0h;rk000_vW_w|5?)Wfa)$=Stt0WM8$-0M)SuH+dXuj3!O2P z?woet_X}U8fBjL>?-AL~?c9o&Cx{hWDR$NX#(&4vzlp&^1e%qLL0YY!mw!RnA&8)3 zYZZb6gGL7qN&ycwyx#?F_d8`Zflne!Gj1m2Z|oTWngN6Kr{`zvih$U1h*M3pSe>zn zV>`@|xlqFnkq{jkTpYG$g^SPrOPq8Uiq!sgNy2|n#b`TEk^KUlBIQ-Mk0RZ5M-KP^ zVgF}I%*j0}>BIQb@Br4KOW5hp^R^49=RG%`hDIP}NT73MF2Mj31CFZAq z@F*Wj)DQBC-_*BReznVTl&BZ#FLF@kn!?>inyro8xjzYrY#ZQzOcgUAROhr{%ky%s z-Pq{GRTEuXk-2eTYmt!7W?NVplRLW~*_{M{RxZmK)f)Q+{M^Y~*&VbQyPrQFJd!v} z)CS`3^#IT%nJw7jZG(Q91DT~%9!*|A!vy1qa-kyFZcCjqRt#=+Du3{O&&?EsW+*z@@XpERn-SlNPwPxcsK+)j zIy6P;#Q%8qUdCp*AibK4l*gs%l~LPk*)gKlN-);1Iz3kh9a>W116d2R1j^cZfYFn& zpjeeVU&pK+0MItqSL0r=1$X%1ELW)!xW);195uZ%7BbOhH(^9kS7!jY4}RO7itBrvSP8@)&sCi@!K zrKQkz*7jF}KU4kdQf5I9`_y4uz=wx;p@>kOl@XJrn`|OQG~h|ANcnbYOs+BaEcs6$ ztBLtDwn|5um$S?`vpKL&RsZrO(MI%$7&x9vm?b*;>}%2&8bTIr?fC8*8>EMoR*&IU zr_LP!xOF*PqylH6WG}PKgiam<&<>r<*wDXqN6_5iLFww~rIi%o*Bx{zOE! z0;r}nG0#{y)i#NLOF(A;8-oo%l6XKP2J82UWB%Ilb+Ji>Ebb(;gfQx|&yvxAEO8G) zxQ}OibZvFLvA<@q(-GdmU_4BZXe^gC5}Q(pT={Ila`NzAA+ZSe0Aqw>Q^u}!XQ(^W zs?$g$Zmd6WJ)k6a;`~#I!P@1y4&~1@KF@}eP{igY@DUl>dusSB$#$RXn*hSV=V0I-UI*SGE2n76dC|?0gl!%>) zw=92AmB8f_3R;GdNE7l1YHEes87IPpITK?tIm8Tclgz^ot{2!q-Un@u(QB)^soo~8 z$IbwFG_b_K0G2NmK!RY!I?VWY=eyj_jjr>;}8Tz5DM zdRiW6wO&T17RchQ{4L67p7M>&oKhnC9M^P9;v4lqpnGrWqbI|rXA3ULPf)>fTgurB zP{LXJJJs%Qv@{I=XG91P{>dNE1D6-1DDc1O8IIh;IH8`w%-SAj+=f3wTqB{V1 zQI&Xs;{`I~`Ule{QXY&ihV+$Dqis^sf)f(dHI73LSOQzAF$h`8k38l54gw5Yyr%Tz zUq_34H%eyNxM8vSJl*c=k-2Ht?t`3f6nuwD9uLsd#`x95;^hrazaWg#Tw)Bqy;~5g zFd9kWfCz)DUZoi1<>U!^o+!B*u9Mi#7gzW7&7=+u$uVm-MX4}N{Fss-{#wj!gnJxm zQ(WAu2Sf|fYT8^G)O=HxH!01!!p*E&l`OJvm`{C#tpai{%cAGQL@oT4zv*aCh9e3X zd2Ejm{$X~tsTIkgY6IvT!G84J>qN_h22vvMJO6pHsoWCRxErJsduy7YhgfZyof%72nseEjUFjn2)IuriXIN9}iA zNubr+?;MN4EoJ*>>W0FuoLT}No6lU^e(Sz9kZAv5L|A9U6YGy0z|HHhY`y3%K~P}D zm`CM4Q>>-vt(9t zT3f$nM!=QlSh~~hfCtpl@ZHq*tC}uTSH!wdwz8J8sAwfPc0TU#{dsQZC{;UAL(4iH zLA0?7$V}Jqcu^}vhzAf=sm@fs_;kTkWb9vJ*qotHm6X_Xm-%UJ+Us~J0_$nSrCtj4 zjWqS3txC2!E;^%(j;u`;$QlL|# zQ5@;%Bz#OAAUI-OCArZfJrHq5ZEG%Zaq2Yoh2?fr(4<}XDV^eP;4k@it@ohE&kq)rR^5wX_u``% zw{{tQP` z-nEaGAnt4CXA(hArVwpO(0!V7j1^&4{7v>+dDh3tP(uqjq?l##`N2%S!I7*5ZfMgA z(YFQ->IGNS`?fL>)!*rmpb07QE-?CstyiSNk$F&Kgh8nfFsyFQVE)nM``im~!Axck_)pZ6o?? zTAFD?yf~^Mvu4C z)Elw?WIgJ!-EX$KrhmJc(|+RG_B#DKJIL&qQ|cbDte+hMUSu zHE&^$Pxdq7pD+1tc$66?WF6saB{nhP9r6z3i6e8am3ke#Z)0Dzhl);ID*KcmJd!2}pzR7tKZWZ*vE=v;4gTH?dx@$Nte68FoW<~~q z!TUU2Om?Eek!629YLCB$WaXWHCE!X7vOtX|>%;qilY*E8U*qNNa{KGUFkZ7_P#BaG zlWk|!)l`RlA=B)*|_3!_Y|(!uz6*dQ*#=5dIwDDA4pYH+&)b& z1Mcb7qa;_Deywp^4ZGAE1urjrugo{H82pSI9^qk>Nex9Bb69C;*QRR&)5T&Zkzu1Q zj-`)yYEF9#w(n9B_J<+_HqiO}cwSegmhTb!du;XahWwpJ-Sc`x-JtWW;U83fH=OWQ zT!)>#uuyeXJgy`)r_K|?V85ADRd;G3=n+IZdX#8W8w9&vD{TminIodX%TG@YNb;l- zwJcz7@Eqpa@}8`HQbB#ED*Bb2u$%JZ%jfW=Drv9vkC$4(p3A+Fj@Qeq=yu6(y`6G6 zEoVMfRNV(}?qv1d*az~YGLC4z&Fk6#XvlBASmx?98Y3FLUwoNEVUYu4Fx!W_B;je3 z8oC1-3Uw}S%zYg}5=&a7EafF@jSvRE^ zq<324ylF|+hn9NB7BNcru$mb;*er}c}gvW7>`c6|3 z+fIit0jEIQYibH#bwMTwZ;=qm3ml~rVRB19+dhyRy-Z);-mvZrGTq7=w6-H~=qipk zBjGQxPQW+UMXSRw#q7;&G}5t74O*^?f%V4=jHH3seNlpb%BF{NXqt%fGl zP^>&Yni|je9@L>0FViP5r(-XLHEno1JPdY4?aIYTDb<;zaj&d#hK)NM0Iq^e&5nd1tu0Z&KeH;#W+sO=0p-ooocoGf9GP8jSv410mZ@xtiE-9;Lr4UOi+@-NO#aOPOL9C);eRr?#G6dp5DRB7k7`v@l z(^=E7S+zUl+y#8mFuz?7x+_>O-OVXME@oQBI2}XOXZRNhL_VTU)R&uvqL%!9|)m3D0n;Ui3bkXU=1gJ0qzWq#7%eDKya0m^Pi0#2s zS-7-Y--#nf8Y87rG{Z!m*|Z7f>{7MvC-+<@e~K%#z7gijSbHXPSJ1=VcWLnk+yT8C zU2L6N+U0#mJq$ZFyxZEu2{E3(;yFdKh|!7SfuW+hB|cb9hdJlZ_^7>Y7Yp}Sk?5Re zf9{^dl^Jr3|8B&N;?Dem#0Gq@?)427&vmFQ%|%qK5a1$J~#n)#@*l3ri^SvIFtn|n9oS`bJu+Wo3?yM6o;V+k!l$_EtC{!i1Dz6=Tso=C@E zXLoITA6#a1%G5OKZKgTrZfe#h@BOQ{qKsax?lhdmx$3$KM630x@a(qFK_I{+XK^&a zAPZ&$j_^a+)u%e}y;^T%KOC=~6Z{8~dtQe`RP^UluD?IrtxLwsZ^?__e{AcBzws+x zWLJA@SrKtfLU)Q^$NZX_Lq7A@LA5D$J}RASR9-f&7}KGxp;&}JPKU)yQh=SmXzKKN zL0W&@DIoy+$-ekm?s#kZAsl_{+LD1URmNJ6KRzv|YM0p3{Z*yoO8u_$TS=K>-_OtK zS^W1MhLUJmW}wf zF&573xWAVOG-8daho*epp5Dcg9pu84) ztjA)L%HzSS5@|(2Md`9s!X=euPo+AQW;c93*cScCe=K1$2>23H|JVf&mG9P? z6xP6a7wCCyEO3Nl_FQaZJMf9^+1`ow@p>+*Xprralyxup_%rY08NMBaiFD>3^bqci ziR``$t;j7CVYAa#r~NOy_abngC)-bn-R%Z~bV$T-XiEXBIkX5t1c^G^746xIwRe$& zu7Y9veEp-jnshq>z|`5rGId{R;CL_Q_fW%!NGY>^diZ>}C*SU^aXO(`N|-lp8V}?- zdhuZE51ZN)agcG3tQvbm%nwq9AK)OJJlQaevP3ZqPpXiV33W)mqv%8IJDaWBUSWo4nk4Z#5s)IomoY_Cfew(o;A`-(}HLMVrP*7$FbHjH>q<8<8hsnJ?yg-SU>+()$?LUJt1bSj=h z8ny5jDdm(cRwEmP*@O_^^($sp*GeXFsEguyD9>|Ep*3$cpXTtwAlre@dROGr6J&i%*Y0DVMGsVB;n~{((_=ZEu1_ zgDk>&30N}uR7H;CELdx%iQWOMDF@(5g6fzScI=m`?7c}T8uOI z=+&*>*eoi|5`?dM4W3Q>59;1JsLkl>8clHbLU6ZIytoCI76_CUDDLhp1P|^GEfkj) zXem$%#ogUfoS=oG!Ch|pd%rv1%)Re@=ll20naM;Z$#c$g&e{9yz4ls)Y@fDQJJCCj zhni(jgixuv9INGuj?5I`DThqK=u#O(ydkEN;D)RO%nxz;gEN1+fZEEk6j0AK+HC!@ z+Phd!wLg=~;DL_;e*oL_p8KCu@6> zPZzzKsxz!eInJRwuHMA7fFbGB)Dnt$BvxyMlGC)FRLD&Y;o|PY_a`wOxpvRMJx_iW@}tG&Y>`T=BZ zygVA0opGY`B40PiKoQa#G`SexTyN*U*WfsbvKxWMq17@i3`3QR?Wi_`;J>S1s~Vg%92rohlu(Jm3INRnTp18n_)ihC5gNk zi;w`7eL<_lh}%t5zns{QU(8Uu2tTBtVCd;-l3jPdhu0@V&iS&#kQJy?kZk4=a~{8Lu{Ur<67ovv*iFYMuoWr8XUT@)PGbPm+A?( z|CA+(QLc?-?!&la>B2Pyun7}6spl`M{NY|dZ`F$L>zjBXCE)oZC{?2Zg~#;M7WF5& z#}^#?<+@z*O4~vJbFPagFb2?9^6W*$nOKEUe3U54i{97Klgk!ynV;%i5P0*`mcI2d z^E~#rQIDV(>McfrT+$_z=n=Q(Wm{%QVF!6PzuT*1%{n9e!)UFFmz1i4YbxOC>(iG> z*cB`hSTjIA{JZg6#0Ou#gK5vC5h-aX%B5{T3W_oV4aYv=ue^;-ry2ej^jV;S>`50* zj73!_VB8^mdvA1V~9n3bhRT3QY2OFS&;?W-jYoW2vkK#YTGJ?%*f1_j)T9F z2oJ9C8Iiik4OqXY$AxGcfi|GAR;w_#$Y^W%EoR3MHNK1IQ#GJ0x+oG9+1`XGsm-Wl zjDE&26PgdEDhfSW&`L4gLxA!}kkwE}qk%<$=za-133sLPv(sARCRZOid%Er#=B`dnpN0mF(cdqO!H-ex7@d?YEIX>VdH20e z!pVmm2|*?Rc7TV!G)OkttHCG#p))zK>$w~hc~C7OHd;3sWN8ni04GNRenTL4H?bF& zyQg6H76vJAy+DDh+yd+tU(qfWi*ywOw&!_V=oDO@vKM=DOn*mTYOup_igU94Gqovv z!wsj_ua5E9F9d;Qz{P^g722{^wu9^AD7i2IM>JqZh%|W?U@JSpw(w(f?;IK?^InQ<^c^OEeaHo3}@VYejX~hb=Px)A;8Qj zwn0oB%ztbO*ao>XP3f%3*j^I0rwM-wn6urdlWZ_+agH((dFr78o(xpdttcq?kyyYs zmM0>k5`5NH)z0<1ga(f*ZCHuah$)g#>e936Z0FtBf@2Za&o&wjje<7L$QL>n38~G- z>ADM;_U6&vYw8h`T_gI5^I(}ksnrzDI<#@0ElP$s+8rltHmq68XPs%wFh;HtMfSJx zwZ!rMEZ+glBL>Rlc8r#R)wszUZ9&9%nR-GEvh(0piFzbD`nxvE83BHX+t}LAuOq5m zcfe-n0z^)jM=agQguS{~?Q1aljC;pNN=pOl?;(&{!L13?8Oa&kL_vM^*PaUTO#3n! z?7=OA{z+5#)fQl{z~XO@$!*wS#mB#7eNP%_je2U1S1rE>F(z!U>=#qWjy z(-GCN)8T8Pt6@5B;#oGo4>Y*gwRT%&QK@RQN^TE$2pehL9O zh&^VJRs?)ITz@iZoQP2t6=iGkM`}Dv)+NeGITZOJZY5y_S!4IR(i?hN4P?giAhJhGIbXw%+f69`x5=KrmME@eY z#;vx!67lNOGtut?L|w=L2&9HHu?)6zcZPLXWv9(c);>z)zvanoeuqD%9kfjsOP@-+ zh_xYj1rW6uskagEstOMh;&}O#M0d!Xz-q}V+#*+CkAYivE6(oOUMD@O0J_2TThhVD zTCoc3k+tUL%bD^igJx*H#LsrP*W>_=w-N9QH{`AHjAD0{2g}Fm55CvESL;ibLI?tn zM68VnGjBqC0-uVyvy>Dn15R}*>v+2X6)5BFA6#tl5)$^k=kIRLxR1#gX?Zkb98`4! z(00jMm4@2YLi`p;qiGt1=e*wmZ_?|QNLo}Fx{u`LETS<;9#t-WLc$BnzExntn>!87 zTT0?EAPI4qVkLY%0#+hiuE*cV=jU&L5IS!mBWUJ$N?V3{GOK7 z3BCdDw~=|?bJb;tmDR&vM?=IO&l?YHVQhLbUU!ap;RSn_I9p+&TB;NFXk;U2MdbGf z50P~qYUk%`z3}ILllmx;Yg!HFcauVc3G#g@$CpuurzMY_CZNp#z>s90b zHZ=3Nw_-+_vb>jL`?qMC@oEfkl)7#e;bU-5#v^2m} z@GcIAHuzz&U1Xw5kt&X}{~4)X3oLD!N!M((u;U&Y6@0hC_`EFs1PnCZV6W2zY^M}a z%%cQ!Z<&~6PU*@O(N>k%z%o0K-MFZy;|k`h*C0;OIFtrz(1J_cnZG4f8Yb*+W%zNT zqoSS=+L2sJHxU-vX7&>F{d&xoT4^B=qKBuU31@GK7}0u$e2fDU z`Q!)tAFpQ39RV2X3pTXOEtkFMk>1ot$c&E&_v5jYhwi{Q|B!t@(F>7 z&G1L!Eo<$k1q?^u{F4x!$(I1o!)LA-!BzmFoZm%a*6=dc?(v7VZ3M!v&0Ut1<8*7} z1k+{Y{%8WTR>+H9kr#aa9Su*XmU046M8e=TgM~XHbA_RVR}i%kul0fdiOkyq1~B9GNQp9w2`+#_2ULh- zMN;s@A0I=l%g;I9TNIVl2;xYjf+qXjk|OtQ$xN^TF+kEILPdQ~NI-}m!7tcnr6zem z+ELsCv2uxJxEUy!3Fb0o1)bIAhm5x=-QZf=%56Z(w%PlTSY@i-L?xzpCGr+y@AnX| zXkor%o8R*OfP~dIW_321XLJch(m3L$%{Ov=2Ho_FiPb&>+gm2hyt9FLYai81>+D0I zKKRjln2#-B8UM?VXsMMMB6C<02maZ}0dJX}iC8h2a4)=$3Kxp!+n=;gda-pUt!J&M zt&G{q~=km;H!5#@tocgcn+E7i`~9 zuHCoH!w|FazYumQl98>HoFJUAA$>F)|4UkaNYY3cI{Du8{7)cp0J8O$n6_XcNMa_d(NN3|>c9UdTw&U{8Y zmddK6Fb~ff{XG74e4x1G@$wfG)xP64kd7mIq0@jScKhPJ<|k2o_;c{3olIvLS&YYE zTh#5L_$sQAaAVU!7`aQy+)W*UyN?gZ$8sZ#>d+$`<$*KTpvfB4(jAmb;;dqvh=9d? zX88Pp#1KIC>RnCFrpN&=LW--M1c70vbWErk5l5l(nq7$)g5K2)il8T<9>+NBZMG1{ z!QS-XWe9>T!#qGFGv5taXZz07`dOPxpkF?1d(ig?<9L+9=pt4svDrl-#Ef#+SAk~A z*htnJ(s4FC4&YX%aXj>Ti3gl{Y@lpj?EYC_qTW}p8p6EOzl#Phot6t`Gw1FlAeZDj zuw#;*=DVR%P=C;A@m_b-M*%9ru<{{@p(SE=x+Dp&;2>d?Itl~Re*b5tRTss91Ntuf zLskQ41C(TjzkAXcn1TEHGEs!KZ1#GaeYcxffKR`&Xm{z{RYnUkH8|@+pnl5mZ0q(mlc^nKi%K#`Oae_PIzzZ7qAKt!5voefB^<#RE78S z+8-sT`Mw`=`RG#UGGNmq28-N0_Cdbf?(r#0hiINHS6h76<%+)%ddgbgQ|_&!BjufZ zUM8dlkkXlWx#yzn679S~ikJv$tcq8yMY61fBc)W>>hF&z1=97A_^y>3h1t~|2Vvt_ z9ENAJ`kwxImBD7c4Br6p*QtxTFiEnnj@qN9u1?;@_M~CcI|-m>(_cLbC1%ouFuP(# zc1no$Xsq8k`=1n$yZQm;Yyex72w1mFMBp>vyoB9xsx|`j?59H%R#8`1h*xC)^} zQzMj=P?GdugP3_8A^c}#_>i1-I&H5zwOKz~F3kzm&R}ZTIzF7$s*4}|3cTMzLsrij zR3&@glcuLz5j~86c*bAyqKgKPiQP<3aT*hx*_5gNM?ggS#KJ>f*y;_Lv7nbfM zg&o(w+Ps5Mm=!Q&wU>i1Jh#Wb+33D1ehT**LBb1h#RFm(xFg#e(LONB1`N>6@Rm+0aik6jqgP}2xi=0a}(OBq%q*Imu75<9A9jNF6eFy3| z`@L$q)9+l(EARSjxZ5r9I7=7i7f(qcZF|q5392iICW?!jVD7}|K=*#3haE|ArZs@I zJ1XNm6*3Bp!CbdiI|&|IJvTES+fj^H#R(?5j)ogXS!kay?3 zd7AhFDtLKv%Vx$F@eG-gvzSqZcj{z^!Hrw9`b;7iByO->AwsjZ=c2PZDf>vX?#1>qz^3L6NlO*Y0Ih@4&fZ_9^yK z!>_%Y^j-zZ#x269RvW_jngWv!$QZITp*1Khqf#WXE=0lHQcOo(72p-vFn)!09{#SK zhv7FzIKyiEJ7rkc8tmp0yOmeN`RWrsKz1{@M+!7?rpayW9F^z4f*m3D2`sXo)l<;t_ippZ0vIAo7#dNy zpp3`e(rEvY5Wce5Ts1~DeuD|?`>}CCP4%7%&}`YOQFDk1MGwZ^Dea*53Yj=f>a~A@ zr}hi!cENl>#$T471C}W-hzxozj+2VsalX5(&9jMB#?Q{=RQzQ$EK>MZhUH%CX=s(T z7WKF#ZCSsXK+ryySr|#=O{LEz9P8sIU>8VWRKG*Qs_kivgcbwNFX$va*2A%WAG;>S zshP+hx^_tRi8>4j*ei%af;R`4W1yhoSwf_Y`XKNs^5abc8hqpR3qKMBtreMr;eZ_j z6%g+y-|9ezsgw>>LCZB8R_%fC}0w z#Mc3pHEyT0ll+^Xlj0U)3)9k#KqN6A3LCgnOhr*s4(0PC-*OWqx$oqrxmfBn5=IRcL=p%(Y1 z4H4RS(aVilRw|3yYzIBqItwG7i-KG>iux@7vI#{DNV1SbhYCg#q7EcP+1%hJL5zjV z(cCCW8v6Gs2z%Jg+jVD^Wxh>gU9g4oX>Kxq|}(B&d4d|4TqqF!F-{ zcnaxeH?xoIAY(0*GsIF4)V{8#qNCenJSw40%MGO^8cComLo&sZ_|^h#HePUKM7rorJ3Lo%=e&R7 zWM!-r&5P*vh?wbrpAYE=@-$!mB_H7)_l15faz-oB(MuB4F=%N}H&G%Ae4CpN4t&IB zob+uItUV+}heMCkpX*Q;BCI;PwabcnU;M2TFNfXS+O(D)(UPJv6vFsmfu+pi@6d#9 zs|#A%vU;x}^a7pYFiSTN(vIB0!11L&dC<5YrGjsEq#P^5HAcy1??;c*vEcgY>7?Pi z!ju~?_OmI%L`6WlED*C2dmY1BKa6S6ab>)qG%zXfG8gKY_qrYr#}E=PH==sgDd~w? zBfsqAz*1fV{IQ*j{ofZgg51>a-+gQ0-Fb4t&l~K!==4)$zq3 zE^rs!!THmU<;I0f@wM!008&KPpRJtm@{1;Fy4W3b{6OCzj70BvcM{*POh_y8`+Y|8 z@8~Z%lD-Phl112o=aTG+o4WkGlYNoyOp82NoHGV2TT^jX0Ed17*Azr@>xRm4S-&|r zmxq84hJe|+nV76J#VisizRG8Am;xO5@As-mec}Gdz57M1-Fo#ozUyqpbcIA{D6_$&>r^j^ z5Ch)GIYRiy!>r zKZ1pbBDH1}f=9M>$RD+Z2>1I5R_*BITvo~ne0Nnzu5cZ>A}D(SmRIUK+I)=#U`yWp zO;Rm?NkRun>JnH6yoX}VDlvH=h`KimDtr!#bJr}HVX}SmSg90udytR`M zsUNS1=mq7Qk8y01O3Yf}T1DtUcEjQ#;I3V)>e^G_-M*eG!e8~qr&eM&yB-Hl$V5*{ zs$U_N0w@Qz=}qo!wgsAf<6gIL^n6)rThOLH{Xw^O)3P|FrIeGf z0op0)m!!!lf7!BiSs}zYG0tk5*hO(%L@v@t2R@fUoR(pA@pbpBA?OSK3r5d`n87kI zdP!0Tsbt)((Ol|btCdBLQ?WgOKL&Dx^IO&_*{yIL;2Z>{6><2|`pJVPTil|8Z;Xbj zor@`!F8W!p!PXc75Zda{q)P@Fzxv8~gYC(7vKT;ZHT>B%X5}F)4^3N5hnf(gJvrZt zZ?(Of6!$Txzjzd-3;L4W!;|^@lL*5Y_X6)X#!A*0PH0VNC!5cX9mP^e)d}IOv-)3+ zU+gxA&#fH(X8HViR^W^Ft!Jgyn9jTbRh4{N2kc-!jP$X`Zv zXcz;8r>&3?>q`d|&SI9yc-%FM`!ZIV#CXJelWL+t(ORz;c$y{*Ezfjpbz~WXHXU%U zzYJ_^E)*wIyo3g4Z|gwQ(JI3upFZ(=*?!djINc#|KqKZIPQhWsc*gffESup&qf@LV zhZv;YVM9_x9hPaP1R_>Wl0A;+dp0QkGM4TfWrQSbWUGw3qRrpW8|$J11k_5U)bN0hS=*-YRbW8gbC3Ps3ZWr%2vfw$O8x@% z=Q;}^Zkb&aL-FTnBEc^@;=nv$mcnS^dd-(K+NI4C&8G#jBnrzf{RO8hiC2O-D~_{T zBPpEcy*4K*YC~?Gq7?x#1Q-BGQAE@gZ6BWFi6-y=kwf$lYmE87T1}KBDp4pn#AQC? zswUZS2lxP?U8GJp+)d)+MyDlia)LN&p!-ovk`DBgqB^LTe|cSaSej~f8!AtcR|H)~ z9?*|mJ`VOXI)0utTIpSEa}Vakh4A;$dG4TH>D0Q$WH@pf8;uAOoKQG_af|+9Sce8) z4yI>&PmzKJ19||@P1tkcs6e+yvk=#=%d?c63&0=T&-SPQ^oxb2oJP;RYiV7A`NdzZ zxI9#;>)-1s;`u7Ci{Kjbr<6Euni}6xX6qH4EXf>?yXGO~#%6dc!NP{`N;v_$NQPQ< zz#e~VJjMcCyz+__lGN|cvqpvJJ&Ft11f&E-+6i9(MUj-~hK=7yJKzrn0&d>VSe+GM zelvfiP`K7@(eZyQN&9u*x_%AUBK-nUGn=8?`-MkSL9&Py+BkFzBW0)%r?u!O$W2YL zkFF@1|NKi!iX%5}8Rw^uO{TRUrLQYaOMAfwswL=X71%9_1Z8f|`~x^lx-C(F0LdrG zD}lw=yl)HIlm>Mz_Z>?OkUOeVaC31S&h4Y111ZGkX;>%KjMfcl2ZM%VL7rW;oRvT? zDTlF<#O(h<>L~m}0*1TucR8VuI^%n?M-#=V3dQl1bXT+yjJ+9}q7<(wZBmC0&@PZ=~OnSO9#*KbRn{zTL68(`09@38jUzMiVO)5Kkk=%WX(*X z)83jjyHBdR%=TURx}LI7{=&zEF3H$;v+&nS%IO`<4?u_UxitU2b?8~d+)@2!E(EIR ztge|lfN(I=x+*%E-yEHBk-R5&P|OBK`V#oqMh3eWxO(JI>Y(0G0(%?y=g1jk>lF& zJ6KIok%lV`J1-w)HTg|`6QKFqjAk)$vpW-ePKz!mZ@#b)yed&Ak4~%(@x$vn z4_qx|LgEfG9?x^emSsZ1^##G4PK?$7-@YY)UH4DoC^svc@Ti3LB*n=uzbQ3&e4&FyHi zIs*ub*#!Ku(!aJDj&S`3H}>Piz69SG&PIPCCI5Am;*S^aNm%() zDEne8@RTiWlFq(pzeqqOK)RcjrxjIWIt$1-6CH>ht2k>%r5!KeskItkwunVS-{2;{ zSP;u5LmdL`r#DQ?`C0bFdKOS}vhhFHqR->h-fogscBY9pa{aTh-GZs+XQ2j{fIT1Q zq%1eY7LQ2mk(OBb%$6E(>Q52s^qGt@vfB5=eS%8&<@!02-XYbNrb zT%EhKB>hKVk0V@ZUO{SRpi1zF~41T`&fuYphzKI~rN`c2Rhm z)9>Lp2w3J)wZZo!Yb6HYOB)=!wp!u0J^JWK?AXm2$Q1Li<2T;=^%L~&qz!7&cD(yS zQ2KQ0iza6T(>IMW3#$w^E$4UwHAZ(7#);!6NmLo{KxlXdFpGdy3$bYiAoNkwy)SB zIMQWezmhurm@SO}QS!n$y_A?oatQ3H0$hg~Ja%ar-tMN4+UId^h zdB4ENbechSOGdN#U>s$#Dtk}UTIyg%6Dr3eih_WOOWC-#LIdZFuOgvXL@+nc!ql#) z37-z38?uETR^L9|^+K1U5dJAcn|wM=uI(~EWiPGN?ZP|zVZJy0N;grKr4@}8>LsSs zB9@sKG{P=Lgqok~A-}(2vmx1K80?{m?N{P z13<-=o{i2Q1&m{(pQ}4l7&ZDe*@y%_g;wcw%e`L2oa+E!3i7E{g)k$OO4->V#A?bq zqIl8SB1DFv>&_G`&o^F+X*~c*zI5i?@{wvU42-c8)C!E zpEpuRH)nB$Za2VgY-=iK)4V&Iy;8f9B(XL}>K0!&IU71i9X$QgPX{9)H7be2QJzFQ zUn-4&nZLI-5xE~&%HunkmA`)O6@4lIf&?^k>;ziVDTGJ}F=t*xuILIw#&1QQ6c9`t zU5td>!$hKLHB9F*gG9&;Dds65glH4_Pr>(V-KdzO`!f-=b5uFxR0o|`_|iJbqycng zeZ*tX^Cei;2~{NU^;N07yO}H-fUT(m$jJ21{Xbwji7tCK!(pE^fc4WRab7Y}mgy0| zXO*L{y%sRTZ=Lj-=fhwV*)+_&Qhk3Mjt1|hnvn&+!uz4HKa0u%lzSg6Fep|kRQ61_ zv{h(#9(M<%1^f-_%S*?AW1kgb`N`Qn_Jf)Y9kZw#Nfjw}a_912p3%2N;FhA&2r6MP<;=B;kc!^nb zxzG-DVN!{f{rTUBK~wq(=9ahDrkmw+mw zFl}!i2?tJYrAS2G3s?c`I;OwQACgr<5``7jaO-TWwrjaS?c&W;S+o#B z3!3#Tzy%Je!)CqlNf6*+t3hJ>US9Y4*;i(kpIjEXY;dx*2(JW>?vge^1=3mXwmk+Q zbQhzO1?qu&3>Wf^987caSa>HbFaoFn@5UcloQn-wc|Fnalf`bgkn3O0dA6d{_VHR3l_{I zir!{cOSQ@lYH@!EWgy>N9s4BWeXOPXgr4$Yu|>p1Yk>2>?`EE=w!V1BtBWB9adly| z@ZPk3nD4K(T#_Cmv?Befi3+;!QI3MamMIstmu+0?53i^#bgyp-B?aK};)$u>7G+N) zJxRy2gqcP3VCEYSNjSavRG@LIiU~ z)-y8qOZf8Rfu1(Ob%kO zQWd>Y3^U%(xY-A3s&hs(Y;gN}7LSRIYFw2cDa*jJ^Adx=>ZN~(A47-N#r}M`7Y_PR zO8c*OJDv-R@S_g{MVGx?6AV$Xq($=OukjuAUo<@-ovFU)JvCF?vBMr;~NT;Xv> zZ>jH^sfXD_xMbuDYp*sw^|FNC=i;BUtnBgO`U}<5$Ximz~`TTBGi8T zc9>PA?e^w8sSx5RcY#UZ0Vq@g`TA-};aom!8R-o5;OB^bdjH7^mwo11_VRo-K=882 zq{Kn;baJS!doiFi>NXG!HD$$OhW^6JUyM_~FW`wYBv|m?z z0Tibxb#vwqA#JqiBRa6m`RTg*{`H0G1*H{uQ*w-2_{8h`-vz770cmPEpBb^zL2hR20yP#0cv@C}sfp55qAinCjiY^A#A zn#32iIJ3+h<=McnltY8qED7-oJhd_Bt>;67XY%i0L=QMEtHgf6E3kt(XtB1-BEpo! znLp0m+qt4Ms+D4b22FQO_{-A3H?$Xa(cU^enOw0Ix>T%leBUf!p|x?>;Qf9YijO(lZi;SS_`0O{)dVVR(-HGjhJNq%*C zP>ui%i*_cCY#+%U#*W`nGUwasijvPE0z*IADn35gF!&tIn5eSUwB;uIHlm7`ay80L zRF7LSqM5q+6Hkeb@C&kO=B=2kA^iVWKP(pC&d zOMrGQC&XgFwfs#+twe>oDQbI_v2qvj!s*^#>yCPFRuffy!F=gA>u?wWv^XDn@*{62 zP^&iB>ZqGJB-&z8o;6nqC?Ko$vGs0evEC6jl>ogW{y~eS@A7hDdE&`dX<5CeVAa#p+dPlRV1nToB9?_OKE+vM6XS`mW##3D)>sf4Igik)UFQ`=p2>6J@u zWg6JVrP;kOTK`fS5(C#Ydl+XsS+DZ7ZbDnTo9(=aocM28>lBjPi5O!Y;KR9`Nq>L) zU~Mz`6GnW>Dy@GJyqerg<22)Ns4h2_E&Qr9)8gLBIGxu_K8Zb1@eKVGH%~}wm7a7@ zv@rYGwWCF{&j_PjXgiEk)Q1TkAB#^YtSBx*4H*~Tx(B%QM_=xyTl&lz-4u$@UEFWr5K z9}HVT|6=1;njR<i;GKu0s}7wRnY=4x}=dGTB@AWZKvz1 zIN9QlUs70d*o26kSL_Z z9{pmA?ZDAk%M0s}(8F6{5kUO@+)T-KU#Yl?VqkH4+u({SFFRB%hA&*I>Rh1!Zg_s9 z8!3nvo-x~lxne8`Fa8@+;%^yKNmPIQbx96(eOK-+!-q-}L{g-~a6jZ>)Jm#Lc=_D0QLaoyAobO??zKt1p!uvxZ-M{ zw&VR%S-T0TD*US;y_8>=m~$jd&&r{HePT(A@2JrRQ0z6CG)DvE@&!R3pprV^aV~)^ z<6H8hywKFm`6&HJ&p$)OYUAM{yl>ZA1-sS~tZ}rj4^zJufL{ao5u zXP4-^_my?Q=p}b|)69-lAShp~evmFnxh8|}J~wa|uSbw$%wdB~1;5xJ`=aH3#)(YD zM4<|oW2&ESgB)O44W9;IbLLh0+W&%YM6_&kvcf z9(yU3R~#>#o%vXzSPnT(GzhfLw`=SEcxf zj)v6{x6BgUZYnxFGRSBH{}KSX2pBJZyqPIKweURlqGJ!Zo6|u7-+fwD`;62xF19lL zKQ|^_lFRabaKA(`Z9AFMFtr%Q&B$9717twH_ZW20pg85igct^1F$xg*Rjs)JxZ`Q}g*j}ZB;5Y0 zBKOqtc;4t?^+Ors9s0T_a*&tm%^dNJ>`1Dkt^Q)#V$6bofM}0j>R=CaEiXov@d5lX zseWa^;&e}3!0j*I&U8Eg^o+FtRR_KkZEg_^Y$;;Y{El;LeB+Us7_eaRn6rwk2t$F* zrtd+cqZbFu#b09kpMouJ zp+2i@*YEh4t)Q)?3d5gqOP*DxweH>S&vJZ)><8e@nr&_ z3a({I?1thq00F;-r)P|c1U#^rKlSY2(%cK{!@F?4vWa)SxL#`;e*#OTTN}7GwOm49 zeVs0{pxt(!H@-4(QnJo$6EzFi_6e$Oe_f?xgj`nY?}@UFE|nvd|JQf}V6(tg*jn(0^Wjf&}k1G1Y9ReMl6X_(w|s+4qs16gm?la;@-)1VqIo0wG9v z<2MB&!5&laJ1nB7BE1&aNrw;$_Zsm^!f3>K&bybe^It*3ftmP6V~8}xWyY}Xk*rte zORdlDW4uUi3s)L&-V@*Ycn*;ZMiLQQR4~&Mw+QaE?w_`<2&%jqwyOihzLey7$I-`x z<;?%1o=l|rZBEW#x1uJ24u4$M!CG#!X!2EkgyI6pM4^=({q>eiwCmCDBFxVB^ZrZs z2mghIGy4~pY0HUQZ-V2%Pj9%=TK&*%&0g58+6)6ptLLtc0t5k~+e{@ZJbCYeLU|Ex zB}(8-Ufxj4m0Ly%{!epw(r7H)J}m&zwd7Hym}X@FkDP)zv)uW~=Q#MA9|iuHpj#RY zGK^{nfK}l_XplCV#FpZXmka>3!*Fyb5?*@ut?Et@U2;oIIy@Q+&{C7La%LetiSXa% z)iG~N=#=wvu?#|MV1CAYx4=X=4wj#f*AE4(L1{sG%xA0ATbPv%k!J$X$|E9Z$0cQV zV*Vv|9!-e=II|`OVs|4*VW3HSbR%E3(DeS*v*h76eaoPJ)^FS$)*Q!QPaA(Y%;M?n z{~BnXUo}!C?Q@Fh&+=LFBE;Lb790YoF;&Q-1kQ?J{i1IQ;He5jN`}cdp~f3ZaUeJ0 z>1TNfQOtRqpk{`YoU8d7Y`j^|u}9N~QVN5EDqw>_AYZ}8qT9W;f5a4}bVPh7L1(_Z z_JSm;CIX$IM+{rKa(gt3nL#-2_lCACEynKS?UdZRG#U-pLCfAa{EpNY=t&<-0-=Qf z*m}m^$IwW-)G=lM&f!aYoFnq&$)lmRUs^I9^`b%ubcg5rRsp5j2K9h#>RZIMCP<l%=g;eCb|&xD){^D9#^vWuyojumwz9g;jTUY85u{z zTB)*mdddJ}V=eiB6^SLs!kg==pLbXD&~MD>Fw3Xj|3d|U*K%;+4Sbo>6sLXqto`=( zzRy(CnrTuI@#D>#8xVHH-L=)1DxpgWejN`O>_yw#f=kL%sr<7Q6O(2qH)pr(xjm1! zfQH}OgT}mi(Qol)55Y!9OL=F#1}kuZ*|GQ)u|6#uYHWmv2z)tH3g8ES08X5;Zh3pH z>34=cL|R>8cGOxQhl2LFE-gn7p50BIPT7X9gjGKD-2)6_-qyXck7#6DR~*6LVz!!c zde?0~X8Q6SaD%Aojn#xa7Dl@DVTu-+B0*l|87ERJoQh$9#B?3tsdNGDm+JReF!<@0 zk$Cg-Rj>y^w^r$xkJHh#68Dk6_<9gIXZ(|EXOsBzWq-mBJ5(Ug+9f6EYzH5Ksfe*d zr>+@Vk*1d}W+wZ)P0^0m$A4SLc-%UHsh8$l+!J?V#k9kQ?q|!T1j}hMjSXmQ?jxX3 z^M}S)01nNH5H?ubAakNJ&U@r2&ExRx6~^8!)z_YN%U@4I3IJmzi{?qNFlu4L_qJSeX#Vl#qXC@5SZ>uQhX!lg|dQAF>*H0 z@{TTim3y7?{9dzvmQy@u^^@a|Zl%e8@vKSDXAIk=Zwe5$nA`%fR6N`; zGg;j4_wx9J&?6RWV}7(~RL))^R2UDJ!3M=ZOK!9MmI$e~=p6@e$Hb@laQoy9m6CuI zGh)Q~fy>N!raXpZjzkGZEL=aFF`wMxmFZbi3x`GB7e=6XOhW-9kfN0#a&R8JpseL0 zt;>h+rj^$q+6LiE%?9ib>bwx=G;JzbH0Lv|I=)^)K7i26>O0>;!}4vwEt6(k;q!tntv;eU0Rh_t<>6=Kpmo%X`xei(6;>V52cJDTb z<-XqE+PqY2xIG8uBief7^50_>-Bz!xeiS{%{^1T92#hJr%FI?q33e1w`My}XX3!oS`3B!ud z*@cV3L*L&xJKMIqi034#v6&ry!7R@pACm1rZ*CYi_(z&X|=k_;f1 zwjNL-xOk@-;zIcAg)S_)CMGajggezcqRCDn2zvx;!eYs)gRLp_ISIE-4*TYE>iXNO z3?3g>!zz4->cqxC6y(tb+H4w_NrB8VxC}Rg#&`425Lmyy!UP1#T=yD?ZRAl1m(WP^ z2>~`3OP{E!_XFQi0gPtoHofR@4ZM@f?ACulBo;FwA zj{Ya-(~*QuRCc+c!SZ-v1lT3dvN`nrH|4~{vDeXd-Hv9xMt%N+b^3Rv`|p~X-ap?& zXMQJG7#n_j+Izo?a#@o7Bv9#O_+tIxC>{3ycO%P3{kL{NUSCr&`mWWFp8J2m|6~mb zFdo(va*4B-b?{MrX8cF$cn;*PB8AD88LlA?eTnlA zow7FujBS$P1qaSl%&$8S7x*BO*WIEjo!08bX?L{#yCM4D@2PS8=l4Jdup4Xh8vpQr z92v2z;Cas{dOJckuW!z%0~Womhiu;e?Euz!bW6T}xT|X0ZeaYMdQ68MV6(xJ_G&IVAn>JNEy6R}2q(YUz`*4VSUT~-V>$QJCyc?qj(D8BmAXbPq)WQV|~2%*Tmh6Jqmn>MZYRUXzYG4a@8>s zb<>Tb9D8Lqb{A0G8tGK^zlI7d`P6PUYt-*h-=DuHi&r?T@Ry4J zYv<6V!mhC%{o?q$vh=Cm*OE55_qx2M;${c8er~(}7fo*&)n?aqZR76luEn90;uhSc zMT$d_Qlw~*;O+#97ccJaR$Pm_Q`{j~kT=);eBVFD$bdlDd+oK?Ip;CGmF_>pA$Cju zZ(E71|9{(b9u{`}sa+l9eluYwDD(=wmYh4f=+@J#GP?SwUZk3?d%%5P0uuz4XF9gA z4+L8IH5nmST5Wo) zIw+&WI`&o{OqM172`{Df`v{^o+@ncfqZ-Z@4?lkUTY%9s@Hex%JHN}-EZSUQX$mG= zE_s5HemIxwkQdi)y0djmV`vMypy#&35Rp?gr>$Ue0c%~ZFO8q%qDb_Fim^|P_uZGm zKUeA(efX|lKKXhb{kRMgfvsuSitQQx(rh9diq-o}^SZ3bWwVi6y_-Qz5Brox@{bps zm{2nK-&I!J+`bgWp3JYzbIiv}zT#~ggWuk}G2Ru;{2nXIYIQB=G^qQA8j88Y=Jx!+ z*XTWu;SS@qvCC*E`<=J277^jhRq1F5+AV0qLKKXrDvxGaN|~cci<0+SJ^tHR{YkLW z9nZR(-#QL!Oq|DlQJUi1o~~{FZDkuPnl z<Ce%@$4)~iHFPGGT;^Xom$5Gr&^d0_D#FNIVY<_Y0^ggas0xqe^5;b z`Keb73d^tj1eG&r%|eI~DN;MvDZM?KjkYlQybiu1Y1G-j;jx(vF~Vi|r#Axrt=oLw zsr&hAi|_W;$EiFR_0Enl<8cD?P)dpHMeosUQhYSUj_DG_h%w*p9Ssbwa5;0 z6B#UFxMccX=#0CWdxZjn%B~`qAnS{T;JL_~X0Zw4e2bDRHd96sl~{}EM4ANifcL9~ zuI)ztPdLbc#o6LMbr-2kNof*miNhD6%$&92T`7GWvyvbJodx^9C6WJg5lJ~M-dme+ znY@?$R8jsEx+V!*@LK=3;9(?wh%i$l2F+5l%_J31)vw1#8^NRK+T;GnUB{aUQq(`D zbFE|R`Ec{t2$1UTCtCL%psmS45|QwK?5{S+!WWQJ7C7KZ0z|9%b?g&X*J}6ctIdJd z#j3p$)Y3<*&VI3y70x+~4A(^pgym5fAsJEOb-cV;F6MQ8dQIGOpQRUeUmEyYnjA(=D>@z91jFMy6WCXWvJ{*O>A4 z^;pLs9y>S|K3~k2E$VXh+dnm})|X6$gDUP$H@5dWt&W>S%RUosG!s{Ee*bnmJmr?r z!=cB`Iy=kggEcMSe*8f*Jz|uQ;&pjQ1Y~HXSG-pL?o(C1VZ*nAI-99dSl)rx{6j(= z&|kb&uSU~+{T=C@sGRnzTE<5c1=JAnX=*nrJRIKa z1o)fC4gnZvve9>W2k^tWRHwP?u0#mu{cN$iwkem%7Vtl#qI0n8|BjtNm>~TEXrqVC zOGeKjQSqhrltb|AHECoW-@w6R=_3WwR=dwFfyVDI^RS9BSECW8NORxPxqYM|=9Cwe z|9x$_HS<*zrdan})B4nS;#{npLm#}->KdN$(a$aF@>XMFmwm1Mw_2t;{y)tYXME~^ zu>Q(pB$KL>jMd3Q%Irv1pteiXRU*sT-KhdM`zvrd-d>3&xA9}kg#*hJiJ=VPPa zItApU)m2D-*Xi;zLjhr)%vpk+4r`ep`19V{ay|QTWdsXC$!I1|w}{(eZib*`Mv9(} zF5~WWT2r0Le3`MH0>*e2->1stWMgh)z3=iVU?Tp?l?J^~q!x`4DNymGvHPS`M^0qI zQj>d9z!l}3hU9BW>}jj(!SrBJb@xWW!)E1=TIk9PK_+5s#`~mUFiF&0J={?=$+(W> z+q2FoVZk#jkwm7fw6Kfaq%K)K@1v>q;`vIg_-K2}?0=1uHpPD`eJpXXVZhV5IJ5+o z1&`WEzw@U}jdG!Mx*!ZjCVRQb9x8q*eaV2mR?3ZV4!>5+lq=DA^CIut9Zm~6{-)?m z@h{*hc`?{?*ytPvzjcS6Ei&YybVE}D7*Pqnv;D4d9nt=+OHoQ*>vN!9>D*#bHys}c zeG+G*`TWmqa${3O)5#T=kx&ZV9ghn3CCfkmi^|QpLDz z%SpI7n_=hZ3_;hnfB_Zvw)#Ebozn~XN3iBNKI2G-aDBhdT{!@LOPkU(I+g7=EVi3Y zokmWFQ&S^KEsH8ml|!I)B39F5PT)lfqRrgG4cin8B67wwj7(kZ^NP9ra6MG z-2dQgBY(C2Te-8%-Q0(fL#t`iIpt?xnvui>RvS*3wksfl5#1gW?*tu21*;$V|BaT@ z+}}+Lzcx9n=F2N`o235XBS$e2qk*}~fV^iy-jRsMIvzu;%$hlMo6m!GzhDmj3n>O2_3<1FaZc? zqzWfXbX)62e~MPqtfq1se};kUG>5FZwknY{zf=Ixuhv@BekI?pv2M4*db#M2MA-?Z zgCJPiYUBM-BCK(PPbakTLnmU2h1u^6D_XKSkTHm~Thmr|uI^zfImp^tyJu?l>IdAQ z@dTc|x=I+tz0i4tiVE}6EOWfsiD?}}UUFY9G|Ka^^_RlFydk^wLu^B;^S@Yvfuv;Q z#3R(GxKAaTTK{-7rTX%nX4x}l3R{(AHmBZoe8r)aC`sWoDZ!-6e68P{hW^_5S_oj* ztf|R9Iobp1TgK&l`Cj_*j%nKvS6e3AG_WI67XLW-4n%m?VC>do+2zOerEnN8m#ktCV6M1zZY~JMb+Qx zs?^Q|S!wh*n{Lfux1hpiM$yFWP7p^!w-Mvh(D3(HUWjojyu4Zji-J-w(uR5L-`_0H zIX-UR+I3dV*u<aNre;S3v<4Ka~2 zp=5+!ZY$U;kL#Wa5Qw4OL;U?(_!`;6;{K3r&lfJx9Mw_!qrcfNW*%)g_p(e_% zd4*o}cMvsxR!&a#;&I9qT3GIqXP|1Y7|J3Qte|GV;GwP6R;y=;zDo@v*f zHAZ0xLYNB@_uZsVG*%Cd%)3(BuM@8+5S81M&N@G@d*6*DK6J@C#ahq7Lmq}|t;1yR zPhkn@Dr3)6%yr=9c%`IPSE$EwLD$v%)Oh1?O$GI-UF+9M3$AIO%2Nl*h3Z5<;avE0 z8HQj-(jm^L#RX}Yc79<1<0ryP#Iuk5Q{u_zO2ewIBq$4MFV6#f_o|Wv=q}I{aF@+* z7qszq>cLywY2O6{6Caoivmj&E;{IF2Czbyo3^dC*oNl)=h2*RPZ2qDQ_D$F!LYqCg z@+O9(=ga27Q~BO+a!&Gk>n%TiiLkpEXzLg%84PVq8Af#Y?JWIhG~Lr44W$>DV~-WVr}C*6-_GltWY9}0^$JI#u8+X*!Kwxsx^K@g42tIg2EacMC`KPM(7 zh(;5!7Y!Xd%rv>e`Zi1LwAX-PxWm`G4&JF-znvEotwEdRI%3@>s%7_M#=-ZYAxg|6 zU1>c2e&Y8jJTJ=M9KXjfv!?s7kZ8smNw=*cFd*`xV)r_&GSA^3V5PtTJGC zeYT%HO~@HG|M$=Po8?zhL<(=d4u$=h4$@z2&BLAzp!q16c)JpN1e$;wc>sS0qifXh zJdZM2LTpM6@*p?{sM8LKXU`E3s$Uqwf=mASEB-eV=AA5bt^&=8(`BEke?v1`FL&dM z=g*CU!Xw3SKJ2qW{;#VXf}M7>m&3dHW+^k#L;v|!gGP(sLJ^PQGiiKw$U8^scyS-M z*2ywC;NS=LG`}09$>1XlMQrCB8V&Ea?i;N}nECCxrgGZmfcOC<{T5|57f=X_J+08D z61w!HL-GR5*v(u1o$QfmsHnMrSD=yj7v>CP{ zfI-v6PZ|Cgy787kQWIk)zludI>7ff_*Y!m79ksr0n1C90wmf-UHK0jEu;AiIYDlmC z%r8o-+>;8B0}Hi0HkpOQg{dOE7|xp zI0=hRoNt^mi#2(&bBTKk&AD#*4wZ!7^4sC5p=7jbX zy35DJ4Qp@OQ(MpOi`7f7cIEBUK>zY#(kEH zYr{H4F9orI8JkY+;`Kzn?K<(eIyQf(>LuYhiZp&zz%SlhcPXh6ePKDn8zew-;eiLn zQ;KQ}678C!YsDNEXqGzh%G|{L>cbyGCM9=@$uIb>aZB-MMn zPcXPp`20Q{FIU3n?z9Xv)PDQAZ7gtVV_x`6;%j~i{5VGK+Bc1w_qCnZW<(uzbj6^8vc%C#;0fx4W<6 zlxhEdNAXY_zr4Bqk~+(J@-qG*Wsl zGtv<0fmLGTMclhjh*A|D3W*E@#9=?~kfjD-7LEZ!J>Cdf5nm|>eA%GQjBSvIGBlIw zdE!e0NjP||S8%BT|F88%R(e^{9tRIgR15tA&oRo`TJ6Mhp)?mp!cKC6*21|alA^{t zN;o>7i(v*Rhny-rBDriRCh>eOX@^3jBz+i@K+{C$wm6DL%u`~(+kV@FUz6jk$z9wN zh1u1{?ycSO{ZQNtf7yN7BPA*ZFr;?+uO|WvA{gGnjQ571=dFP~sb8^$JB%>oz9Zy$ z!jTx8zq5+9J(wKMpB)7MA;p7ErSmM${ohE_m{0b+*ZPfI_f0G2#!z@l!*psY>+8$97uG~kr*1p1@L=k{P zwZg1?66ri=h0dH}=*>33oY3+2Ix7ls-aLE~8H$t655$XW)~3HxhFV?uPL$p!zqFh0 z7S#?uc=9)Q6M3EZq)QgkbLw>kRWvVRT@`VW+3H6-*C}CGs3wpaFAiK9bi)A;#-Fq) zhngD1~FSQ6y_@z=>{nV&uMns~k5N*E`(m}6eqks@7e}e1QX=~ z>BhEgm5#Z0bMa1!t`YACw%K~B?bYeYP}u2A0lZYQr@^O^g**V7>zP*9?kL7Su~4HU z>iaCr3;Tt#f+5mL#>Bs6KgWn$AAbxhD(7pQ%sW+lQz1c*`Iv|H=W2#Idcc{J{Sbg! zTN?J!`n}V%{Ov;8g@+6lF6@;2i!xO-VIcVp1zYzHLiVr^)6B=d-Cdmf9Pb9e#@Trq zFel$zNdTArI6mBF5is|A9||un>YU|~@BX9Y;XoKe@kJ-p8V`w!hbE7$!DRceZy?&j zp_?hn{(FKYY}C>qIE|8XL6VCTI81_cxFX)}8I9Md!V|F_u=3V<%>y~T;ZYWyVFd!P ze0Pbpz;P&ENn4bLLT0k3v-iFF7@h9QG1V~7yQa_QrH-f{K?m{42y>oi9@S-ronbt- z{qi3UVT!tUbMs%K1XDOn*$3rO$$lselG2%a)BYLPy~^%QVr3@^J}`Z#Co%jE;|twy z;sH`t#k)zL5As$U76!1UMSIlf|CSB|aF z?CdtU(slU@5Zvt9-6K5Y_gL~zABZ+w><43_i$mCW_qcT*G`JVJ+gKcm{mvaGQjm%l zsa-&b@dFYpR<3H&r-d`<=#%qg_cL|;%<+D@r^t=E?YeZh%x!LP+5VLT7;S*feK>z} zf_zNth>D0^7QO<`@MQ3!M&Y5M$b6Ug|kUTdIh67jXdpp`-Od_gd?iPnrb$Ua%DBp&d00VC+b ztZSOT20n(`)Oq@@UdX+G@ zH(ONz9D&~WogQveytn9D_gY*xmnI{6&)}lDpr0e6(hgL}>}ymx7{AlfKRubahk;|@ zO5m2JW6-7GG1_V+wmMh+dkQGb8Xuz)aSfQ}9)!*Y3)~jQc?8o|E?(gcP56g)pu*mJ zybf@@P%W)1L(6qkx`uTMtc!H0iLh-|fFMA`q9ha!CruP6tRPD!Bp>^r>a&=BLUuB2 zvK=G1Z*;+0N3~TCkJmY*v$A<4C(&_Jq;fDlg$g&GjV7Em##{z8QewD&rEV{B_V_F%HDR(|#+0*|sIH8LOAISR-h#vg! zfsfI>uo6~vGy7&7R^7E>_tW>1a<}LS@rjrhe+uaqJ_YpH{^MB*qEg5+<+&Kc*jg!b z7yT*ezjvXmoPvy?p5B?cb_~E?wV#KXP~CofL5#qUMIGLAfNpg9yuXaOuTX_tNeYP&r#}Sb*Ej9{^&8&~+F(}Jt zCkdc0%91<71nhjI@Z|80*z*;i^aSyFNe~m%04rOSV=o4hGSj7mtaI-Z$KXy0GnG@h zi?M}5nZL2ErJ2Rl$1U$BHqq5H5F!k&43Uiy83;}Xl8N%_1L3vuQ>~+~2vCVLd7l~x zcI6C|TJ4)pz!lv9{|!zQY^ayfm{GsJi?*9eCfuLQ_YU}og+pk=Vhry-7Ld(!*x#b? zwfv1gG{6fZi5fyUmscS(AmPcN#T-7682^#~)T`HlBoz~gxoc#k+X2XJ5#l#4Y;ZUs z;R8p&D_&BeRXY!gYKcta)iDk9Z+EA%jjyY2Orac2Ws4RIP|`)$dU$ztd(Cav1+@K8Lka=ZqH9SKozq<~mdfSnKqtWMVf&6A;a&Bc~YC)NK= z!JoKbQ}DuS`tk6I|AR+9U_txfA#m>g53`$AuBseILU+n5S<)0GHoM-h1Kr0HanRgh zx{59K9t0fttmgkq4`4%+fcNOUI`(IB7%8PAn;eYZ2@a+0MaC4PL0OwM8NV7e?euPC zYY{rSWhlJc0{|^2BMW=hE=5B{Ph!p<9y#N8y(3u8j0>rr%_qoejsf%-=V%NmQ z&Bou2zQQr0-~J0UOTg$MOM_Do^*GOW9CK5P_|M3BFO7b(_RkTU<;w9tBE3h)claRq z6*K`9Ul_f|O~_;q_I!fmB9VnJ08IP!m5vNgB1=xpXQknyM7(0c=n_%UG4+PV|9Y7$ z;N3mFRnDcj*do66<@dbx4_<*!s`(FMPjfehy<4jL+n=>a(n!a9IlySX`7la`i0we?=oL+1q@jR=E89)bPMNSGO_B;mJ@9W3xbXd$;?ZEn0G!~^jBdq zr3rE?MXj#ZrN2$NbaBP6L!1gVnC>69UYeO3@lguKYSo8i$wS{Ihns$c0R+JDl8~%B zhA8*la!FqnEk)p_`16vEx%e^P-)(8+o+VVxO;p>$myj#Q@yshnNzdawbPFuQ-?GkU zn}oZfgWa#V5)9^lk%OB5SmMR^C4s%+da`)k@7OP>t`Q&ssP~c&C6@&W5~=qq>}JR` z-+=lzLarr#!C@58RXQFH#xwH7OZYy{RKWs4Yy&2NzCSh&{z%Nc ze9tbW-MZ264S0e*bNN=_Z=yAaJzd2dP4X=l?c#ICnf;<&Zm*imEjIqT)Hm9IRMilGA5AZoxs;uJei;T`jjd&Hfz*|Wftz0#Xf?|OFPQW3>9l>+XmASQ&8m9@ zh@2T!7EWDE%wWfHgd!hf>R%pU-(o6c@k2g7bK6 zTwkA&&*&8tC0w{JCPY>WY)pSOp-oxt;RgssCD4dDOCc)5K?JRwP!FxSGg?u4x(u|v z-~+bpOcb!@r-P&#%(3J}S~ZMZ`SLo7*2hPvgspgzYez(o;UcLh(KV-Trs*SSdR0i^ z{@_iU!^SwXQdWja*fUaC2!(CD^2v`k){#R+WF@{?1mog6&`8!F;&vJz_ z4a2w(u2H_BwM1T1c%cmjDrvii48T>yzkHkDE%(OBEwYFu%ru$G;@mOu;%`3Y$r(UTvE2rlFq#?@v?+1Jh>WO{#TWr}`fNq;OPLTvo67LWNU!&TD-=cKIaZ z^@r_e;4s&pMBh=21p1B6*zEm;x5Mclq$ClRdPVo8VDS%)c|$1M(;6wt(}p+M4T#wc zK1n+S!E90u)26Eayj`BBOJ%byH9VwAFYpJ%Qeqg}`2x%=iOM*;5LmpoVLB_kH?6DxaLgnWYf*9G<1zeYGiiwp7M%v)M&hpsi?1{f@Q`64z~ej^ zg1pho+M|VaMdqz9K%PVVk0v&=>F@n-(74jz54am_RJR8JK{cTSK2;8G#}7neJuui~-j?ttz;~Vr2C)s`hKlTLs})W`-oeL^tEG$!t-M zmPzkMX}9_@0tcN=Yp!*5OQS(i+H~}n2|N*A7rFH(Y=}lhFq!rtV%8}gzaZXxnDpSK zL}{S+Aa$7T3=svxZ+goNTV;lTrD%>(lTcrqJ&DQR&b))z^`z6*gGfi|F8kw^UaBH| z7i%mIOzZ_pkx8ce@F)mYb6lB1cDWmr4t6X5By@29_t*-QZW!P#CV07FKKlSQHI1RS z3PU_LzuJ6-m|_oCf2lXrHj0^}+%1TgpUJ8Et+~>S`39=pDV13|TnQJiMs3aqo zPF8c94rSn?eS;o>p!>i)mz1E;pzMADMx zi}*!C1iq+F*aB}YEI;&fx}ejPdCHs$15u5OPY8=0q#wNIh9Yd>OOrdnh8qLIxMH^@ zOrj7Ea`m3wDwx&>|L=Prr zHZ@W3;0!ZnbJt4f~?gPAurM{RKEKw_W zz!I4;1m0+(6{W;!v$THiCVpd;5YO!IYBg%-^*CsPbr;t;)JxHa-1UPkEl$Y+&7O6o zadFk2R%K}*lIy0azc>#&2Fsz*(JgflM-Pixw0IX@5MP5iP)5mnueMn5V~_ra5Sw#~ z5g+uwk#)$h(710bQL=xw*0zkW*lBV6zJ#YdoeA#yy-jU+^{8lB8Fv7{0gBp8Hh9S~ z3?+1mM7o+p33M3yHG{_Mkkxr(<3%dofWTY}5<(2H09yWD7L)RafGDJHXmwtgx45{| zz8tOdSk8FI(fRT5?EL(vgAE@?Z;AH%Q_IHpcA}s-ws3TruBT}ZFst@cji3vOEo1}>FG#hdK*<4;YgK@766xnB{97@~h zLgA`g%jC~1Jwz_Di4vw7E5wl=l=K^Mhp{qJNSK4Jcb=FX)S^x4Lg6@d)4*QPOZTku zoIn@7e|TWhg>50s*pC{%hlCSvdQPQijVHW^^$yPnC|dvE3CgdI3Ga}N69p93+x{~| zZw*g&Mh?QbFce!ojKAfnQLv7ZaDItxHrxq$AxEV*ILd*+d_O`zMIC9W#f%klHT$7vEfA&d5P!RQMJ6@oS;w`zVOF9xE}-A<3- zj>ZLEP5xSS$oT#G$=o85kouNr3K{XRjf!JXyTwA zxU>`B{(3GQ$YkN`S{S|>uYoqNF0;yk#f+t-6L@;IjDB8zHiVN zrZ%OL{=#1_H7de?opqD(r7q)&q7J9HVCx0RDMIx;GG2UY{%fjdeF!-y!XcqaAOvou zUX%cNx0&1}&K8S-uGM;D^N%EORl>e%BU;4RT1h@%DhSYNN(vwi>*eQX3B!ljUI>vW zVX@XmP@$^R4KF+(*Cl)q{0=N)##wGsM>_@pI@c8j`Q9Xgqz}g03=5E!3Ry;Wo9XMj z1U$E%0k+$b;zm@hz#-;$4Ul{l?)s4K_IN;^beHIXKsU|?Io_CH=;gkI1(p;p?VpzR zc*i#|vz(CW-9W%L22^UW9tSc49JHtktR3>#Yu)9)9-$z$sTowuShZN66aGTjze;hA^JRqx7A%No6TH7b&#gEIgkPTO{$rzB2&hk z^ujU@#bWM-LL)@7ki5FJc=KgR>VF+X*V1SU>t7GwY#3s-;MK>pXC)1@nyz33kyZuz z#N<_WJ>#+@Y{Rm1qSC_y+0XK(kf73+&*x5)y<$j~>iht45HSxB>xoS9W4yg6*sHg% z1zRbWujlSlI$|u1a9(z ze``yB92f;i0M>~{*9G(7Yfbfp9gv%tV@W-Jt!aG=3@@+};n9)V)nT0bnqUh^1;s+?k$KT8z`Oa|fcMm^XAB(qmuNg!ty`hQXyO5*(xp$+{sX zI$uWmcGubW&!&cch{li7nA?>G4XxkHiBF`P<>^q!@3o46yeQA72;;@AIzj6m_vB2+ z^aGbPVOiL5O6O@6uSmgjld<>_0F{_8MEOKy@no3nMmo(LJ_bDW&_8+p31DegzK`Vg zY>}ZWo*f_C$jm(l)k!3w{XR+1J{gp$cUT^rG)BFc!AxCD{O-ur$G zmT32A(WJ48&7;lx;tV>7Ie|;NLL42(S5|HLK2x@7Pm5rtj1L2pDha-p(z{p$5?WLF zh?Ynp{GrGZl^p6b!gqEYRw}zi`N+n(xt;Mmk^Na3qYSu1ec^2eKn8!}xvH(LUAkdSC)J}OtK>^~sSaC=(ndVc9a$XxEn2(2Im+07U zGTEk2RgA}c+Ff^}(H7qg9Wwj9e1_9b_VBa91)$poa#a{^CkBPm;{>gq?%kAokEIsz z;aG(lTj^xgcp@;(Gk)Zr2-{8aVn3X+ej^9$&vn1b+U}$@QryW~%Kt=Z|52Y6Nibtk zI)8HBtAQnnSp#)Yd7tq1-gDDW9J%$dDo2Au2~nE)CW=mLN?`7$%)WvT45FX)3d?ds z??%Q%B0_;1_CKFEku_;#(s1t1N>lx?G&oLod{hpLTMZNR7G{hT#RU+D$?u;~3RRE> zuRF_Hj8$-xE3riL#b!x<DU*)83XBuUCY%R2w!!PmSeavaTvFS7`~WZdzYyLo-n#KLmzj#PuQ`)Xx|;6x4oicyii zz4l2c848eEABXz=e5POiP?=t8cT3VN{6ohi3j5wcGpzTMwikpDqc>Xv*_qT}{jEb; z+P;Sv%LTG!r@(}ns)TaPM+Qa58de62IsgN|6E?~I6q(Yu=wJeH{H9`N&;ce*Qg-(b z`JS4>kB0RZJJrHl;kA#wg46iD$sy?hn^MjeqI1{Ag zlBqBspZEBXt1V@~9BTZZ-~c>Fg(bSkE0qX^Y=0_4AcPq(hHqjkexr@f{SK5*gK+ly zAct7S!g$=zZ~gTi2oOga?tBCGbR`?8z8wVm13HOE(Y2)Nj1~DhFi;d%`(n^uz3PtJ z2_X1Z^uNyA-=t5-M|nCru3VNF2oc3H(0B%11LW>el)ew$o0*Q5`6Pb=h_^-XbkA*i z>msfCJ(0UtE|LKL$X}IFaTa1_lM=a+p-=UXA>xJ==Kz`JRC?yUW|ZVARpV|bZX><> zD%+J2^bh9we{=v-f%qI%IB)f;%XJ?TYj0)-+J6H6_QFD4OAeN;B_oRGB3$0Y46dlj z%l5epS8PLMLNQk5Xm%-HVt)i(I41TzrhmU96$ciFqbH6q(P|I<%w6n+u7f^^oP0mQ z-oxTR9FV2LW%Lgk4I$`5)1c8)%z))}b?2<6q)gosKsdc^lalPVvn;>vj3Pt~utYPW zX_Kf|`HDS*(zhm?Ucj4aoI=Dqi&H8!X}s&}?Xo$hBwCzUyo0R>BafkqKr3s0IT^n% z%5%hpY?j@EI8Gv`>8F!t61@RzB*j`sgb=2@5TFM?E==0l1fa39@6ayOWp6Lp6PLS! z96VAoR5qSO>O{<6)V?7W>+Po;W*NZ~mZj@)tlwqBy(2Lgm35%^1 zQmkW_N`{t&l+GitdyMT@^s_`#ujA_bj8Sj0O41w%%Y^9!mpQZhO3mW|(hdd@?R;=Szq+Q#G_E4Ou{@ljX(VWNdixN5`ALKD_yH&n zFMXSDw#>(T71G~$vv>2TR7(yl;imt7$`;(vgPpU8@9LDbEK`B~j(7|_jZk1z$dIe! zFd0T7HE;$6`)CM5D?a=*oZxX=f&JriFO^G;QR_80;z#uM3;tZK2h@7sMn2*x47`>e zVZ7lp%-#vT%UnQ9ECF>eQlKplXGD0?q0rh$jbXt~^z5cHQGIsI{XwSJSfCGW%NtB89+%^%md)XoSzS?l+w*a0s`*S;oy+bVw&%C+Z|SnY2|VvO`= zMhb~t^hO9h4Oi^hJtwwAyy4zAtqKr2kj`d{>a1A)v0%>iSYELn zsXc&?c*^Gjot~@89)Aw0N8rh->cM10viy=CB!(Mic`4Hueh9y55VQ-cAvPq1ZV8Ak zCpUnDzh??U2+DIde_lT2OOWivks33Akq(CyI#ez16`wKD)4RX}-<$(?Vaq*Qf}C zlc*RN)J2t;a%~6y0el|t>Umn!liAJK+7~_0z@bMCE|ekowi|}Mz_Bz$GEzn{ zQ@r##A7ht-b;*b@{36p%b#-#AHpXhct;4FJ>h7z=p`}6a^?ilcTb-?J*Es&?(nf4y zNw*a*$?q#IT4IZvF=6CTz)Ou#m_F|Q+y*9-q!XhSHd*Fh=5U}w7$>I@;S|8+T4G(g;v zn82FsnQgK_T=0*Cb}Sx#%zf8w>^x@*RM9W}mV{x01-*1{j6-v=R%Xs=rDJ+jI@C*m zpAl@5cpkCaBR^0TwxhKKN95cwjT zBwVl}F{Ustyceu{ZTeY{D~CW*cZ2iB(hLVHm{+49G3^NN{VuXozLcBqes@RC9GJUR z>>I2Anh@vSAmlSBW;$^`)yobcWX+y|d%9!lJcx*OF@jY99|s2YaMbtg=eR|5;rXa> zU%_z9rx;w2R3E*VJ?A$>NE0+ChiYaN0rb;TJ>zYU^*mm4>aKmP38I;O?G+9!v5A!r z5j^RoW!6p-B$aOg{G*CI{YF2;Cp6IV_OAqA%Z@Uq#AYMt6dT{NH>e;ysR^C&c$qf6 zAmZNd-_|yte?7{c*to&VH^y|BJE2eK$6s@fX%+)P{f`U zo(=3rsRa>bJGG!Kl={;m-5S3* z2r-4|f9&OUi$DAt5!{FZT3de_u>*)dGK?zeqD}4AF-LQm6U*O0fotB1Hg6w=2U(Bl zzo35!d#~bjb#ikutONi}Z7k|DuvEg-4kZ_!FB6}?!Ttl&>~f#`y}F*rn4sdU1dxVx z(~=f@uP`pzcg4b%`cXG9ZXM@~LF9B}Fvk=9_r{h)0vLJmB#jaXCfwI;L~pU7foA4#NviMT`7L zFaTZxLCSunXwoal=p~xTXwU?O4pT9G^UV*nMOi`4OV|Ko9sT;8-<6rL!jv8?rq9zh z4D_=As_BYE9B@su+xj{sS#^`?WvK>g%q1xxWodJ)L8Ikz()P@f1A{gx=z000OIQz3 zk(A_Pgt|I#9CY((h`<~%qH!g(cTZ-CjcK&IOgrB!vZb?`z$eJ!#~^abW`9G;@aSUh zM0{ynb>`#PSQ+7&h$l?Bn@m6vVD~!-Ba+Ez3IlALjN`YI;f2VNV}-QE|h!EdEHObX?~R8NA+Zc!PCu-L%)rax#+Ay zNria5O(P`=3BOa@F}0Ah-6?-1UXdTqX=JfaHM;~aVepb%Fyp)tp3(#r;Q@-G`}G0S zJDX8obR}`DiIgqUe418rWorV+TzCxYQvJCK3KZD_&_6P==vJIP&L&pC#baxK&_za1 zcMLjv0Uk(o9U$;+C8`V(Jj={6&L5F7AA{cC`ryGc9|uQR^=>N94F!#kVL0JMNGk^R zR%0s~b|GA2s5tUUr;A1tK$Pd&ySDsgUX!`>Ce?Y>i6W8SV<%G5PqPx*vm_E(>C$*T zm`)6QSUi;YgCPYxSaw4QI2!)>ioP@87kXSH{^eWmxg^uTLW_h+SPe^M zOAbV@eyhHJomIB_i;|;nLlECZmv;TV`{wQh{Ujd;qaTsxYsiNuBy+3sTEY*hs&`Yj zCE;_Y>%}>H>k*3hEq7eTZNr=fEq_Pvavx1voXsgEd<-Z4WSmInXCoy7cb~Lq1qKAH zVnTvh_)}VL!a%S&6Hm0KNDFncM0O(B1a{6T6(VQvsU8~#;)T&w>NHCyBcZUmEd+;@ zGZ!$eZN@K|^-(D;QJ7MMxk?-E9);=AnT(r*#v9oybGU13qRaZqSC5W|%1`!J&ttwN z!!D$eELW5AhEX<$mR{$C^ZzD$1^NXU&IW3GUCto+(x$CZp!-SuM=ZC=qw>_q7#ZV4 zmV8G|>pCHuF9R8Kwjg`1TP z!A}k!Hvy#px0#uB{}Q>__I8XzXvZ8iSq#Qyo}%Vw^1*Q#wMlADU1CaAvS4_?%V^mPL@2GWQy)XJKSTbbSs&)<_lx zFfpXubIe$&pGfGZ!e%{qAEc{17ps2tuFpJs8b*3E)zht|>)~(&Eo7@pPcS*Fb`T`MX6%s#ZrrJ@U=scY|D05MY61BZ@OEZAmZx#qB|2 zY&b)FEH+|pE%RNfVoruP^>=@LjE{MADXfsxrT`?DXoT$4b{a=MeQ$aDZ^Oof5?v_S zFoX8;P(wH)avr#v!XCQ!-12EAx>Ua653v%4zB<_se2sQe@YUX9I{%aA^olY;)mU)%b0_w!4wbHr;F&dzK&K` z*?%4)rVDEC6)6ogrYo3^uaFq7140o%*UQDUjdj#lPmJ1Jc%x6XvYsH{iB~Hcc zr8R9#BF~+_q2iy5UGT`EoRG-P_x7nEFIOGgSRGVtI?jZ&@iq(bZ=r=7tX5T~WZ?$R zQXZ~vgg;~OAam5oE!#pY%VM}ys#$dCg-rOwk4(=qhvO_ki=pg$dI{(jy-9{U%vJc{ zt%DptJmJJMCF5fM4Zx(bFIrVQ2N)D9rZi85g18W3=+oKif0^{T4Is!)BiVF zCsn^1h(?ZemL%8xu@Nx!D&D({pk{65bErWJddMDT99M==hbEy9<_a)@BP8z6vX(zL z{b6RlW27`Ny^QNe{GflC<`kAFwdVk{EZCuo=7ZV3%6Vh{a$K+{0xwJv@oWLrwLMrL z!|$ZBuhen7WaF&!vm0$rJV+_PnXa^aMGR9>iHs)O2AwUgq?!KMYjk%?eq(;j zirWa8nicieWV|NZs@cI?qQP_5uh|-ocrlI@-8&Pm!|Q)2Mwx?Yg!Wa+J!w;bB*LHf zqX5i?rPQs9(l*Jr4MMQbrEucxEGw-mid6*3^BaixAkD)l{*|WpMphyPxFq0jDG^P@@)f*CCUwV`);-`j-XjUnZTLnlj0;rD;+3BiU|}hn zkVJk-Z>nuV;bBr%lA?@}(#qdZQ0qp;*UXoQP$YSVy)$PCEW=Rn&37xYgqg^Az^dbz zyr(?c<~`<@TO)GbVCG^%h=1or&gY?&z*Sr~mVfq}DYqdz>8R!S6QBC_N4S?t=Q*WcWRL6D-r1hxgVNy+IcXs~3q~ z+D0bVEGpv1N+omut~n|d-kq@~p0qo4n&;GSK`yaoxWzDyXzwCn3YMF+_Vd?pBAxTgPdfpK?>qYE}3wjS*oi3S`UBjNHS(OYKb^nC`e^S zY?V+>D6xTGD86v_P<0-T=yEd#`vEwIqq-)Wu-;nmXf90OWpE9_(n;XoFA%G}W8_mWS z*0Q#bDPN8393%7ThJ@B+yNs3=-Os;ZVG4BPamN{HUXl;N&9saN7e#V%E8Z&SP(K?Y zRgcpR8BqeWBjcP`W)oBWOP;?`B!6B#M@o%7ivzp9 zNt-c5n_eG|6|W^pbdt@$UtpIOQ7!D@SR^RvD%#1=Y|H?EXaqJvT)t3-0S#o+Y1!)O zu6;ya);SJ4i1CFZkwkJy7Gw5edi$QV#z1<`bVf;$75zRefFYR%R|t#LoH>5D06(x! zZ)5CriFhqF1iTl}qq#?FMM`(9Bk=bTYO^OgD3I-xibQfT#sdS3?W1E_)zTBg%MD;5;H&eSzSGb3+gChvhDF=;@y@6FxoI#bOo1l1n zG6HL|8L?k{ZRT5-E6r6+bDjvh)`e!s2!eGi9b*k6OIq*#^%&S>pcEvzG81GhA0}gsF^pW&-*{t&UMi+|U<1twBWszy; z0Hr(Spo=^95BJ9azI035Ka|+0^gc_vHb(ne#kM!+&j>kxM`614){yS~3o5*gPb$9J zY&#tF`}_M>K@O%ZH`3Bw4fA+c8w3coST(W|=VCJDaSq(B+ks)#=g~!xF+^@&BQ$1h zwwG@czsf^oW|Okl=yDzB>R+-`%83ol%}r2V&o>6<1_QNtbrWo#96lmy zctBK7E0MO=!Mk20X`X{)7SA3F2a}Rxga7&}zgPW#yf5jh_tQH4<-~gVV{xlu?tL3h zqZB`^k}hl~<9(?mVQ^ZWD%13Cd>AUt(4oz!TRC!s(uWauUgWZjhU0(>5Q zrNPdg3v|Hq01-qV1sfF0MroUSF(@wYu=4d_XiAq3+zmh&P|sM%J?vicY_7 z(z`tDE%1?h*v8T*G2qA2U^n1*>3!&gZy9_P^ z3lytjd3I2ilt2{-;sPnZ4uwd+QPWh_K;#nd zlO2Qge>6vMNyf~Ttx2*R3#f|yXl{Aa8eqH(v+bQO^DZ~~Y&N8Nd@$$IQ~j&tPqwo? z=Z-xM^S2akO3Ucr%+bh%h>W-lad7#j4_=@5{*#Y5aYI!j23N{e_b&UJTiH~{t*+9f z(GG?34bLJUmrzjik8z! z{Uto$TP`3Y?{KofcH{fSf5s{3D$H$D2wzo;Y7LQxAjytPgtRG$)mw64P|HhB)$z(W z)BE!pUG4hks^X;vI}eu zQq0D}efe<=IaphFbv7cU)_jlo9^1P^JQ;t!-sxX-mFe1!BqG#R#w}iPO(`nROck_} z53P?0TuB4!mM+ztB3RovJ)#67!e3Ni7Fp)=l5K~HKBo73m+5wSb|;I)I6Cod20y+$ zce#=J80A-TxcBUbbcpN_4y}{w)y}Y86cPJVP7ia55)0KJQxc9Q4+7ocOzdD94l-EM zy}7UYV#T;Txma*DpqM{h>R$6xG|Do(LO%< z>a$x1tSj);=KR^CuzNEJ1(NG68Soikzg>R-AKUdk8IWRfBL)XqfOt$wg0u7`b@tsZw;Z8jI&Y)oeVinTWdVb4&w==EQH3L>nI#UWgX32a3J}pbDS?!^ zLzQk=L-BwAyt&@kEw$5dA8Hq5Z+LoRG4jr*E+h9ynzH40e@btgN3u~8ngK_sYV+5Q z?A7;#@uLC#gxOG8p!Y!}@upMbeHmpiW#}(O>5sj4DLHV)mRIfOYWO#+2Jei;8DwOdi+(}L@m`CbjoeK149k?eR?ztW&b z`?fRqtUeiPQ-`m;4#>)_21SI;A_p$!lCQJ*bcfGYTlbQcpi~O8@65o00V)K0zevov znXM~3J|%v{HLY+WJ}`XI<|6o>Y;{#63dQBaw=n{f(Z+jzw4QzWLvQ#Yo3-5aR{NGB z2(Tg2#ZYKWX);EUNfR&4^h2^*I>%JmdwKK#<>$rq@gzFzQjW&pEQtqRtNT~&q|$?G zt6^~xDrE@@nq(x>&p`Ak0>+M9MNYHc4~BQf_C&EDuiJ7r9N3&T17!ObpPl|0`Cw~7 zV!wMJ;RWNheq=GrwO|XaLIZ0yQn@^9*m1-s|9i*X)OlO$e#Q{rkqZj8;{Nkrvp9#7G)ErIuft zNBK)2=9N~rxqV#a>ym~Uh0{DL!5!#D-lk=jt)Y*yoU!KG%s$BBYs{|2O7{t2yv#ET zC*^01`@ct4C$MbiD;-LjM&xRp;Rn65VmX_F6{i01IR|8z`iH^@fy9 za^FuNyN$8Qj3;hTInP`2lIUeGD4JUc6nW^*7b5G(xaNN|-t|n^c@YU=$gUXRIwEVwQwrAGV0>TfK8*TdInsT-EikIm zh!iSvTB_(A5<7}j62SjP6tOE;*RnfVQmsu0YPBkPQI2@C-50?9=98b!hD>6FZ$}}+ z{tKBF;p68tQ$vbOUmkVb`9b|a@luBFexx=pBd)+8yk>H0u+=^0dS2HDkkz z9I8yT^hxC5WO4bF$$D;%cS)%3vwEMZ0qPJ={6B3nWHZ~xC9-;w_D6HM_-kOq9pkJ> zTu_UR*Gg8vic(gQW*A3o+Yr9m&*o(oPk1@r)yiBWg%RZ- zD2p2XcZS-=$_$VF3d|UNfRjOfsTitstH* zI1$%_obE{13-t}DZ{%hN^V`>0Cb=7FcDl5+KNmN?OQAq9vY}rRWQSrVKmucg+ncw<8(YQc-2L(!*77$ZS^{v2LBn2UVh5`cX`l6azw4#v$;t z83xUg*qqsaZU@i6Fe{IXcC7?FZKgHsc~+~G%OV`We$sP&gn9JGWvO}Me9U(#kkZU& z89QN79;zGp5mXUx_Xd4{w7GfN6Q7XS7yC4@RpFf}EgE3wR;!?2IqRs~Av*-0$+sye|~a zhI(f18rIyE*5B}9GYoAh^eCj7p8^hu3{^*rpjqqE35B>m{W46yUD^7X`JwzHn#}6^ zZegsGB%UVniPWfJ=a!Mqb6 zDE1LCV6!nE$3!bHTCc5(EF23#9!#4*e)^B~c?_oYv86+P+)(q+(dKZGqD$|4AK*Yv z1&I{E3GOgC$h>^ERyO$$P-YW-Pul&5r*4;|Q=!j#4i@C`&v`iI>u4I=`9=iMhW+Is z?L%8KyfA0jD!q2z6_pF%( zrBBDNmEO-KsGY4P+^A5DD|tGi?!CU39hqiU>6e$KiH#BdoGfb1-UIp=Wmd~aC_dJF!ajoPbu87d%@z~DCMIjOn(FOf9%i&#_MT(=ny;PxhDNQC zrq@nSjfkSRd1(t5tTd1&-Z{AfPxB-u#<*zFa#Y(ai%G5J z03yT%C_lYbm*+^zl&8ixg*UQDZxCvXZVsFOG@U6-h>JW%yDddTJ)kAQhn3W63l*&f z*2J9EE-^kzQjt%G1QQ;EOO|Pu*XMpce(3&-{HZe%ihM2qa{WO*emU_)xDO+w!UFbw zGdNQKB-x!jcff^~HWFeb3OwUvkRqGMS?QGKq8+51PiSE?trKWu@s$g~W@oS$Dw(3% zV09sa@t@8+Ba5zzctZ6GC!IKlpLe|58^V6t){x|5q%i|AyR@Ly9ll8{2J0nt$Zmxl z?hpnBUugQ4xNW_|!si9yH-37_u)9uCvv5o7j>q*t2HIYRMr-Z*s4C+TcSWB*0M)Us z2veB-deun#dxnsjNFTffXi};+S}{ytr&-|=o;a|FvF=q?C@5CH-+WX=+;KdW7jtOV9G_fN`3$%_krWZ}LUEaqMCD$65*_m(wS*b9v-B=xR zSc_X>oJqHjVPQ2S1n=)xy!(UP8J_ z>i13F{K{B$aX5_D2X-%~Di45P5J?4m>20DvMLQbtL!>zW8Z^y*2FOeEgTF%V%f_}$ zs^LBB1Ag5ctB&Mb6X8!|+IWGBz1!)cBg{EAb=p&M*>*V-w58XXCa75w3mK)2f*#Bd zsmDXkfb?Fac6{qvV5%1hdFt5jCM6KllS5TG9KvaGGleB$j-3z;?(GINN9d=#syi-v zuxE)@V)z3$E&G=Ml?JF6MYTpV?Ih!nYg;BMV^jRo z&M2jF8K<-sNq4-^Y9vSc9+PV{f5{-kcOPy-_pkEg`EZ?~EdBP9;3lg_@eK#n*&GM; z=?~&AEkmnkm%K6NzkeIgzPh$Q>=~9X7c5xzTC;CupY**>{z>k@3o>?HvM%jjI*e~P ztR%#ql~ko3wTKaV_{66#5K3F`fZA2vm(J}flfW^N(VG*Lom1@^`!Xdq>A+gtT?vI> zM%^ljwc(dHD>c^pmMgX`ms6wGr5jmM!%rjs&>-QqXOGQ(Q~*OaTgEnLA+%}($r3v1 z!z7XPRSHVdt)?TzcAkm~EvtD6e0a?IiKb8)EJB>GK8y5kx%kBE91fd>t)14>U)h8= zNrA$;T*_BFwIq^iEhx5iBBgNYHxgwv&m&oRcpy9_w+fe}eqxsEM;KwfyFhK921S7{ z{^BN|2}%(tW)%%3%zfYSb2qOR+N;RzyW5laisaVXYqHad9yT2kY;HhJjf^#cR!B0= zU;KPMl5=5O6e^uF6}=f9WAGY95KmU|w3Itn{|P}*NW?2LxS_+Q6B8h4!dGL&SQJusjQqmpoXy}w!kSw1}A!(D<`)ZX=@lj9!4O9~s^J3a- zWkprwaR-`$B6?D)3zuGk|@j=1$; z671;tO;sC97W`+Fq;Mia^frm;&|FV{GOFVlm)_0&M3&~ZxWahS6dR;!Ifz7SMR)SX z1YC0A-vp!g8>$_`9{W$xPqSmZq^p)JLVqZCMXw-E5rH%YZ(~{s_#r?ah%hU=NX~PXHsU}AQ6I?EB@EC|QuT6q$Pd?Fw^A|U^$n* zn?ne2>iqq#-Lkgon#5|z@4gSuP^)r^WTME$M~iELY;}Soon)03heB|3bk=3$fGsl_ zwc6%+f052?ST~#lb@XtDO7TYWf>ebqhd=GU;<(ithtX40e2Df7)Ii^ye$fA&5 zy89`o<}L4OG84tHYUgv%EPMkhG<{GR`!-tX?8`Z0QIVy#=X8#g;iQvyY1L*Dwhro7 zVTXryhhgC3*Pb8*?%LD2bEYEHve0?AM#J%+g1A7gdw1*zhF1FF%04~8g0${G2}54V zG)7XeZu9Bt23icpv)%Fu2ZWz#{k=tJVryc0UPZ}OjMD$2!(F}s?Nkzo&dA3S*NQMV{JBTvS#C}kjbHv^fTEkvphn|%w!*9O1EOaDlep(qxg4a)>3Ipz>Lz7DfwkNZRd6d4UnmunQ8MEPQ zQdH_>Jw+BT{~U_1lOrMu^Zg~SBgNNKAlep;pnj0+My|<9Jn3S3~8wJHe2&*os+A__NUF=O|w|(qz zjSk*9X#5#_uv}2Br+1>5+(U~cI-khp_Owcs?7Qm(MR$?IV5vs~d??CH>hZ3h=(2E;E6OR3GA;qU9n6&yMlAC|EOp;`~Z5tuDWXwaJm zRpc@h!FMi2JjL-%HVM7oYap^y+tl)EkF8=XSayvjDJs@H_F85x*4!RuCu(3JV;djU zet(o4Y|W^-c@>J6nB0k{eybdKKZNcu-b~u33;d8t4b4|LOF-W5mr%_Q`SChIb3Q=? z-Pgk?TsWJt=(pBHne-ZHwP^6r!wuKId^AjUO+c4KP347Gg&Q62&OG z?Jp<$hp$BX-nSO=U;r%}m6G4>uhc|#_XM}f%Q~(5`AUdPMW{xQzRvoPU4K>J>@7;~(7#A-Y>7EIqejMF^4n^^RtQ zabEf;#|dtbadp0p=3x0J7-D_|G{3R#^6=f809O{LLb;#dXR9y=vaVVPga%V9DUd(M zdTT{Z(zEvn#umL(-%1P7^F6iy4r#Q{H9m3$=~`Ki_|kjlmo? zrt>e((>c{Lm*R2Xi&n7ZNTkk@s~j#qmmhbF zH;ER%g%ZkLF5yz_5c7HhAN=(9uYu3g0&69;LfOGMe4SV_SS53GbV7gbhM0@-g1_$$ z$6H56;Oogk$2iWOvbnL~hlhx;qvEHQsQxZo@*_~zyLnTe;l~gBr^Kv(jQ$Pp->YVM zR`BDw=ZUubHPK1K*8BaGvbP*V#~`O?A)`|;j=O^ZdNs-!|8T|pMkmGcLN^x_HL;iRC)bKi)!mBSQHilreLzm3}r{t#`CP#MEhyyX% zf^@CpSb@ighrS>zW;LuEAM&^=)Pm2V5Wuf)NAlb~v$M?GG{AZgWQBV-S0V8un{Y*W zj-PVX?Qqma)w3~VE^>WVHHK)sJmeGP+duau0s!A{gs6?rwW2QhLeA3)e`o@&`x9L`ocV|MdWY=NL3j-oqh<4OGuZUKG8MnqX2xU}kv*)feNbq$Vq+ zCkQ1K#i<{?nD(s8Y0wgn#l2>DW==_Z#tDD2F*w}vGt&cd@(X-G@@f_{5&I2s$2lNA zW!r6kLg$}dA`*Nj-jYV`o;~8&@+jVrmO-8cRh};F6ukrOzOM#1{AU&aR9NeQ3hT_B zV_|m!#P0lcEruAM7Ix_Ca{=Wcx?N_fblkQ)GjRR1Rq$U=Kk?383O@)3SXRxO@&nLa zEuxXaN0Gy}uNFW#Q9P&5u8TL2_ijz}CqJrr$eu z_WFzol*PT3d?W5M|Au-1>AR6lVDUOD7L~h9hIpThMkf0^z7THZfK{GacZd!Dfx1|@4YAD<1l)t!7?nhbCvIhgV4 zFzax8`F6Z_q=Z*}oW%{M&QSDUd;cF>{I^N|=ZiuO+h225C?1uVxl@s?`2Y6hK^zb6 zerWCuXD9&v>RnO6e=h5PIh_Ce3O^BsLXEFxmGP!ya4!51EbK-MXSOUgWe<9YVrpN+oGh^5W{a<=O2!q9sG z{mCMu=J8nOv#^;;JD(x@Pc`e2%D_I&(~L#mQ#v^={{l zP6jc}b`w|K{f*$i1zFi1|o%4Bi z*?!}W7lD-*YYFm}HQS`o3Y!9ETJ7O>>GO3SDy>FUu0g)H3l*n0tU=I2oBwT7Vc#6giIXb!ndBmzVk1p~a$u-A2g~3;L08)M~ z1QcE)opp2M2$b3cH^rrw`f3?{=207U1uUY{-j1nO7^k~1sO!0EUDy{UpN3+Ri@?8gj~T!*@FgSCgpjBIUAt>2Gc?l)Ybm*5hDq+7^*@6JNQe;*nD?TIZLDgNUK=73$k zq!1ZGLgP~tbIPefold$4G-}D9<;a4czo=>U8lb1pFaS^4yGWGPL zF4x(lH_+hzI{i(7Nz4o2eZ#Y*U1yOGyoS}_YZDg|DyQ3vbPBfQ07B2dr*IDeR{hzJ zzSo+;UvHs*FdK6&&D81jOCp}%8`+b+7Km%pD%jzheT9N8ZwyLbC4Iy3H>?eO^f$u# zPj?Q)TUG4;ScEa>jwr76-yhvp->5lv#(Zi&eAQub_IuBsI0k%MPPRicU@)2&$5dZZ zbr5r2?1f*H{@Vllw@+sE1^lrNbD`&} z)uqEZr);rab^W&&bL_G`+O2J2J?B}TSwxjKoUd&p!`r6-J% zuD=G5=(w4Bo0z5quit);3`_XXm7kil%Yd;dMXLOJS|ctMI|)KL&6+dr`PxmF`GB7A zIrCoPuBpJ3gwt_HE+^}w7{1u{!u4-?e30=<05su-fE+wIbrxmL7pZv-OwVOAU4pFR z9r6;^e0L5H<9Ru+Yn9_Z)?{r+q6>xP_h#*z(?zAX&za>!>Ri&b#tkVB1CAc)=NIjp zuV+s4)T0^l;ILZn>V0!ysE|g9o0Ov<$a!b{n+rj|XdGWEZ)_MaIlbE2X1d9y<@@pc z%c2)E>(qy~eSUPf=lht2%!S-zvw4XrwtlrAG4ELiX@mE{*su&NjF?Eu zHKWhf>gundK;d%AA)5~?R5d6x1!N+0rF^M&mE_`jUHiO{! zAYZ7Y>9kFB6xq_RXkGR8fA9nGa{p@4_X7-MYQeQKk#8brJ&ts3l0RdxQb(RyeeV)e zcSy#z;199+ZYa-RC3orrs97Plypbd)0io%P+Hm4>Ysyd+ zqdHTB;$-O(H?|Z-%@QEmI|v}j#(MmY(pWD_3ooNrKH0X_&!e_50_HU!fuN1^{w=PL zw`Qe#Hq~MJ?Sx-C8eCc|qAt9f#D?Zfwt$(GC=^SfjCK-MqgRl!s_mRA{UuGU4YwCM`b zDfnamy}q`XA-ZAl0skw$A3Pf_c(;_HWnp;TpSDvc3JquMPS8y)85u4O?eFT$dp3ja z9_>BcG#Z^*>hj6%USVl;I3e3xLXH}Z{*LC=%BnxhTT-T2tGDv)T1rCQS>r^b*ONIA z*3J!>OgXO#I*9{~N);kR$pf0TP0lRA+9;Kfsnzop%4aKFIfpIEvHnB9M)s}?atan-(8RCQKdXYo~K7#|uy1Q8c4P_S!vV-&sDp+`P1y5;*DY zX0gt2+ZIv#3Mqhud_{G-^bax34g6v&P3O0K7jGC%&}y!;Xw|9yUZ^f%m_PjE_w(l8 zeO{R}KP*CMpVxLa7Wz)2!p&KYZrpqD9+U>6F8;l}?@ z=Lz5v)yKK;UnqM^(??x88$xV$q7B_?>j<~c2a<1NjISarpsxnUhs1ayiO7B50I zjDQxXl!KfW29PnU;;kf<^*tyopo>scRT0R@T21}ii$AZM7)f`>G1&kCB9q@BP=gc* z&%M=^c}%L>K#*lLy?&4h=X?Cz3zIjw7SF58epOHN`P}Op@np>K55=Sou5J_d& z)HB82c&5DhY0eztn^WUNemH)2)h&HO_r9Di@~f6(cRO@zIrR&q?nc;7LUw9Z$#T}Z zKTWVjNFS?Iboj01Y*oXrx4&@{7I?9C0WBTSVv{_MM0&=pdnykH$hr$ zQ@)_0I{0?tZ7!hUL{GUHL4%RE0jB4%oDgMsdF!|CvPb1}lWq1)BfH}+^p5BSA=7kY z1M$UDyMc9Eh@!;ln*&3X#dTd)+PK1)Z_b5|dHBkd$27v0 zOSrIn7A1#wbEEVQJ5YLu&iZ+8#oBLL{qL>>JiqBCqYIddySmaB-7VZUmJ1J}K`)2i zD<38&r;IfO17!q5&t3bWuVxa1R*%ng(eA<&oT6Q)4F}W?0j+lw+-Fm9Piw>bp!=i$ zLUI20JkRoPX9;z(=Iw6)y=CKPm0-=_hPpw1eb3?yL2&M%0$X;o;km42fmbLM-msvl zRUS@_SHNh73rn>tR$X(|S+`B|LkVoKNW?u<{Cay2IZ|2nLz2DySWT0?`;hPI2YS?< zh<8w+wia!;68~Uv0qS_Oe@HrA!!}l-+JnrCp)nTp>9JXVR3Ei@qsCr(hkE?v5WYae zF>!~@3#bWd$dbGJe1xXOlS0!bU0n0)evH`|9CV9AZhGJ5G#B->nDX}C1~_g;*`2Nf z9H|=1FP)@^ZZbv;j~zi+2Nr^hL4vY&_)d27+z%J0?Zlkl4$0Q~zGw^C{YfkAH%?>l z@pI(-E(wj72&aa!wdJ(-gEl}+KAAmeT3!|?$Evv7?4{}2USE3U|4<$A{PCl5za>7B zkmF~P<5QA+g`oEAMndWVs>Uvpbgr^Hr6(V&g)+wygjm0=(xU)?q%N8kajD8g-sUt; zgQUx*TGtM|x#)gyJ#5Ci$qR4;ugoW_8b1|_y{JzZUK%-$0OV*r46? z04b_hjt`B+-p0S|Q4I%1F|4 zCYd*%jO%1f-}X*?NS51{Pz_v8BBp~>y>S~W@+F)z)Z^Hx3uj-|GS};>>#z5$9hJJO z@i~NuUiJ@nCi*BecALz?Oqal~-mdrP3@C4lW(hR0KhhW5nCWSz)fTq}iaMGwUhn6=7jNjHb~t;!OUl`_nEWAN61=pMxd8w?R_ zk-DDG8I9yqt{~Bs$&c=!!hcb#x=xdQDU$#zZJ6l`3=*9R&m~h9mzlW8KzG({iivKj z!o8Gn0$JE$R2S*ik&Zt6_Sd;u;G;}W)ysU5-JZgnaOdVG@hq%UBhL&UXd>A0qdsLaY=3rBhoY9;7k8OGkjuC^3IZqmfbvTckbyZp_|6V*RY_MIof!)a%Sk z7azasqdD~88|^kd5k7EyQ`e=sHo+bzy0q*`RqXC$Ztv4Hy@+$v4sx^6jV*#j+Jx z`b&TZZ{_NHn`NQPjyO?lTezNr8xg;`VLth-x;wEyiw#*%9V#HVOxz<%eR8N*LEPBRg>yq#RxAhQZFbx8JoQs-lUp(W?VVSMk ze~qD^on;}tWgYXX(2=e79RKMGkc(2%^0InD_)O|S^hy?j>Nir{6smLJ)$Wz`K-^Lj zmlhSgE!C3yM}C{dQ^f_9$wF?JW3^NDgvF^yMip|*2{Y;rTsK=q^?;-NQ*Gdx*woz3 z`^c|8Q$DGu@Hf_Hmxkq7!Y`o+NuS|g5r-{Kc`t*nBkE@oJf!GYa_&Ls zjsiRbI)9F!XBobv!Nfem>7*|SGo(AJ2Vvr}n=-tzVVm-Q6j;AV91`G6jX7|bJxD@d zoPHq%%&!t)@5b#c&or6Fz8ac-S2gmtETC#;V<@F`9CXxp6u|jxd`uuW%5?k{P&Xv< zB}ioYJ1N+>(bZz0`q+_!6c@*tNZk|Gl&b~w?NS2Va-;S6dE-CMf0Q3WB^a74z2FMc}CcHH{m?F4iG_@%N*RIN+WVW zYt~7RKa~hke5mJ6jX4(q31Crd1{@*L;S^g*O&r$F!fH5#PeYZZMTin*Ya<^=oluY_ zk9;1SB9zKdd7PcJ?0b{W6*_()_x|c#QN*}BBr=|@l&ytAjcj{1(HIFTTbI$MunZ=H zuXP3Ts5$EI=wmk9E1SJC&UItiAR~g_v_Ri~i!4xE`I1BwC`%TzS?g%C`!obTo$*XB z@#3aA9R)N+tBqbv-`-eJs^aV(Kv8)Hkb8)Ln|YT(*Cb|lHK9V))#+?QGmh}+NG=%! z-SSxjRIZzMGuloTD%IYJ$;pcA(6d6RI*(D~X9kG7TYpUqIFK`ElOo?4cX}OF(us&X zx%OE?gnmxS{Xo_N!vF32R2}PZRcKTi;y-%nuZ-w502)V3XDSo4jQV_&Zte;qdx&ca zzJaaYrJm&69EJD{%)4wvqWE@WC0oU{Q~9!peuU=P?E4Z+2>(7vyFWCiTvzuz`mm)LH?r@!2G)L(~6WnTx^`r?zHJS52q3?+@ ze*@}-m-XluKp6BS7jMXAq>tivA|L53=7u)G`o-eBRP);{t{2qcpI~$vH zST+JryM^S|9{_drK+#OBQHQ^{&`r36gm=SVXgjg#oM0n(F1_jwk+938bROo>_{I&N z$Q-!bAJzBoLZ@2^-D48Zpq)35tYxw%K_X^Av*0djyS8;AD;>EN&av`tlVhYHiz|M)wg7#QGN_b5(ZdFRhNb$(UY7x7k>ah)B=PPO>+FM>ko-UL@h8E z-PY?3I^!O2wNcD&Df#hSDGl)!p)`bjzt1K4Z8IkhRsnLUW+9B-pDp`<)+AK*FUM5- z^V%K?TJPVN_BJ(ug1z6;TjyD<-W|1!rN5X@As*ovgN(M&SG z(91Q={LDU5E@kfzh?*p}*3Nqu@Cb-JOB#UV~w6}L_iv7`Yu zh~46Lf7*E3HpbIq6{~Jm51|ta)yxp-rB@^AQWMf{0=Nz0Ue=5r6b7IPv#Qt4`@08? z#uw@OQI`NuR9*XBxVPgHU-l`j$9C$g|D#y+7sf-V06^t>xjH%<&~;Gs(Q08Jf}ABL zI!qOb1L{_C*sVkV@?wV{nvI1UlrE_a@nOHEP9-C0!I`Z$MyRbe|S%n zn3#LEHK;deN3!jdHr?3vet13skw9<$PQ6rVT3$d|Ag3Z9<1Y3=Tj5;v^Wtj7V9WVq z8f&$_>B~e$MFX6KB?#F#r-O*;Dq6MBQNuHBTOf(98f*}wno5k&U*%V$)`-V9EZOE7PFq)Bp_?lU zZ1VM=PUM!`TXR9OL9W(7@;%P2BOf*>c*Zq}@URJ$t-sG7+FvjVj~BY;f- zD}qLGbn2y8PGYBj=?PmZ1uxYy-SYE9-Je z!IEEUKyRq5NJGWw=g9Vo!K-=3Cn@6O8&j1nA{-!!FE8i3^UFc&UQcGm%T*DjirynG zzh;JbnXftI=$vh%WK_~hYNcIl18hUT9&+jN1I@GL>)Z5fkr7S8pl^6s*=tWMg;sno zA=$N05up-v!SbRd5~903_TcL=of|=Aiigl9nU*Y0DSmu)9vw9j0`u;yB@xAOH1#um zFX4e>K84lQFl}qyoYC#kej7*mF+clfM=b(ax84cM1qyed$+B(+KYp!oFklm+EZfoHWut>Z0j)F^g@K29KbmG1y z?D2=z?3v^{8VgH4koa2+IF5|qVUDC_&6JbC1b4!j|M_7M*RnL2BroKGc2b8bi_NfQ?PurDKtid^7Th{4RyS`jMw3hBm zsfAf>BRazwamcPf#9>$6{&e^Z6ocmtHxDy*UuVe>Dk=4?ceHWMyur4%^3$+#O#AP__`TdoMW5lmxW; z`$?1t>!k(ypnY*TDt?$}&Vyd}c7q{gP)|*>2@ZcN#r^6PPsKfKf>-#do4E$MJRqIT=V{_q(^JH_rK(k9*AJ;zk2j(^ zwq~<{9qA-*Dg@7_L(RDIif))wIEw-KJh%RTo)%s>53n2@J%-)v zF5Si;Hrf{%9c6FU$Vq_nxKx~+4Wvt}tCKS)rzpO{smb0mj=BrvWheqwBS*RiZ1Io7MTuz#8n!nIf zl)tKSV+hbQ^`>cegoz8~_LS|cHcI^BCk?Wn`gk^V|01A+Yom}(Klyys#dBlE;E*N# z(UITh+hp65F0GAEAd7gzAI%w@qwSnpO4`;HTi>~?6rv3`k!Swe96K}uX%2Ep;3D|~ z1nb!>gR>OK!K*P=DoSi;>=A72(@J_iEFz}3Rt$FUo2a|;kt~GAsO(egC;y#qd3yrM zT=5b>3u|0bn#DXwJ&e1c$sb;sec}(tyj;YWNKe+`u}^^6D8MUi2Y1p=EL3+FPs)a_ zc`X%K2|(4}oenPE*Vz_15X6x(qIsiSExSM`D|5%6hkpv&7|EsMjG2EZ(pZoOSup$` ze7V)XeK{}S%iRIIx?`=p_H4&?7Z`fu~#ts^c>I;6Tf~CGft-43%t7haaFq z&o-(RNgjDww=^Wo(tKM3E$Tu$!j9w<=n<}Zi|?)DVrck#JVzr#vq1Kqn=`ELWTiyV zR)pz!2iq;HonD*NI}@TyG?|x&DxN72i~L zwk71r3X@>-c;e5Lz^7nb$X6(Wa=|s2Y+lyi%!;7rA`&X8hM=!>LXdq}>yEF`WvyW| z{xkg2(A@6(l;mK|ZDIPDQrGI(8~24}`;(1+J0#7~yXB5MfL^#nMjHi{!pgZ61^=2g=eXH`48vh&4UC>_*>#!P%KawP zGl+h1MfSzy-pxMc$~KZz;shkiajIfb0pY)LS%ZXDD-#sev?Ake6}A7)&{V(oe-ZW- zKy9_%)-A=MKyZqCi%W5b;7(iIp}4!#qQTv*Sb^fjA;sN-q`13FA-Mc`-+TXi-#hpF z{(t67W-^mx&N+FWefC~^t+juhEqy@le)IFGJy6(6g-N4#<}dCQH)7&s(%M^=UhB3i za-b+fF4k$m*#m0u%C9_X!+&s zy5kFV9cK=y$hVJYN+uXd)8)cAdOo88P?=QY#GPc8%*LLy0i#hIF*3Ff7bwSoA~*Uo z#aU(ShFxqnX4~iq>+$zD!Gm7>udwgG65X4AbH0~kYlrup-)*G~r&SwQB?7<2KJ022 zu!0K2PqwSCAEz16wmr2B_nwoj?5ZJdJu&60&%o<8lfwSg(ZcGhw5VERcGIXWk!R?ga)>)3>OF_~!uk%EsP<+B;b3!qz$$zQRC6eDv)mdD8k9l{3=T8e~ z(hYcmOOveKH1U`NdsgXW!alCH!tU{RH%JcVYLm$Gs3P7G+lxM|*=N!AKH=Pyd^+^N z&Ht?*{Tj*cr*5>~i8dyJVzFvpl2qF_cfI`qGE&ZuEZJhS(GMHkibwYl-Vzo=aI-+$ zkhcfR+B|*Y0qam#jrmYF@hi!15gAvOG7)#Ye@+DT3UHbYX*A`ozyXh*lfF(5=PhH_ z4Ju9EobVfIl{b=*7ienX&%@nEyu${1yqE7jjwE2#5nej=Yri^Bw1CgGp69Z--Ti&~ zzxWH^P|3>v=6QOaSkW9%Go2xO$QzLR#nY%XB4~hm10@n)L3-fbIZ}iAG{F4VEQi~u zct60oMZzRXeIdv)&i+}I~17)1NKI$wcGV^y&eAI z1`s)pC(+;9zGjw1=-NoL%nKOxV>isLza7riQpBAQRG-Rwj3<{MZGmI4iHO%*#F9b& z{FL&R)XwlG&lIi{+ye5EN;HjC&u%8_ngN!IH`OQ;qdP-7N%DrDNSrxzO%?A>&J_0JmG&NO_JA@36i95GO_kYos5B>v5y#)y>_@%T)}Pq`;+? zQGDBQc#IVbuqh);?aGu@(1(?W2U&1ze;OW5=TtsXe~=5VH~m8NaLcMEuQC0@1rj-D z8xpeAcA)$9P}XUnq{hoNa5KmD~RInVco?m)4+{ckWVqRNv;UzisbrpT6`T<#P_t zFnrmK3p;aJIGN(-{$zP|%I3P?WzVPbR6Wyb;CT{UE=oIN;L8w8X~v*JY`R=DGy$u7nEr@GU(M*@`qYOky zaI2nd7GC$;-|zK!jy2)l1_Mq)@X#|GB@YslQ*4LW&4eMGtJs6?$M`K3RJY1ch;ERc zJD~vsMh)I*PlxPHuOf@VmqB5olf<8XXf`3U%z6xNr5PPK4iv8m^)--AJqQjtt7+UN z8`&W&P$z!zSmb@)#b32n46&*rv!8AE?}++1{svA*@rmk_cM*$tyFotSezX0W6Ol!+ z4`=N(EA^C7-gGs!azP;=67}gs`;O>Trl0O^7EWR^jYiay=CX$l0`k#(yC}<8T|TRU zkf{#7csi(iccdgf9TikA30Nv+nKDFEvdZMno$r2}@9>RV@py2(Z-b~xyX z#@;-xed8N5vFaUOyi#W55-{Wbn3*CQ4v&#Wfr>&H%4N~<6L4BGoCD?GmW zJAA-%o9VZyTp}EZ5x=Y}(dkA|?OB=Cw~WNdNVL1BGLiMWs`Xk^ZE|-Ckc;$v^5}?9 z4lnlTUXV7Oh#}=IiVtzV7r9(}oZ%LXF7>?cy@aKIo4oiT zl?aGsi#1|)!GSY;fP>6nd)kF5R=oyJR^7%3AE|p;TJN)7Gi*KfQ9@Qdy{UI{CqKnz z?+2x}-p*}O=H{QmdraN$1?!xl<;&HWLFeA*D!YD_p;q=Y4}R8xhJi%)k9?CY0UMLy zg_&o4ba#dKDZf~pcR>B=!C*>$h!C!Kr+^3L_((AHSXSf-wL%4K%o-Z!n$z8to?u=1MCgfvsX z7T8r=VG+~4$r5e#OS3)q*;UiXh}r=HFf_qo|96RFaw#RVj8x)x$%lUC_-iA-r`o|4 zKXM+dDHQps94j)+nOitKka2s_{yHVNtJ7B}t!n1W&Yl06*RvyLDrKZI5to=1{@L}W z5X28YW4$2v@( z#)d`F_R%ro;{J8Mf+d$XC~>v(@pH7OmN&h>ft zR&4PUZm40J%C6@EgzvbRS;~I_Xx-rbO-2_N%LMt(u$t%ng zp_&PU&d)G#k2)S3wZLuz=|gw}5p-j(W^5O8P=c3qmn^d;HVk>Q?Y$P?6%I2f1|cFDIo{ zW3jV0jJULGDVZKTxx-fTo3AlBAB%{2&SHzVlIVIpSNx4W23eokzM@+&@ovO3jLCY> zvzxcNV6%sk7c64BM-`4B!zNs?nQ#aT5k_Jsnm1;jxJLmq404N_9hi5W44#84waXI6 z>b}bQ>SFjmN^=sr@B0)}=UY#ly*j@)eJ<%E4b0m2Tvkq<^XQM&F&g7AihX0!&{4hb zS$Me)dYNR2R=r!6#268NqpV(#Yd+aAGUs~YJyxk+n+^nSC7pxrVTE#h3ARDIq#8?< zt{|_qc~sK0O#}98m-xY)3Zo`oDF1eBxj|EVjLci=OjuVypD2|3^B+WR_`KI5d8a!f z2;P)b^6_GmLKQA}ziFW(=@une2IJh6or&VohoqFISe7qx*<+C5N4iLyJH$6+f&wU;x%h zVx=SRJtR0b1L-BMrm`7~`%J-QAcG3mc8fpz?B-i_1~)4bTIIi2uBqb6ydR);Xos6x z!U`S;=7ZkrJ96y`zPakU**FUVF4MT+dF9ZoZs6sX8Q4CCS?YM__eJe20yElYIS}o7 z!eUs}d1bd~ujE&6>(Eyq#l?>JqGhG@p41YY#&o_p^@|(yTqMPP7rc>a@wxFq)@8ep z?ln0-JeAC?>Kqx{2&ucxOOnLzcLkI1jb zBwDJfzpK{4B;J%XWK;D+HE0$;D)jH`x5U<&iJf9$T7wm1zjxPp{a6ZyGrJe}sNpmI zt{-TKzrW^NA^Aji@Oqz}MkxMJ0U{!tS@ZiJ5}N>YwhvL3ojycKq-}PX(6%0~Yf8K7JqDI531a|ye z(Z=_`c;ers-st7SalZ6DIQ#zZAI%6CHyq-09;x(vli2xPbHeWQxq@ze1+31~`{9*B z)4#c@`RKpM|1X;VdihTU$X7GsuYYlB^&Hwpe4va$>)S6M#};_Xm3?q48Gh(BG5>Gg z@qgT(yT2BmPZV(_15HVwZctfn;!Mc{Sg~Zh%?9 z{qgLC|E27|AXfez`)^$Tj`mIve;4TwHJZ$Imgm}afr|@vaE|H!SFiF?dQDE^Ux;M{ zvRzN)TEaGeKua%VRUD4ar4=$H-G$OcFl4hHg=V(5zS}JRizm;2@8kbiO+QJ#>NDcU z;=o#5vQ}r%)t?Vl=a+(_^G@JRi$Fc0fuqM0xGb@D=3lI(|3%z}QaL?5*IiSbIn(Xt zcqGWtp~k+0C`87}DRLl>( zlkvRcWHqsmmONfi#ZpS9ZW}E`p!mN%!q{J;!P3^2V#v5xQmP)l=typ<2ckLI646j0 z{M&=00u?d;N#8eXyEJel=k$PB^Rc8(%kO|xP~apsFGUR-l>mVA^4}j{MG=G4R+l|S zbLL?dd8c6`lsz(~VvAF2D%Jje%}$@hr2qX1!>@(y<=3EyX#@2~g;{sExRAU2EfI^p z`(+RqVfJc=FU*C{M(^KV?_amVI34gdTX>d06XHt#I%|2ppS7prI^qNiBkpd})xk3~ z$)XL9-OpKDQnTd$eIj9D;_AnyT53Ea?neg4;}r8e?}bP=&gxzMNd-(pmZ!0rXJ%$zHWj~? zUbCU+D6ooV&TNHl$B;NmJ~GX^KdjXVLrtimyD7>Z^okT7$3lj#IVgNsiW3L*sGu+Z zI65cr21x~`SoQ0n%IVts<9T9mgE52cSPBuYZ{*W6LDGs#y%C>8>?<1^Gm)V);(SbO zY#t3C4wr7u2@JF6>wHUWZIk4<)p8e3rf`X^XD6~-E)3k=V>-fk9T(Q#kcO9dxmXWb zJNATjmZ}%(!;*Eibab{C#^T!?Ar77oH?`UBdA3&l(K-$X^*({GkLPN~ju+d6ERW0c z^J(La)Ycf3GmjWlb2nPYbKT*Uzq4#s9M&>c^?B-r0s}wUujLj8PYcN6iT?eNiM+Ws zDvUN#VQG#uaLJuwVP~PKou5UbeEOejJ1tdwvUIYlJ)o6T$RXQ1KgMnMxFZdYGOLup7NUia*jc3vRnRwQSOav1&oKdunFEwsuxdIXUDy z4JjkTpFSli6K8GgQ5F{#_8hM?^fc6yLAD*BnpmhGGvq!QiA|>@C*N?^eI8+$b-Pi+ z(rtfG#<34hyU_L}H_07Oc4fdhp8qw%V^Co0R)hcN&z~iHp|Br6yo+WC@V8XVqovzgZjZkybZ-)k8a{2k$e~?~?RZtr;-hdv#kGE%;aqj@#-9rewjVA> zUUfn>fq6py3hMGiUA5SM24-*USe7ftPDW3fmTs#?u7&7zp1B_F;C~JoCdP2=`>uA_ zZ+1%`yC01Ih&oQM@zO>8W#T$@po%XO+{@9VOH>+Q0lX7@UV3@larWRw6g`*u8RL7d z>?Tvm2J1pK=cGmQ47yJ`qWV)9cgK!>dd+_lBalOdi`<={6;9T1`XBJyd59*ucQRUzGAdOeS5z zr{3Gs?4yvG%&^jxSbIUYuWcNuR&Kp-k@kFx+2NPM#6(`7P=8Rop#6dy_s2_-INz(I zpXaURMm?ecRa6-9hj&6srIw5O_*Gf^JIY2{e9J~sF|SdUPnLz2;IY7U61+fciU2yv z?%3Gi3{V~YI*MJEEj>Iu{HsPR;31?)MCdbuNQW&JxsBZ2W5bildNNW~sYU)_jS@=^ z3NNM}89er)-0WrWy;FUxA-6eb{_jwruZ!^c^X9TXUW9^zqOWH*bAG^2Z=v;dO>OP1 znJS&nCMRRB2#*-GwDk1q{Pc>f^W$1@o_(?J-uQgb5f~av7Z`~l`Cv-(sYI{Cq0*MZ zI9c{HQWb!x^~r3(`;!N%r$OArMB#F-e=FjqPwk5r z&hR$j0o-&<-~xO@N-#qQ4d-^-25Ty%?@1dAe{E|WZ)MHmyW;#F&3TTV@0%UNjyPn8 zVM_E)Jd?G70M3p!XvT*A9;*?cq3#ZSG*ZZ?Xe9mvPrJK<z;eB>ia)%)+Go^=~R)^eBb;6fhl}m7a21Ijpw#krs7( z6OS@aDxv-Y|LlJy^CB9OkFRY*Fr{G996cVse*a|H*4D;qv-YjH&}MM3X4=U2uATjB z1W;=3mbszy_3(;6THM`9)k!;n?-LUX(;u0<%*-I}jV58=#cpC(!C{YXIyV>fMUbB8_%o68^K6!Ud>Tm^}`rx%Qvd^ z2;q1`p7&&DWfld;SVcKqcEOBoe5E>(OjUJ?)X+NBUa)m)W@IvR2EGOm@H%OjG!5Tb zU$Hoq4NJ;Rn`qPKx)l4!IC57|X^1tqOf9Z9=Xhz4=?x~Pw2?@2{F86P?O>zf9Y)>T`Rwn+>32 zVGF}RdL7#S1CxCv85*oiRyjbYf%&ieD#wOo#@dm;+k_T6tuwV6J;>~2f9f~ea-t%t z0r+Ru^R*t4=}5w(F(Spw5i3-!V=N>NxmWdqm|RXC^pvE0$w%$Js5v`PBlcPQQhcF9 zv$3lX9-ssamHHLq@i|`+DB_gjG@l0*R>Edx#EFW2Ej^Ijv$&<>;CME_LXlfdTCV%p zQaq6U*{}&!Ln~4Zd-fKC@K*W`=RF)ACl;9CZNs=AXlH*+2GpBB@_c)sP)dpZ!=_FQ0p6x<;F0`(S6WCbi*ua9`%+6J}g0EW^c}H<>6T5 z_E0B;u;*16M?tMemPC}tTVj_vhXQZwriKRZe2O^#6y~@uA$Ly@`IR{ZJ)lR6D(QUf z;?zn#eZTj!o?!-07(A=)UXlL1deaI%s2=4kHjMbMoUM~UnkqvL63l)(sv}oDF~#QQ zQQu~PCx8Reh>)5Lj{M%|; z@gDR+MD-*iUAdGU6XHnPjCKVzh4P8yhGjJJv^LLO7kVkx9$K9`u`5&J-FnsD(5&6~_P zUT@BK0a%IN&<}9C^rS3KrOOuxoU=eb-;QAFCzOPWpbH0z9grDuVzY{Bj!naRt(X9H z!zr!k2Inq*T6lvki2#vQgF2=GN=I*|V2~S=q9VkmVZyJn!^sH(5IQL&VXff9UmP5(s~sesoA#H8Ruf z;e4%XU!FWz4pLBOLV^-q79-~S<_|(jP6)9lJQzsU7 zbv1or_2C1=|HrBJHh+sp24l}g)~Gv>yP=`s%Cs|GDlGWlX0T+m$079WIjoscUwp{m zj#&XINgV!8rj6d|SI!>(&(vExg|f>gQK=>v{jaWx(L2QWMGrJJKk2l2SB>p-ylRxQ zt!o%+rut3V&(J91{j;xq(eYvqi8j^o?ZC4W=4DcCZWT`cKrQ!kh_8O@ogZU!l&n*+r#^SD=m9yxvK_bt< zBoG1Y^REbKW_OeiAA>)BWZ9&4PGlX{vBUl$Oq`lg+TSCJt&6HHyeD($dvN9C-%Wv= zg++PQt<8^j-iYG>_+nLFd0d3%Wxc=!Xs?q6NmXe7bPEkMerd^}V4!h?2rFfV7QJ=Q!DeV%=8==PBpnSpNN=e{|QnI^5)uO`^IG zI~5d9?Bwn5JPx-K?=NgD9k2ZA!EgXsv)~KPR=oyW+%q2~wHwn#Kw{u_g>-S`BcqB5 zw%{3{=YmOAj!>g-FtAm0^!>U>idx>_wEl+NayKW#)IqwMqp1N`e(u8tXd2aHsNZT& zHasRmgux|AOzhJE7otooJ!c+6Z+DGIb$^tyv`WTLu|9WwH|FP)ZjXOj zD(sapfj3kZKiM(;;7sF-r~xiRoL^0gON(y&4UF$+#U{~-m95fjlWeIBNTOv$Fpf6R zC_=72-giZ1-S?|=cS~cqcGg?NCgUD%B#J~WO@;e*6ZljwZuq6&uZ)?tSjfc^jni&^ z^;Fc{^kTijJwP*@7s?iL%0I~8ua5M zID$D+aSmE$bkdOG?u;uG8KKjj{YVG`8+?-fZu(n#2b47W-&Jx_FZrd!*21W<8Bu6> z3qqwGnm~L8D3pT?F zoY>8)1_m?at!q9;w0YR8`cx}7{tCG>|L7x1yRE$KrUeIAgl2u9IrA5dLbCzqu)Ob~ z%zw&F7@<>j}x(&+C{aGs4uhPmyH02g&~^X-E(YB>fpgBx`_}F+TC*IRgbL z5lBYd*0j2okF7i_hb*83mKqQdsdq>n>()9J!duDLk|GG0r&1D5-RU^ObKSe=THswT z?bwp=jL%VFiPOSN__SwKMHgqWI0Va-$20{;+;K}EDQZksF^E{ty)}c0=<;Ya9kn}V zD2cpN>sV3Ei+*(VuTp20aTYdkq5%~1yN35-HZ1vUt|A-! zhNtI=93iw&N>E_R`6{q;ES+;8YVR`QLP;#qK&rvweW_F_JJTO^PE?o#hbkkqhpi|p zl9ULijkEESj>@H#JfEg~TW~^1pPQ74Z-`IGjuo}fR{`>X?QJ5=*-1fg`14=_?NPwo ztP@^!+R&;#qshr&Q2?*|&1)|II~FlEu6ZolSfYb5@kIFqwY(r)n#UrY)IS#R;A@>g z=&RLIRd}!Qk;0G?TQQ%aS6fNuccs(rxJPppUQE@Z@DW7srZV!sS30QkjIPtM^};e~ zmyTi-K#zCe&9Q9T&4nH1HF3_Nqv=5{oE3`geTHecf-2^fCf#?abk{3&wa~y~<3sH} zY`marX;1BdDDm|v`W=Z`_naT4D8(s!R%Winpq$sIO?hG>@vFsGc4wVZO9o)`3~b60 zR^bZ30}gziG$-cSmpCdyV4PBj&&_y7UFQ@uI>vKa_z%nP(1^z&a0~knvild#M5^*& zW_jt_v5+ovij>;1#HS(W^?cM>pq}0xNN$L?n-&Ma;x)JdlV?iwh>9l8;G3dkUwXy7 zAbu3W93@C|gxHwxPciC!v#Y;;3p$JSN{mp8E3vHfmI!+a;l1}Q#wIQ$zIN^b!lN>$ zR3>S^SuRNq2L}gl_f7XS(M$XuKxnck*((GhbtGsM28=jePUQV?2-6hPI@-9iISn*? zbCX{s&*8%C%VFAE;(i;blLS6Ww-%0PPh*SMSW_)GB-%M;$ADy9pqp!@z37bJ5^k}> zM@ITiO_KbIoai6|vy)boNpRDk4I-?q^OmHM*iG(JPjie6?izJe8uM|_i+nDiYdk}U zYp@n~0qv{>PWAeLci%V8zGw!Je|EWffen`-sB~q*yqnsZkr-tl4wmN;3<)s@o<`-&3h3T_o}h(-DiT8^d;k%`57Sv!6wPl|tF0$OVhrbZ~F zLq=IZN9t-!DP`R3Z)XEa!C=U-7%(WkWnhEB0MVU$H%7uhroGbTRrzpQYN|p|OVJ*F(4N8Ps8-zlF27iH&ZG<6JG{Wp72K*^?GZm| zY3P4TR!6jQKb+$!_h@6A@#m;vTUNE`a(^*F?e6?4Df zjD!ETUMAHJ7y9m09wRq?$YY(zE|Nsii zN00zL@fTt}KiMDbu?g+KUG{d`H=(Cag2rH+hVU+0osW`x1IC88W1S+T!D#nUM0bN; zVW&=j16e}7%=V2xH~IQc9jw2{206FcR)1D*=}@-mWsN4S{F%z*_q)AMEu_HI%g^0} zRHq-H+Y+`0{X8IBSL6O4758X*dVl1 zH^eFtUym#F0pSqbVM@v4!xG3Ifc^r!))#DoLnn0#$r6s;C8jZ`FLFHm60sRWOTquxk`7o|J zfT@12jgbL`HO8nO`b4k`7pXTk=1H!r3b7DKuy40~$G_ujs3@dRi6iF=6v+*?SJDSy z){ysS%HXk0HAq)E0fD_Jkwm&p_OKwpZU(}xE*=Ta8yv&8(F6skI1cyB!Vi!-5LPTF zUViQ)&0N@7Aov3y6oC4M^o^a;doResUI2+vjjH?8hNMW)Tw^7?a1Ha|9}mSK((COt z4;=N{Ipv*Xps4+NCfw56f6d4S4R7@NObrBQ09d&R4mc?|2<4G*dubM!YI#BUXtR8q z0d?ETvgwhe^rd3yxT>p3!@-n=z1ae;zi>u<6+V`R?=H1q+=1HkX^S$%F{6okIe<1* z&gd88gi-OGXOcSNK&iOB(e6S}A$0vszb`MSCmcJ&c^pwJ+Lf3T=XfnGVsAX1*8L+6 z6zBK6>ZSh8INdEH6Vx@JU>9i}gBq)g0~IEp>EzBpMspTc8%M;7+)1@1+eFQSzq0z3 z$h(&FPw0CtV#gMXjEk1yF?53Mc{Wq=4Dlnv9OfimOjI&mb_{Q z)1$-QtVfhEH3CzDWBbZA8g0_^Qom2t2zdUeBd2cP0X7Tn! zRpvvE_%dYuZ$!bSEM^a;9HbR$5U)bkegdTRoK+fUQIpja3%4MG{?}D8{ySfA&}Vr! z(=SLM>ev`NTJ4T?hmoAVy>q?Ocg9YgrDO$yl8fL!S*TY@N?%Ii6^2V5YoToCK_;~7 z*Fhe#l+7#6szBOo5U)8ob*uotVo3WG+bnhhF%S#q^9CeP^%6HoY?YI+*|IwfU#C8f zNT>{zUAD`s4`GgYB|Hk=l5;O3{nYWtWo_6hZISv^S_Ot!Eyp5riNm9?&6t&IUw zAKa><%m{S$vZ{|=iTW>qfn`~thvZDC7~=9BQfm8q22>w z-*lOWB66_0PATvFQ}@q&(O_r6A~IA841gD2&9lD~RDaFIkr4i(C&0^{BGwNAK{#p6 zzrSI2w`k6>F!kryl7X-3zVzKUMV+rsw?Epemn_7-EPN&T*37${B$d-544=1t=!#f> zs<^A5@@sMzDs1x6#IBpa%d1ljG)de=1jxK+b;XtB*w-zHQkX_YU^ZM11{?sYGYZem zzjsF3f=ZLkLm#_Dil8lIlK$^2Ra&JD3m@6v$`!ppf9KfkxerHfoC1jJSPG&5AJ{9uhSBdB~)Q^sfH8(c9>lErL@7d&b|w4Wg}a|3(t$yZZ5g4G}%`bOEL=(~{u zaaLsLlirskh1~s${Qz5E<2h3y;GYroutK%KVjpOp*z9NTJ-wr6=ymsqb1d9fs$8ZN zLXY1-{|_X=35Emmfzn>~UO>WWw@q@%xQw z-%V`TH2?jVM5hkC*GA1cI8&MB7XbU18@_)BGH$gxpIX^uAb*vA@z~JNiHYrnP3uIJ zNne1T7`0ZY)Juk7v{dCoAC>2<(vx zEG#PT(fmfw-5x?e9?eP9hGv|e8}{9ceM*)A$CRqY4XWzq;=Beb0Dw(yk|GI$qqYQi zxM9SY(LmMWtUMfS`K<12)p>h_O;NnNVf#R@H{7xFxxNyu9~nmB6Oi#JekYfzsdmUg z2!Mez#1b!*XW5(a#&GVok<2axtN98MtSfP}t3T%FCQB6YcUc8{DH=@^&>*c*bj;G! zU}=_y3mnJiBCPS_Zr;gR_`V-KD;+rN zc}U^Frvv)Y%-vx15KU^1$}bhN%aX)OK5nlS`7^-b_F1`qaygoRpaDaDz*grfN;~i3 z2E*opIC!%|;gi&6?vnZTDXPjDl)11QLezum@oi_p(}!rWp6nQf)TS`41!Xm1V}y4F z9uHl@%Z;EUZ*SVi9#;ly&cp_3Q2X@?kE%bgSJ}c&Zud5=BIZm7inrACIrltc>o-H< zOLn-`og!WcYMM&20oW_UNXe5Q1Ex=kYB)qg1WFa(qoJQDCOl}V0(_W`DJhMQy@~l6 zd8yXIRPpHx=NIs(SLsGeETbO-J!+=O16BGuy}}Qie!7A1vlSzW^a4uIz)JaYG<{L< zAh5IqLd=e(_YnaJ5DQg7b$&#HfuLTr+<}Qzp-+idjMKOT2Y|Oj5z0Rp(G4HXoc;>EKh{-O7LiWK9;IB ze6yHiOPa0W=Rn}6VGH_`l79DnNh5};)Kq(@9zT4RjNPod1r)F%M4+0b zzNIb~;DECt+&0c5qTWmtNSCIT_s;rv8}46?6x{KkyMOY0ILr~Nc=7{aKbpWCX;@a? z-l5mYucO{2VwJYsN=BlG_z}{Rb2B82h#J6C;aHR226KV5`$Z3`)i`3#DR!TznlGL5 zhD)z@-lfT-`uhde!&?CbVU8n&>%E6nV(c=Azl#;MyyEm1mTCfGi2Q>m-mGE=vK#(f z@*P$vh4{z%+=Tlb4b5GUAmHyyN#4&KCcw1e+_&a>Qj{uT*&C9sR|IK;sblvTIf!p z!Khom!5a^!+u1BOG@1Pj)BgR3wJ+G!UlciZ&%N|50BB#oFq3VSd{d*lDe7WwSgj3m zO5f9>iBWDnp7swvYk|1LnE_w-%Xg$#keIwl+hWi3(0DAcLrwyy*R?s1F~ksUkts@7zqooR9^!Mt$Z;V6iDC5L)ZPqYy|?hg z_3xS+|7#PMmK$+E$At_Z&il+c8*3;}41j^0vX`DBE{{&j>TK|BT#rq2%P)kLev6c6 zZxGa#4F7{ql!4Q=;_POyZzNy2c+9ypBYtc?5gDKgUK&ZlQBDrR%LOqwC-0G4e7BGF-6OAMc+^ddu@yk8jA zTSXKb%WrAM?UX|5^bhMSAQz@Y_Ef_fVmj2T!UZyC?NXOOMENuq6gUpChpMvWE-Sv| z*zFwk%fr)?eo=V}B1bKi`2rIOmH&PegSTi%u2muv`~175Kf)?u!pq!1nr)fPu?MZm zKJ)!&pNk2Vlw7*js;**q*OY32BUtO5_t$eTIusw?&!r)EZnIeLM8B()Uzi#)Nc#T} zoZO85NmYy%#58d{5aI4VoAhz(=F^v1ez)4Hl~|S>gqzN!|DvD;mUmRrvYNj|clir!_=Fg)i0f za|1X}aFpLIjye4de9o=kyc5L9&o$f1{7eC} zWlh)O+3@fwX^7fa!Ru&=vqo!Z>D42pH3`9VAa zE+(iSV(+?QzuDUQqQPcoZf7PV|Eo^vCL#8_&$K!pQeuUN~9^!ZUlxE~h|KUE^)9yK)iF{Oemyr-tO{dDJ+U;oCHgQrQUw=b0AOaAXPwhg7(aOfwxHe9(lMS_JK+-#=&I>5aN{Y-Y z@Cf?BVmY#mipWb1|mRZh8NOGK_8U^s8E7NQ@!8=W|!>U}Y`VQEk z@GCuLk_XsTlWv!@t;W~@2yL;rJ|PzsNqnXn5-T6`1lVCMh8vf1=GMLf=(Sb~nhYc=ro~;TXXM_dPl?ewF)9 zmif_qZVTF`F@Ic|LMh`ykiZLuCBCxMPXxM#jsss( zWSFJC(H3y0s5nk1u4$|rrlxxRdfj9~>DllM9`UJKKSGekThu~w@?*m-X|<6k&@X5U z{4vyxS3qRVfTN)!PLR)(t=dl{P)Jfs&~WB{i}pnyfJ=~Yf(PCrJq6^?;={>F3>!HH7G}bR#I7K|GE7%5 zp`>maeJPM8C|G^-wLO=o5}c@rF#;}GYv@>>s)&!u>25Aq%@#rr;OAN7@y|bZ^S+|OvO7Wsb9QMxJTekcRi9lwlr{d0`36jF^_n)H zVbQ~xFTwjFqx_zR4}8e_ZTJg4uS6;~J1w2_bC2b=HMF!&KS-#D9}=1&nek-HRq^V|-M~$b z+LWu2rHZL2y#{;0Yl69Snhnrl-fispAWZ79ndmNs1?rl^sWLc8$*zAoic#^2Go2OSR>i;% zHXBs*D}>mcprc92XMm%mo^!saE+6VHSs;!__cbv#&O?usyMAd2MHp)AadU)0$tW%0 zyrclmIZdEVRpUQ_9nM@v20iu6iFsipQc$C&Pgd{0Dv%3&r_&$Pv$?8qLCmZ{Qo-|T zXc9h}DZ20;)DZ_~^Z0YAj@)>hcSK;N3;4zo=?4$^fw2N_8 zYC1>(iabDqPP4Z^Z7=$mM0qMwV0uGg2$cwtJ!4~L_e^4O#~Z*$98^owx{4_sB3_@{ zQ>~}+xOaARPb4^{caUVwtvc_{UVHs=CeJ+7pVn~GL|Kp-J+F)OC8-%&Hx)(cBNuQrD!!HKsutVE#+H;Q2`uTvco4EqE1fJ29dnIiw!<()PxMBE_@Ir$emQVjX zb+qVbua0ihpCsgmM0fMNGtEGaeY?QVPO2D4J-7vd9A{?&i}>@k z=jdXwj7M3g5FH_6v1Y;`^)PRQ_3X#6Zh|IW)yOkG0MKv8u8U zcE>mZ1XB-ZBo}Dv*rP4PA_e|CzOiwSoT3pbCK8q!+JJMwRErw6=5jPAX%B6MBbn{b zi@|HJbxMv?kCWH>)xeHhH*Jwg^?KRBNIU)Q#hYULev(BQ#c)^-)XYRUAVck+vUylSg-a!4mi)w1K}=_C2EO zyL*h?EYa+G+cyI!*>6BH#{P)tyVk_`6V~x8WT%QwZJH2n~oV-wizS6Cvkzk(D%# zy@n_KE$gM4{}k&~aUj5^*}Z-Zw1ruPaYW5Yzlm)XR79FiQlQc$at;dB9LlF)7si>L zg&bXo6IA0p^|yJ}v9ipYVz&zW^((qJG$pLD)-!EObwt#Yp*i58%mtWsZlfiV zgD1Xw;RQTdd;gw?oJ)24Yg6A70N-nFU@d44fIa}M3S1Zvdc!_oF6qye&s?7{bf`Jf zv@+*3fx&rxhstmngJgft48)%x48om7MnDZR0#muwXfx%eg0zZ0MEZC|Wv>5UFM#2& zyXXk`w3sWMXzt7>253|V7krBG=ZJ5zRUWY=!y$K8>q7sBz3+Z&vTN2AkfNx7C`Awi z6;MDxq?aHdAW9KYK)Ohi5_(SpN)f4wAiX0^dM5;s-Xpz)5Q=n2fB=DnBq#4a`}@B4 zyY@ck`~heGHYAH{t*mFBS+i#Dxra?(M}RIoV0~z>{pj(V$Rd5#R;G%uwM1pO0m`jB zH_Wr&JNnjF*Pr}Fw|v}nS2W@s0+*ClLiR)UIIpXp@`TV;McVv8k}fU_@icvUwWqS7 zC!jK_tMw&p={#^zUz|>Yj#=+1Rj4?pwkhIiRQ2pKdzOZlZM0Q<`$pGMa*Tc`rSr79 zyV|=MBfq107YSrhJ9leT+wwiQaj$|r9H02~abwrsw@=?1t%9w~KY)TpJ~#LeToNC; z&6i<((mFcwizjN#I#xCRk6+F1bWV>3s^UaZbE17HMPM(L-s|wj1ww3_hq+Dm+xP?s(YuU zf)e9+&-M>OTFYLgoidXrFH!5Y@py!gY%YtqNazQaV7bcvT!BV#HmcH&h*Pb#t)VF|9dWuhII>3r^Bs z0T8lh(e1xSK(thEeE}j3%94EpTbM0kXSzPhSvX)t8r-V`dSj&mt(o}*Op4PV^#krC zr3&$|3pO{)>$J$fSM7O>^^wnf-Sxvok=}nXpSOSRy{qdnkJ~4E_s5F&Cn_wCk|6qP zOKjHEOzWZRQ2(lo%{`vPJjn`5udp ztJ*#!#|TOIIH$1tFpDq;TuCnE%XHhkxU`8C0m`i>f-5YYc=mjFR(j*hWA<)-c*w#6 zb1`{zjt@-=9h6HF%cXTQ%9?}vXFNeQ8i+`YPRg6{Yx_84B=PV`;7nQ@M{b*#@==#u!YAa z^qL4qx9ZZ#-m-0rrjpxfrqFjJI4JXQ`Hg?vwD>yR$BS>zQ!ufMFP2h4i#pFrm^d`z zzEp9KedLbHPrOKcdi;6xb5*K?Fg(hM0YcE(fIm{Ynu+*SQ=7PxzPzM;@k)!XsS$uDmhs`lrbuxl;=xTc7^>)xUuQd4@GIh?tx^xbBqD!~8l2bF!e#V|qFhZYkdFZmz-$&T~Wn!5GY8pa6{)GObVTqqh$U+;bzMW-69$$V+$0fW7W z%Fxjh>#ThB&Z5LEc_!kr*~0~9k(bv;9Cs&*!ENrN3eKIzwpA{dWcWPp2lWcSh3pzW zyKIAfElsQE=~1kCJ5{`~Jy=R2x44}G!edsGnilKf=D%dzD4EW6={coZr&M(bI#6;S z$Q;L&Y5h4uep#AusYmEULgq{Pd8R%6mJ>6hEb+{4MS`5s{4*_2wRbnM28W9Ll{PAi zC(K}ptKr~?V?y96{t^q<;g=4%G&#?D-0`|(wD%`CrKDso8Ujzf5q)}+euL7cdPs(0 zilZgrI$mFSVU62ULrV(sB0`A1hfQO7qowb(P;6*CrFvO$4{`n@r^c)L&PE-DUr@kd z;zneK!qW?N2+dpxcsK)qTUeGnKicTRbW{WhJba)d5Ub{oN+k zxYow~CLVi1pQCKN-tLIUy>&ZO1${*+=Ew1O@DFvT)MG9)`wR_n-S5nz+yj>&SG>>v z8+;+<9MiXacMe+~Uxt``errBhh@u-)ep#bFFH=R~@N+^($LCMW`OwFT_90CYHrlWT zFY6aM>==`ouk@hMsGw`NRD6jOUfd*oW#8ZbQF58-)7mH5hpkeNp zchLu)Rr8l;w)-*Qkndy+^*+g*fb@($Aj_)=@dwt$9Dv+_UD|~nCIu+(D%k9ye94ZpJwX^Q-=Hou~Vc0%D z4kyR(#n92kT6f-!v-n+7-jT$d$7SnUYel|v%h*8GTD|@S&kBvR^&89cKKLr_=IW5F z@ppu#tI8`UCs`=z(Y}aZ$7LhYtqgmz*73@h)Tp^%so&zHcqaWt8=&JQczTgcHA+3nW1RO|ebfES@IX0Vc7ZdG~It{gSN2Wc+PF{};8 ztSj4om7@zie5-!R>RS_cPtMY_{kg5CP`uN2(6+Q>NA`(tDzj_4mC0r}pc* z!Qak_sBn2SU}YG)p0ImSh)1Hf`(FYb^aP@AABbC6yk6q%Q4oP$_V<43ulgq6;mU?i z+LXzISq=Y*%e(hpZ2#w^;(yK?2fi&??X*Wyjq&*SdK0e6`;D`Lu4zkd3nuHs->BW^ zkN-@0c?{njHvKJ#LIEHAI^Q=LC8)&M^Fx^7kdjqf@kD9=)YE+LhN@zie`NZt%3-4D z+vQ*6#b3mFhb6Q!Bc@zPV?40!k!_i8w(P5w#*HoFij^>rYk5EeknhJ4Ov!*mj`%FvchbF>* z3hb%oDOII(Ek$pueU4K8vFdhPeycCh-s4;5FwslgG3ksjYZlun-We!64Jh!0ve)rn zDZlfZ!(rGz{^LJFm}ax*2L^hfk=I$xLqua!f2RAco0~e7I=z>Fw+WR0`fAi(?vB2h zVoyv(QKgr9ckCl|`<Iw|$o)-Y|NaC1A@_w- zbj;bIxcvVy@1JDKIBuF(o_}BTe=SttzN zL^l0$3EHtVU*DV>oG+c<0XutVr1_FH%}s{AeEqg>G@M3OG{)AmHaVJ={ik}hi{I6M zm@_xrvI28m-nm=8y7-{ss2JFo5EB@&Ia-A13~4W`d4uc)I{VZJX1JpQ3g+lRuJrJ7R4Dls=@OQ$m-K!D>;VT@k zcDUq0E&XMuJ*ej6q`Z$#CpS>d9>))5u*bN@(G@{?nYW>Zqe%C;GCY1A*{?=OH$Oiu zn==@AVl(tfmaxDCtuB_F?`sJH2=0PUFZj9*KeK!83~k96Uyu~gx3ECFwyp5U)Rix+ zuCC7dD`FPFSnmeABL(!ty^LPNTUgCF_ZmzKBSZO-tOOa-X`ERne)^@WIdoZ9X15t?KH9k7I+BvmJA6WXY*XDr3kt8M5ei!3)6t&P9!OCYt}1aMW<_RC!cs9Jr1CjS@0@_ zV#@=~Q;?R8g^I^SOrwznn2)G&?DFEp7bqIfh0MJ>NF;2~)z)|q3gFhbDw=ErNH`-0 zr&Vv6#_ng1PKH@qk@eE1rWJM*ud`x~BK~qsE>ThZ1+{apbpCSm+VxqC_gC6>-Y214 zRaJ6O-BAz%qTGL4!?zWxu=&7#9$%S;TkJKrc0Y(n>ohfjHnic{1$b)jAV~&bzZF3; zK*n*wL*^l1sp@Egmz?XQREugB4>~_X&FX|cn*?|lBuasPE4lP8cmGk&+KO{#n8&A} zd|B-uH1{o1fG3cVn+u0Y3e(=wX={cuv>`1YUZBlY8%$`C_UGx9->WXGl^4A; z1BTs3OgBrR@E@F%g0gXvu%<`nFYfY;g31xzg^e=#TiqGHln%*FM^}vA$k#Uvl$$He z=b;GoPR_D3gp`HDyZSYM*r3zkp~Tmd$Hd(AiZvKwz8P}{Q*f=IxfiuSc*=Si<2i35 z1Pt2LYx#mStcXhOjE5lg&YII&7V*j`*uGd+jf=%DHig6-^6os^(yfCy28%$p^xL0J z$Ccmn%!1U9?K*4;y9pqCDzk<&C(z*S91UN@4rBPQ8uQ!pK#2Wk|6{>RdLNOR5X5>~ zJoL}UtmB??2jnDqzrht(3Wx^h<2acciLp@RuJ6K%w)RyxKfsUD8*%k}CN3A$JZwLl zx`Kw0AIl71>g^xMQHw!q0?tAZE$*P|3PMnl!#0(ZQ$QBHlehLLzpn1y$NCQG>1AQM zxc%#_W?*ou0(d7`X3=ItpF$haCrVL+rq$vpb*mZHTXh4=IC8phdC|kd$iMcSj^dmOQ{jwV6y zU3YMk)52z^nj#N98T4PrC~bqcm*{YdxvUR>@7~g1UVA}~hmJxXUW<)K)<^%N)67}KOqtA)cTyQRA(P-qp_u3FAZp0MWSm$Ka zG!h$?m#!IeV^vP1>Qiu+^zFYWgyu^tS~jGAnx=iTe4w0P!6D~bIq{_Kn2W(?u#XZ( zL=jxlnG5vImAYMKDyNiiLkZ};9JQty*c@|+QxfI!D1Mm- z(eG41_JVKgHG2z8`DQrkS-wEo=~x936&ucOw{2*|l~yX&L6N3wuY3g(^zkgWiE^v- z)A_VA$=Sy><$Ya^!cU6?hmt3h{r*V1Sgucjv5YAi}}d`&3y=jTnv`4170jzp8KCW>mZiljQUJ}HZ? zsWXe+MWCfgi-QYVS>^VWqX&F8Epi7)E zf4`Lr_xItu&PBFSZ(U!YpC2-*0hy)*Ohjm`xF9LJ)xr$Ar?k~;Wavk8J~yy7-NA9c z?Rukq?;xcE0vg@A4mL8Fn>JaEnYQ$XD-&<~E~}$&=V_*~EY%}0J~Bv;G)}Jv96y&q zQ6$hGt%SfW%{ZvHlaVH1Dv*UaMC7kv$JOMLsP;)+tIY^<4b#!k_EW&a_?5fBEd@)0 zux~waLPdI7TJ3puz`o7`mg(`C_SLP3lS(mvtS@mc3tBywLisy5=#kFXQ2acV#c3pY zxr810Ck$VQBGG5PBY8;aU4DG{L1FfR7Xr}nYL%oI-tS82x%u2bt>thl9_$}(9<)7*K& z&W`iQ*Mln_so~B%^$2~6q#xJbyqln5YVAb^ZM#G=1(3S)c=CF;D`3mbB45S67gWFh z`eaRMF@v?kU*OH2v1g5f$Dhj1PTsty?(UW}3spA57Dbk@tz9!8O_xXtqESVaDCIlg z-OeAM***}Lf=g7ISSr^3BzXE<4ZR-!kpoDeDYek{8}_}^vL?JP;{8WY5VDmsjA?9W zJ+r^MHJ;b%jM6S@d$e(Pg6XC`#ntM3tqQU;!!jNqU5j_LjPx(lT{JKqqqmF@;qY zLpo8TpQnG#EfWH7LJ=(L2tB6P%f}BIUtT;Ifj*HcM2Z=2-B4U%#Il~|k(c}L;}WL@ z8d-PMvRVbOHc!p5Oejb@=mc-GaBJU0p{D|7vef)Ann4Ts{upHzqYBD)tMS)HSx2?R zav7~jzj5_ZUk?9Btho2mT5fh*J>r==`C(}sKgY;}4^8v$z5M_#LQsYc`-;MJ;`9Nn z;MP@DvP+x8=9imX^IYV!Hp&%^k@0aDOeeYO_p4!3>zqYN=h3?N*m>?{P{}j81hWY;x&M16?L{Ed? zIfg&Pz!Ui=*i$tDjC(QnYl6Nfr4}~K$SJkhCMwj+xVr`bFzdq`)fZfwSH*b&-t}DO zua^#n9VYynCo^1?cVbOTf+g#%T#q`qg0w$OqE1>AY_phFRqOgg0~8)%AC>!D_x2=u zPk_&gFs2mF?Ig8kh!|pYm6c-0rlBQrgQ9g>iNYLGJ<;z^%U32YOwUa$DrKkDm%Ae~ zh=onTMwA1gd4GJZaoNL^W8mPMPpa?8rj1gIE>A-hBtvGdjJSqsnz~&d|1Om_uLmLV zYS`TM#rc}~nUZ_;u^k+~Ykwq6nUkFYGum|F0x7ItGp4@ypO$-#J2+N()!Ugiiq)Pl#Oc8bIvNJg|AuHRsqOwT=wwgWe(CK#fGy9_-fh4EiRm=G@yQxUgOWWZWvoV{miuVoO?3pk-a3FnQEPFd?Wp6kV;`<6Ogx2JR{=>-hThqAD-D-@cVu0n3Bs@ViV zT|Xc}W+;tGtoivxy6DX$Qt;gWnsP|Fh=0TVFxQCME5P>Sy z!%d#+qVm?I@EkJ=zg{5m%f+0b1LlVM`eq8BObcn?+1ly!x2Fx^`6E`L_z%lh)AWpH zF!?ty{RqTkXe2knW}9aQ&yu1pDu69oS2lFUecd0oBOD1CKX0`q>rR7nXUVZ!NTWZO zbvarA^>nnE-L1xIn!c`k*z0YyO>qgi_FDr`v(s9W@^&Z=0Fj35{A9-%W2|Xyj9FX7gKe)ioYqHZ;KI{scb`x~8E~o@Q=#*R z6pM~B!?fXAKcZVt1&O_=Am}_1>6z%NhYj;)JjoS8p^KAV+rQ9(a=B#UN2_a!`^HAT zHFuh>pr#D@VlH9d3;B7lzbR?BGDu-V z@fP|y?Lmg}ct|>rAnUzr)QknXO@-z$c0T1NR1G?%~(#V^hObMKo;7 zWz~T$IRzaGwnIz^45gd=^o-oh68lt!RA4L&wFzID&0GiaA83g^s;VBV0Afp!&-xXz zcG9oU5t9!eH!S#k7Zp!i&lCQj4<{xQe2k|f`Z{hRc3MGJ5a4%{+c{wTC3rB3;~Ksy za9Xzk2{)0VR*$0dtY_pqAP}^X%#;qGX zd!?VTPT;^DIB&c2DGgRRrPAvcbI)txCj9F=!3b_oQyHMg_O7o*6er(u*v6-OQc@(} z%cCqi>)D)8pWPXB-WAzi&-GznR)OcW+ePECpe#;_g~PMr(!XVk+oiM@*RlvMfevrb zynYs^9rmK$zi#l-U5NEkB{tq0N4jL4(zN})y^Jd*?-4BST;|Y>Nwea?wQaD!*#;$F zwA8R*(LzK<@)FbEj%dp#Ls8MG($d?(HDO#CkYXNgf@3qPqEG}jDN6WVNTl&btIZ$l1bo_n=QYz8p6Xx^9~gx~;_q0Kf+3hEzMc~5O+Z2N~T z&d?Rgs5T-HV%xDWDBxh(V)ar0VQ)a8F92W*DRC+n>$c`?3`~n5yX-j0j`!DxFGA{- zUASL(mLnP1pk`TDTNG*dBnVNSW--upvU_cDfe&;{B zd^%o3->M z4ZFr^^<}zp0;;Aopzghw&@&&PV#kJx?(SPjk1yXFR@)!24%`Ur{#eO$DYy676-)i5 zT27o&_4b&BFL&NRg|Dc4kW-QlM#Ml?V_i*sN5QJd+%b=aMI>P9{qqetZ=yUvVwsG` zkZahFn5V;=DWLzj>M#b#R-tHbmC`2z9s;e0nc%CgXb97=h$uN&Ff)NtmY&(f%1bM0cO={=~ST#+Z zGad_WRbseJ%D?Zo!e`(-*SO&AVJ+^dt8z}T=g)Ek|W0uI2f@DA{H;$-(pL(I9$*R5G;B} z=(OrO>BtF{@=F5my(~xf5E5Q_bAk6NT-T%G)^-}4b|>Tq6G@dat#6(0zM2d7b~&_zl@Ofbm@hnm#@;L z7}B!fl_lrnJ;}dw=yLPgUZF!9kb2}CLc_F# z6skS*{JqN>BH*~xLc{lb>nQ-Tlp|E-$kvVNw$X@JEyEiq3RQ61%mH|6_H-!D|JxX)L6t?lL};NY#I```5$lu3 z`I9}|V!QaMwxgjI+BnnfN5#+hLiMbUOoBaydye-@=FRk(OF^EX{~?#@X-ps&dBn3 z!4Lz66JUj=)!>$+wQbVluMtW-xsZcGz$6q@tGr-rNg4wLyZ~)hud@5EYi|DtARkqL zX3J!(1s+stQrJ%r8UVmMx)2};i-H;19eOUT)J1YUlIW*#YH>Xw=$PKZG_7ZP^bV)R zs46c<@PI4WAE{S zc!>)4Cw!AX^%2DbDx#+@W0=a-l1VaAUh`ba4<+W+kDw3OCL`?>-?F?+WD`~M(k~ec zILS7}mbGEGU+Wj=6%si0cI{5yD%VN z8-fsU5@ydL4!LN~3+fna)`DF<$lQYntt1K|GB)4&>(P)Cqs{bea70c$%T{T0ak=_KS0l~Ad9eeQHo1~_M>v7?F!iG3U@MXlu|i2y6i2ckYw8f3`x#(W31 zm2QjPsHj@X4jeNWsx%k!i+}06a7OD0(Tu<^CDzaIF3Z#1XgS;O5X4LV8PcoQa+}FC zQpB-~nC-x39V5Km_iEQqIMi}l-cw86^U}@G9(pEXI7s@$5zW?umSA?Cou5{DX4)|C z5dmF62f_-2ywXSutdZ>3x7=?v_NwEz%b`_mIz*h`3air9ORs~p9-UVuwwy9bzQ1j_ zEbq5g%zN};hFf{Ml;J!DOh@~lxw?=u#aPxp z!Vw$V_7`4%B2<9(nObC?h7`y(u1}LY0v-8l(;L!Azq~7&W8#RVdR4!eC^Yd+I1r`Y zb1e_93#VP4=|0Sx)DA(FY z3ge)QoGq=X^%dSW1H!O%kT^GUHHqEa;||7Bx%=*vT%PU5~5q zs2PUFV!syaTN)ayq0bTlo7X?%k_8b-g{02Fgb4R%H~17=^LRqPzbRrW%&H2Q=jqX% zA+Nh|C+ZaA_*K33*Dm|G?0_eu8NPHUGe-Akv>nPl`>4OIRBU{{adgb!W_`qC_2cTf zO@V-*o%I~E*PhVoZ69L?(NtKcKO~78Sic;)lc%@EUTDwj0d-1nRH>C$#1fHh6dL+%#uZprD5KuDi_Mi%O zsZAzV;wcS7+Xmk?%kdw(8@vHSgz#sb|W1qMz`)bF*tWGgfPF(CK zF5!d=NBMqpuEjyA&tXenDfCjEkP;Q$8kOF!`INWgz2jGo6H;8q6F*P{ud zYyO|Ie<@LGFx;p?2X*x@gnwfJ@3bA=m9%gTaO&e{+3@_Ks+2RIbv6q>4Cn%ocgEMA z9(~xZCy5z1b_J&K`RE_-EUdyd_AH_Uf>#{FjaE9>!Ys|rSGHXn_S|_mn35X^l<4Y) zYvYog5jR!~dwrZzuPMtoe~`@!VbBwp$Wk0#W(Yyq6$kEZK*vLG@Y8mvo#5ICqQFp< zy$iO>UD~*uxS*jg_xZlvJgy`RJQMR{p@u)?NveR7G$Kw|kJ|HLz9Q<}6{_0B{`LY(eQ$j=`pi_;7lP z3*Z04B-FS#a<^9MLwH%+wdk?STnl>|#}~%eO}~uI@6TC~bH)u$!Py#S{Uf#6e+JzvStal50={=fB^@nTq5HFn+!dXpXY`4RBVg!3bqh(8B|8PmO z+b)no9~y|SsQMi;s9fFG;onzX+)o$>F^X& zmwO(qu#)*Q1@XB_y^UI-;M=ZGMeltd!lGiyHK+=oxC#v5tu)g84&lN5i3kj*r8?N- zvV^p@fT1aVXj5AH!Kau&R8Wr#2%q*ElO0F*7p5jojDJXoqqqS;Hs@tQtm86c2FC{8 z$l%O*tM=PErtf}^sZXshADFq<3!H%iI6k1Tee^>FytLSWG9Ct;HN#hPN&e_kI?Kd0 ztqPZKyDW9DXL*aY?nUd>X;=iZsjV&?Zs1yXF^;h7yO(j!V;P1NhUK8N1V^S90b3LD zS;|jTK_8|L5~ly=LGpZn2|U0ljc9onJ> zb~#>NI2ufa!|B{*&d{pnKnf7m#9xV zhoLIpbvWg2<$?m@yTO};>g&S0xR)KpZo^v*phK$Bg!}x=f|T5vt~w;DT}s!gpI)_Z zl>ygeut#>0vtYR3itUnWvfg}@ z*((2_d9^6cwO14-7^-rgk2#qv?!{rnL1)LY)vj;10SM<&Ww;x57@s*4OW`;0NT3jh z&O>+3rg3H&g{7s0%!QXVf6{m3juxP+^PV`RhBDakoOYPc^W`Tk4i}2zs>Nrue5*Xg zh>Ps351BPT`zFr<2yw=Ccf{Jif41fZ3(*Og?RNnaea^n}yc6b7(h}Uu4IJ32pvxxf zSb}cxsYwvlE$i=1iU(t9g|1Le^)ANk03{A!(CQ1qEoCj|YU}B?-VsC@dusuN6j@DI zqD^;)`*ob<5AX&caX@JVZInQ}b(<6tBeR>;`gVMAoOTPkd6%=t3ZXmuHiuUNcy?l0 zcI=$*Ncj3_CC~Ev`CcooYsLrPv*r#-UbXXiE(HXIp(6X6)im+*k7Z=6WM^Pc12MG8q_HqXE-3@@PmHqOG8jQwYoKD zBA$Bd3qvZY3V2?n%EE4w-4UbkedOmK`gMgz4zs6Ul5LxZop8G3z#=J3wj7uh^+;IQOcv~i8>IYKQHL~2Ge#$Tl+rb5|Hs@mLh z1&t4-=6VM{{|hmxM_zCquTv^Ne#-9Xl5lUVc={Yv{;Lurc@MO0Ic;GM`N24m00tMR z#OPAzRke{eb3E=Pog0GUTA7U5Zio#F>ZLz|`0dG5?Eo#PsdNKA`_mJMe4?7~WrJCI zo(VrxptO-G<`rS%xlvk)wI1qpW#rmUOiKDh>;G_6!w-C|2z6gWKKRm*g8lGyMF@&W z&YHBeg}z`@y!AT}g?r3+X)nWtL_94VetUGmB(-SuaLaZ9L{K_@^8I)NVM#i)Djtv)(F2)1h_&QLqf-u&!hLe_3I`P_|-aq0ZYi$!r>-<;M@pn!t){1-o@Rg_fl zTlV0Jb@30Mu4lg&42jNjCDJo0BCIMhBa)PJ3Hi0FaHp2AvIOcO8&~qD@|aH61iAY3 z-ZWZ8dAF<-QH0NLx%s)PGG@QW$|g!cf`KU2`mLW^{pvB%jr+KufvF2)?NeAJ@aNCx z9FLePXgqnOt7+gVnr)3qv)O8n-TM*esf1JIrI)}lO)Iyh$19p1GWms@=dQOP1MFgM z93^SAuFyy?_7Q`MGw=C4NGaZZHD8mrJ<*L}yMK*$CvjGjQJZol9X;yy_ zFzA&uKeS4#DXPZf$eq*+rpgu*Z~0?vyQ!rhc@Uw}u5^D{n`Mr-d5D3*BTfDtqEr5N@}^Uii&gOO)?PCC#1x1v`n*J^G)a6+ z*e_G~JY>%L(K)r|{@18SSGwPI&Yo+CQF2fQA1NoGR=hq^A8ECgB}9*3VY%61^Cg%h z{>35SDP6oT5B1!9L;VQI0`C0l2;3!#OFJ8U^3Z?{G5b>RF8olKCYx7k3me_IN<8N2 zhh7-dW0v*1QtSk!90orPFFv+C=SAH=K{(fbiCqr)!2eo#o@qV|)Tx81bPmK{wVM;% zHWhSCtht&0LNTwkr3so3l3A&r<<4N^Bjs>uMS)UnvsYW0DAQ58WMC%7~6l9K6d?jJ>>) z35W5v@!tz&`Qvw5!2WY0I)fRn7EJTu+mWs6EFW*9|Vt z3mjBbeb<5yM~t&Npdt~F&aY~&oa9ZVMa9LCfb|Q1NlNj1=K?-oyRN`{Z!7g;k-csE zcWLV9_saV^?}WVto*am=UVV^euWUnAxcAZJZQiP-6)i3+NQb(TK#)Z>dDFD=Iv^?Cj3U!u=_6#LysyO>Fcs?aWXEDPRS4B?Bo`Su@N0HQmP zc5{O%N|=N+9w)*z(0VtVy`&Rkoy~L0>PLS5m1j5w^b_U#E;LSVVHQKWH?LS2<{_8O zY_bsdk-XujoFVASdI1!fwlq)I>iud$Tg~HAx1|-`i{b4CYuxl^$%3yR9h_Tg4?(bz zZusJQ>oRzf_MNFf3njM0M_>I{?OVT}(`a}acYR8!+a`fitca!%=|JOd#%n=dT6dw6 zNFTiKcT_hOF;+_b@RNBQ- zj=q=gxH-zb9O5uNouFYe_IL=e&d&V)`Ic4@d$vbgvk&$Miht_VoUJSO(}QSi9^pfF zxakjN1h0FErEp@OER{mfLC}Qoz}sp_7?u7dxspUlDL; ztk}hyf;Bk<>MC>}e=@c=%>u}JFLQs!Z1^OUWo;gA1><$UUQ3oHK9qbcU-6)T@H^*Y z(yvw6>D)D)y}chOajEk{p(}u6`K-!jS11{b+uOutH)nKz(Z7-9Q?#kIJnN6PwN6*nGf z{2bgqyt+N(k>3YTlT>)o_2AM(0?S@6K=GCU@qXaYY`7$cn~`N8tbYV8Ad1?h#CmyZ zQd?cYYC+P{**t6VQp%qVv!zlmd<0bAQIJNL$CfNlsTJJdvA zWR|>32)aFYy5$g?nHmCYVZCvsYrU0R3wib(D*Q}OtA-`BwBP)cx;QajAvJcmAkAA` zw=(JdYXma}tQ;1)oj@ODM?DjXmwXM*wLC9HQ=APD{^*jHW)93!>oO+C`R+)M)6-Y8 z$kSeZVwh$m)bVPL#QIDjjZ6uZi2ixws4*1x`o0KZSHUO6_o+>0eOr-gUFA#yXP5(d z8~Fx&#`pGKQWJUD-eb5%Siy;SYmmPgU08lk8mA{FVLq23xiJViDqdKd)t8tj%@)?h z1v*!mO%Zcc@DXc1rPTPiEzgdir5>1FNitsHnQ1CeDb2~k#Pk)bQZw;6B!crOKKixt zsj0$`<;=9cV7}WdS7~~Pfx}p)d*g3oh{H8JRGFD?r)}PabbJ#$xhcJ+^hek!c|9F= zUokG9i<9TbTD+dhe^e6UdCX-;!L+}jlNcY#Qm9bCnfma+XMztH*@s@nBq9=Ly_!Vl zFE=tt$|m|}D=#Q)6y9c0f6a;OSshGbuxi!)x&8FG^$C&l!`%t%ko{H*Z>#vokn5HK zi^0@_@L6xap2npgrr%PeCtZt-<@c!&nfBQwuV0)yzBuUNtD^K!vTx#xM2L%Vn=bLI zZj0BJlZ`j+1nZ2-c$??<2hwU+nleuZ&PCQdD|}uv6sU4yr~>jcS0NoA*cv$wHn@(@ zvAqx|wL09$wxD@pZ&Yq{SY_~M66&ItRquU|pO zjnlOjADzY_7U?{DD#UJoGopn*(?k?~3C&g>*KTocZ31BLH1ubOd;x8i{QX;E2f4f! z6*UH`gyKd%X94Hfb{tV6jIL8fiD~d!tLSWVvo_V78)6C59~{7ep9U`#vfa83IxPT# zX4vrWkRxwx^vHWgKU?5mloaxFNLd#yZ@D2Z?;~lBRxQ}HK*%=Y!~m5z?Kuvg1(uLh z`#bkM@Leo{XUQ6Fv=?G!gL9Q*O*o1)X?&y3h097;BBTRgL;(w1&Mr+_C{tTJytwP>)4YU$Xm{IL!mt$Tcl|Nz6IZ&%q;S{p_#S-aBU6bSXINFu|?Wg-h)Sk2xO&8)aT(s-JFXYNpjD9 zlsgNBL{55niBSgAMuuPOtZgt&IARi2xca#R5lGOU?~lq#YVMfoO-icX@>!{m+I6=% z@0RiqydfUzFxFB2=dSm9tjpR{s^urp50_XhzEOn;717O*Bj~@;-kMF{x|F1>a$aos zg>(={kys+>EDu7oxeGI%mJUNM zw-)@t2~&NJ?_Jmmzq!cEc;SMJ^fjB=Aen=H-Qm^>XZlt7o6Jjv(qk_B3V{m%aKE3OC z_3@Wde>dIwQ$mUE+V4oVezwv_Acv8s*t<{Hm>E=b>6wWI*TUXaaDiunv@e}5H5KmU z5oPWGu+w4Y!zrGLM}$tU&AHa0_PI943G1}WdxI%ThSy~L*6f>{!V_!Ii7b^w6=BBq zw)%3L#tVd-oEdPlhUo#+ts1Pk<0gF0m`~}YZP*Q62AU%UZ@s12Er;gN!OEKQ5|oWx6M9J`op~_`PiL8GY@d!Hb3#cUmY?Tna@3p;T}$?(R~Y0KsXCmg3&x?!m1TEA9?0 zPH;)kz)64S`{tZ;@60{_-&r%sA9?59vv>Ah_B?CtrHi$-)qi?w>GlepXJi~0z)HhJ zusHkW(6Anwvd4U#==)6-QPA-AEq71J;4lFeg8UoK$?rE2Yz(>Cuj8vw$2Mf;+p(Cm zeBbIH5vc*E=QeE%jf>bOMe9?c3q0m4D-J>o8ZO<`tU54`I*a}%gH0S2?NU5M)1B8* zRi9Q`#gm(lZh``@i@ondN48DdI+3Ac&so)PJ~xYM*p2f}^;CR=3sDx&5%^BIBp~Ce56SFNTh|3NaNFLudZ3M-ps?l+Uo6*({Vb{AB_`J{c zt&D7=Vd)q>g>%8IO6lvW34{;^oRh6p1NDPap>S4S&^qr!XOH}DJn@(0t3g>Awnw#w zmVpV)@4PStIsX1^O>^e^wq=&r30=g%nvXfUTkYXd<{DhOfcwwZI~YA4$R9X}GZ_>p zi^ANi_Gok~yV#R{DwZY#Qc3GwTFiLxecB($X7Ip;xxA*y`>oDdmF_%i$1hDRqYQ5- zLsZiV%Z=D{B`5Be=>6VDilGnPhV=(I`m+mnh6?}#fpD*2!02Mu_P#fzS$sMsV^`f~A#J8r8#nc^5**vx>* zto-vkz(zoQzDcaY(Kk;@K7G@^m<(H?0gn0Du%Rd@v`=<(swqjA)k)0nalAON{$9C_BcwPj1Ig_Y(AjBbc)+7Mhv{7u8>` zE8|JLl|Yf{FdAb%qUj#WA~iZ3y)i=15DMT@OiIJc7xyroa#?Cb$wB4ivdvVP*#?sY zn>LDxwMwmNhWrtK^VaNAxpjqA!Na{M=fZ_!UJU?oVX=ILKiTc%q=!^}q!m{?zV82X z=qj;f$_eAO|JAO^1FH!(4KDhhXnu$KiPvf4g|7>n-g(vUK#O2}*SRkX^AU~WzCwBP zP%{{}!N8zi;X{$vw3n7{PkV4rfKgdpJVO|M8le%lTCy031Fmowo=Uq6Dn7Q|{_#`k zcU>X3qmSzMw%BWVD@5Ai$@yn?^WF`p`-&y+G>L+h*kR%XerV?02z_#(|Bjc{wnHOD zTE=^(V(v_E_ml#c}zqHLbqn0xgQr46cz}dJzVzE53b5(+IYGexKuVzzuucJ`BtG= zYkF@;7o8=wLBNGmYksXEi{UZ9M85lGJujd2k@@reR6O_w$h|j7XX(cQIScC6UDY60 zD!#@ylBar9KWLZlie@ffq+EiL0ovU+}9$o0u%~p>z7V*J)ot5QN~sjM@Q==2+W~9}ZH>aV>e!AOxa! zF6HQXnIEuiMKYdKEvG6{ZT4?C;pZ3}U|_#geBp*@{YD%U2MIxRuiTbT?kW~y!VMdH z)%}Ee%BqVLV_Xb&^5TgC&r$oDPQ=9(JlN^$}V`?R>Bh@K{U-r3a-_` z`808$VvSX_<{0G*8-=sNX7TNs9?GoDRj>Q`GU)fxekcOTKK_+`V2Ka3bClVx@eWwN z;Ib(y!i4W(-NT=be~+r4|H@>?C7(tB^{jjH5+5r6?hoPtl?hIKy%ex%?~@kxcdWVn zVB*2%5o5l^zyNcJtM(tf{n*aSoadi~Rw#8OwCYE={ZCp&0AEXa{G*cjwN1dNM--I| zuMTndBfm|q=5YD)G(MEvydw_EG$T7WeGPM1$dgWS2_XtD#GbD5gL`B48LP9s%?;1A z&*?e;*=y?}f_$~WSys3!!!ave35bOlSZF)B z6PgL3D1lA2sxrCXW*rN(LoOSl+PM!GuFtpi$5(3hs5n7rmXEQ9LNn{8hAwq6`^)SQ zkA4cdfnWb~sG{nXdYY7l`un`e<%jd07v&u9tUbN@S1!|Q%!v|KV+}`yR6*JCQ>Wm7 zk>Hz|gkqU{T-2py1S>_$33*@sJokcRtBww?ojoBsTgbvQrICPDjhvIigWkS2axkx5 z{;45Jj6dDu$9R4OSO&}N|on0`2plKJz;Hb2PGqg|`BVjFe%c6((5m@Zgz*jfI%4x8@B?Ca>e zhgzAa&{-<-{D3z&cKba)!63i0=un{-92vs{3N&6D5U1SF;8Ox>L`zCUh3r^|`3zLe zGDzM_Fx*_U?WRc(&3K==aksY&A|Us<-8H?I6Qe~ga>u0nAq^_7oTJob00h|wb`Fx_9C4IjYXy>a|HAiv zc|l~?LkSQt-KU&tn=+EDiZ<8?w81t(JMsYmzO#+{AlJu!%$m6!`(1yn7b80ygL#)v z&%C9rVkwTNWjznmp2jc~zvoN)*<^G>TnlXP-A~qUKao{1iQxh#?YW-PB7*xl?8Wy` z59VnX00MHY1{Ws*lEcXQ=r8_HjlxE>V}h{~luM&F9@mMH;liEV=GnFAMc&rT@H0cJ zi^sVWrwK~Nb)fg}3*C>vLkaKA0W0U0wV>`MY6qG1SGkPP?om8+A$SoJq3JxYH^zca zLq{ovfQE)-HBF6J=S>9sEqCMn596NATj?AQfCHho!c8t)7l(djXq8_|1qz&gRi5(@ zDb}Q{CoEq{w(#QYy}BuZv;_iZ`qJ#7H8;S*q(fgk%_wj`LsX$en5& zNkA@KEpCV(1xHxt;lYn@qX!w3$MYNX9)9O3oI=?)LKe^-lQ%reg{|Xq3STeUw-W_h zXmzgfXBx}=IY;c|NjyFEAaT^9b5MDTd`_;tydF+C{OM~RcgFoNja{2!M&OY3Xv~%S z>@|Rff!aHWv(Bd7`GH9+lV11Zez^2LW-*h%>l=h9-VNg7nh$ytIc)YO-S`TmX5yYJrRO$(Qd3PMlc10FhMnb+2*1*0^$cZk&P4}Qz|cgj zgU;k3qg{oKE0g3rFv#QJslPC*+SvWGx1!*3Ki#n+oZ%yK_YQ}L?-&`z7~RjI*Ch)L zj@pwpvDIVn_1mVv{*lg=wmBtw*X2YxX~w=gMTZx)vFS!<$yQBkQh#%;mUB2;fBEm7 zt|r8l5P0+>iZqu53ERjXnXW*gZE?OI_1-cww~%n(yR>nco(dh$3AIM4uPHAgOK1=& z#W@)JouvmOC(GZq*PIE2&%PqQ^B+bD&|Z_zpw>qq|G*>Vy&B5x{mDM43XbDH6%a5u z`x15(%|$}j*#4csgScf~BxA*=+_Fj!ae-y6THF_G5V?hGa;jp`AEp1gRlALovq?(C zArwHlh*%=mRYWT7FP21&8Mw5rg!E*78|82$kc;x5&gBN2{t5Z+3`6;Emvp9yxr~+z z^BhH@Ej#)OLPEw|#y?_cw8fw7(O|;p%{}V2e3+OgYyoNZnNED0I3A!WmdY(@gVNPY- zBOpJiOun>I3X!Jmy8~%HUbH80zb>8~=+cG_6f*f(r~UxB)3&Ecgs&H?I1toTzB+c0VIwAll%#^_*9(@ zLeHS-FI~)PKiDSy8TgxJ;CQM#+0(y@5SZ$4P;I@CvLoOl1FT=@_bA7I;NP%VtFI+W z+3f|C@#S{3V`6Cb#(H-YrE;Y`et(G@F4%+mxW>MGOEU#I5YAxe64v3LvwJP-l^b{m zkt#TdprItsvt3Q!VH9Ln*jP}&4oKg}DONgIcC9Ys4Z5*5*DyiWxX9s}HhJ>gv?)HE zeY4j?L|5@91Yz30D!&1^5g9F+GTfB_b30Om;m72fFV}8epeYZX} z>pq;YUR}iG@K9i8134HV=c?ZVGxN=E0l+z*LE;FuNT^e7MBAaz8sCGj(uzeL{FPi@ zixQ?@Ds9vC6GI%x`uPh*O1^s3Mk5~Ffn<6^8r)-vqYWX+;LxiB=VV(&u`)EM)Y?qE zo^8N^v#&i=6^=Cx&4<-mv7Y9?uDAU9Hs;4NOTk>sFwyKdI3O|`r8Rw6I`M$>b&pT7JqR4cpGGsuiOM`LTaPz?HcR&iO ziqca?=~<<7d#qD$F_jurQ7kXeKwj+%fk0pk&GP7+UMDwO zU#XwVBY@!hOH9Pq-<%}!Te>lKWg+)`^Xbp`GP14rkiT!`AfhqimQubWQkwDZzq!{Y zM*k2dSN+Qq*E2~PfEWy@q9Bqt7b|BG3zY{(jc<0wa}HaT>Rt3!AW=l8GT$W5CU?2( zAO)kK`HQy(Wy580_@c{l7!zE|L)sKFltCM!He=*VO~ZnP%_5qqQ^D6ZW65bYIrkYO z^QD!ljKy)6q|q+<*802cROp7g*ZOxMTbfIpLRar7T=1%K`~&|UkEJ)ejMm~DxFq^N zK6^7i_>H|H5OwG4l8jbwdEUoTl#=hsprP|ORUKy`Nrf9%KQf?6_vem5>f}keBaa8? zf9ZLGLE({A&B%8{zt%e1$1zVbM4XGK$!nq9Shv~8b+i((sr)w97fZNlKky<|)FwHt z?19&z+G)v41Pj|F7ZulwfvCq)i~C*#R6Aa*CL4O#M8cga)zudtvxFX$5_T7ND#_rn zVyv9zI$*O~b7h1F=6o&*AYa9MXt(q0!a^vYH(eV;fQF<%OEmH|sD6C&-cD~Val9mw zcsR=3aFOFJ&Uuwj%AUl%;E<_#z|i!{i$dqH;JMV`o9u-4RG&2)Wrw|p_f8EOZH=X` zoEP>MgL@c@fs#uO)8s-bX@r#n@a%@DBFb+@YjM^4W4dccFvA%NHxx)@631!kBt>fyiT-zZ#%VMyH$< zDoL5ZF5#fTACZBkFUO3kiyAg3>pX-k(_=Ct{VeKPK&)?hI6+o775f^OloEQCU~TAtJNwFl#BVDE%4y-b2i)> ztXJijg6`0BWp^;qYi~*XM8NjeNYjD`8FQ@GBrP1oQN4*-jdo==AOw^>3LZPiqYs2c z;dk8plnf@N4g99?n8LOEvV-f9sO={hw{M45>${m3%N)vpx!F>yZaX0BXyextp5A?m z)Q&eJ86qw6oYKC7*-{%Hxy0OWF6_=vWPx&Xf$by~uCbzXz9LPzT_L?vu(J|0@;$JI}A$DvKM(^JEq7xtGQ&_uenXf*WRD*C-Qq4pn zH(Q`ucFc?}QDEbXm&uP?(jC;FGH1o<*J2QO(@0Bgt?1YD3K$sWgEQAm1^&&<+;f4PtufdtsY%j4a5 zyIb^i_By2eim*|esx^mIX+#i4egC%8sGxMb*L^Jm#n`heTmJ{L?L2gfe+rjL6n!6F zX#EaUsH}A%fCGS)hD5VlMo^Oj$IC~VzCM94tG#1!U4a~{>Nul@F@M*0p9i(oSNfAZ z1Uh}%BNwza+(w9!OEWsvbFe?xGV%qa1s5CV@yfP`K#VWdx+=;&B8ouDvw9!?D6dKIlMVXH%Za>;DXO{3g*R8rcYSx-ta zuD)~*j3fro9QyaE)8_?l77I|47wt-V`fs;gM_AqEsKxLQC0}_|47n46B`EQxg&5)) zgBW6bZ6tSciyo5izi$Aeq#WJQsaoilmM6^28>A)K;e^|4!p8<&WscLk0^7AiRazqv z%%LeFbhO1qV15+q60^M}UA$*dRhyCje=t~YB@`nXgH6M`QSMmGeY-NbD$Ms4`<+g~ zM>vME>O&X>MIN`DghFpq(gW`iebqvcP zrfc62#Ls>5mi`sI7;@P%a5x8++Q~pR18(280!VG@J@v3tebu~-ovd>*@@|&NedF89$dUUIF0wz*_b(Wr;WY03kz61jAqIoX^&DdTqUr<(i#<%l zfeWx^G=tF8y-xu9?q?i-zyu-imISp3a-d9eI?uO)l)e}mY0#Wfy;zT2^EbJ!am=>G zjc}G2$pdrbinOe%lcEN)53OgubqW>5;%YoY@4vqIaL(j6@_VzMBA%UjeM(~?r^!h> z1av}PHmC!|n)1Upk@i>5k82H-`GS{Mv^e6*6N+nGiVAX+Z$yKzndRpx@Bc!F8SOAz zpQYxxJjkhKY5`+L0X?e45m*+F@u>mR#cqxm=14n#=S1Y*US6c5+cX-05a*}4bkctg z_Hz1Dl_|A#|3dEKVe>CmMAy4ikX)yY|6K;AW8`xr2I~4rgL{*0lvr7c7C8CnI!{T$ zF2>!kXZy?GGw&&ZqR!?ErjFwMHzy%OAFuX?KeKEn`p>-Uax3$?Dm_C4Z;i7^|7zwy ziaK8Mqp|2k>bXyLOxmO}b3~0!HwMqT7-_g-)o-1fVW0T=e;RF!ei;$oNiq4*B@_L$ zeVXO7rYj;VAt}u~m|wK-bjOP#e(7m|bsx49smD`IR>f{&Z^O95r3!}wZX=7Fxq0A4 zkVBox;Oya~%cmrY*EzIYnlSwC&zcDVwrd5EqYD_?Ph>@d-;f#Xv@wq#KZbxtG%<89 zt_NcQVTATE2VZ%SL)LQ%X-NI$cQ`qbhS$72q7#%t)?z`xz88RJrt}s`r{Sy8G*r$9 z0MkTDXa2}9B8n0wL8?2BSvD*~W5Iv?j>KWRf0-8dVG?o67mNNRq{SmqtmVA*dS;E? zcRvR9zsp7*5WYC<`R%92jm*L<=rQ#WUt$YKRYH!00&Z~ogFFG_HXZk0c+@gf==itF zR|CX^m~x^0u}&fZ9d*X$?!QQ7$*7peXzZr>w>>xx8$~6F;u~+@u^aKB2p~1q%89;<(K^>|X8{B~J!b zz zZD2Sz9IFv&!QE6O!E*BO?lc!)Tk=TE@l@?*GQ9l3?SWZ|Z42ZyC_#J3PF_Ui7p^(B zgn7hYbUQpdl*T;uK07G$&uI~KHP}wAs=0I6Tw%8cV0yp`@dF+=sXWyM4_3Ry89hw0 z6nZTA!6>r}f&em2-itO0q8pokH6YT3K3tc=`OZHgfP*J8ftEuDHWfe)ab>kM#4c5^ z&przx>Q?)LCL-{0{;S-bP}|NQOB>$F*|&Ymr;iOzmPd+qcOp`lW>6nfGPGQBHlBOC zk8NrQ)z5KGwGPot$p^jK;lZ(tdQNDKT1cYDtZA#0~Pw4>ie7|MRbT}j-S*3*K(Dp&qib&}prejA)C zOW)S&o(eG6Bue<%|0p8&FGOO51x3_OSoEhkXhqlCr~u@gmtZq(+<&}=wv|8g<}#5~ zXQqe_sK^Fl@my337 zE*PiS7ugjTG&LRY{m-!%gAgX?bOgp#pKinr{{U51VkiDDHOW*&R?RSdFiLJ%9Xzv8 zEMURY11j=Y;?L5@ZjJil*gb=qj3|m72CuYoavy|9qRs2#Q8GTCyp&BO38OG1>THxJhQRy5h9)+z-K7kdbc~?@k7WJ>jp9HTGtIA51#6oNqHdfJ=GXLUs*e{OdJ}QHp0apS2$k%mpW6I>&3@`o4(|$-Hh6iglRv9up3H+;v zonsj6Wuh5Dqp>#m0fw{8f{}EyRSo^FMSc3y9}$vxYGXoL(~q*5_he1}U*_ET?zaoh z3r|hR_r`113ao*)E0YKEG8>{Rk!viI#IQFeD?(h1H{XP<*mI^rkJD{>r!%R79@?T~ znyyiWZy%K_HFRV&{<&PM$rS=l>Va<3xumXn2qT)W|BlT;PsH5cbS)rEZo)$V3!nAc zqDSr*pmIlfNzG?dYjw%+f91)AKX09um>ldL&keM}3|DiX*Zi~x`tqwb~g4tABal`Qmh zTSG431DW|?4z%19{!Y{NaOHP(Q|~P8r%LZL)6e-i_XZdf z$|8go124UQ9kH0MWts$z;Nsb0bwQ&A!G4eGJ!GP6mnPP*V>ywHRF=U;qY=V)RKgDP|I5TJL zB6A2&mR74>yE{DXO#fM7Fl=S6JgWA)39?601$lFOX0tb3w`|#-Xk0*LwdwSuPw`Y1 zc&|;=W?GK=#hf%;N;z3tq#D&*$R0`*)ZB3h@jk2%|L|?)MwF^iV9gJflGa{=nTzZC(86lx zOs(hpz#-MDBq(4K*zfEfUccgC&R20{i*f1+d4b8<7@fQvYiTi1To~Uyo1A*4qWa5y2cgz!oz#%^K@11 zj(UIO(mi&^=BvwSm;0ycLHaWF2&a)Wf?edqo{IZfL*yxwT`^3!;)eE7ZIdRFSdRl&51yM`|b*0L>ez{K(D zdFL9s^Sx{uSWA|NEB|wEcV`O->vcLOKlwr%7OP|8JHbnr^&S^HJml$%uo%>4DocQS zCHH_W!PwxJ`9o)wfmm zDNMRZ=ZoNt;ZqjOi3dHtLcC#$ocl^E6N$p}WHALias#SuB7naL?SMIC(&WNGwCs<0 zqVlZE`iH_lHxO zI}2Ou{)vvX{bVDjT7JiavlY(bEmPlCFU2rw0la$*igRojVRO*4a4@?ekkbig)9C*6 zp*9z{o1u?Lsm&7OJ35u!OYSeX_uHUsfV0_Y8YyHrKGT2$$qezpnOnA_@r%tG@xL*$ zfBqq`fO(V`WC>RmF%K%td(ML6P8!eRNPqbw>Ad1#*kJL&?u9jh>)*aBH-VQscW?(0 z@U(W&WOQ8Mir}0c@K1ZVrNK`We&fh1W(U>}k1a=?zMzO_eArojI*Bfm><}z)F0p>a zG$>c15p#R@(6@rZx0;VG|G4s$T5gu4SC22LPvEVUQKu2VSyg`Aj~$t1FMB~Aow=WX zMOSSCc3^bQk@s#q0Op9tj3Oc2WaQ(y&f)ar*;YcN$@hpN429s&*_e4bSfN#tN)*30C8~AF6-|KH{+b#F}j=S;eiSVSn6-p0xUkwfm)c zx8FK1b=r2CN=l)AStvZLnwdUK@F7{+==mC2qrB4Cb9|JRd7Q8AwYKllo5N1m<_4{3%o(-cOk@TMUs31r&^S ze>3mg8Ecx6+92Ka?t6I=4;OcZzIno%Y4slL6&;daaskL2otN2v1^=rr6w-`WAQ$nL1aFo5wOa1qEqz8??uSYMPYWE7f^I6q#zh%QU%e#X zjP10N538)jI8j;*iMjtFxH(&HoHl6Bnez4-?q~6$??;r@ot)G_+o6Dk1yg}N{2(Ig z+{@+x`4DGGl))2Bq?uVyIg^Ng*vJ?6!zR^Qn%U3IV*+nP!f!1E9V#3PI5ms7G_VUhZryELqa83EKx>;M6N+-;5 z!4ktUn`=E9@TAM7NJCc3PEe!u#2Q$I6ZsVj(2c;Fk_HMukXuJgcYP#d zH`3puu8p%KX)Cno@Q^3124039OWMf%pf0p2)~+xxz{Kl!f#t`1`Qr7C>avsX$v>p> z8M-&BXd7O70$zMIc!L~3qxNJFi@LvG@$!pTU$jN3AoPYk?BXIefS&UDAxx)!;P8D4!L&Lpz`Wc2)3lA$fN5>*QvXfCaF6E#B za3Qcq+L_dS#VUlsov2VA5cU_tM4? z)=tlO@x76-l=m3#fN6pcqWcIIz_t@)KFy@F8c*o41;ht0gQ5pa=OK}OdatS>Pj9q! zmgq$T6O{YeKG2JxLVX(5q;S6NMgiV>aS&Jwe(4E8z zG0;%!%AWW#0(-}I@UN9Q=xqme<>^epn(0uXNoBeWc4j*|EgOz!8gtG)QRD*U@^;@G zcuH89lFV5B$Fp#WxwUsGE;4X-_UY^Ao2$6%av9k|gb84LY(5;nBd&0B6 zSUF@TN7wi_OTKVH-lQhRkve zw>oz*IQcSv5yuH=Z+(0*>ixY00(dfJYc;khe@0>r^0X}$aPv5hE$ndUcv!`vTE?=- z-;0Au1cAg+)oWD48SdS;TN3Ev%SyDHl~Y-C_i+{LpTu-w>6uSxder4n&*b~%P(c39 zJX|O8l+HeC*=hZQuGah~YO=s+9r#7Vb>WjJ0t%l>&3_%N-6?s2;`?e>aI>}hIk!udzuW;91V*Jf}g$Ma5^u?VlZf>w)>eoNM z?)Zpya4fGXnu0okN6Y1y{bMEBL$4pZ+H3D#u3u!XaUBQy0PB;rZ_z1|kz)1ItRK+# zA3TzGI0!nByJ;*XIbVLZ*5z-JsKsfwiyj9TuK$~A63f=@zhc-E*eSSZSyBkaV$$IE zx5O(QGlpDCBH+TbwD(T(7~?+@{BApV>DWJxM#8zxt{@$+#IYx$VY}HTTadi|9No|y zq$bTs?Y58if%yV=N>J;Su(RUr2V3tEA)r1Fs_8l~{Suss7hw#Iqw(l+9Cc`J4CiBst(>aD`v{fHK@LF&uCFZTn4~v@nDFt%0?bN0BNM$WdGJ+M&*7#-AcboGj}Q3IY23M}$8DmoGb@ z{5|hu1$QTlYC)~u8R#mgZwm#}PA>m;AYvo9#yfEMBF8_*u5vx1ek;PO z+K`&F15z8rVxf5SyYqlDrfND^kASnv?*^mJ1`(pLf6Mgm4N0JJ&2ryOC&0l5kA8?e%SDk&R3@v2JSoWz_kRz&=m6_&XZk#tBp2(CR~3meNhWjo1R}kh z1l}VZMR$fIUp;s+Pz83jqjw>1G+v)-re(v%zWu(Q9s@C7dc{(`{Gz3vURvq}WcVvf zKzv85eV}^@Mu^3jC%pST zmK@>hP+ZXg*xft$7#2|K#KAW0Et#o|GN|yptXaEBHqo+zv=()!s`s2ewlZ_ zj?~^*kr*p>Y3uL19R802`=`YIOQ?a1rr`><;^#8fv|35#` zLkRreU;W=t{Qq-^;J(e^QKOdhV61bcz2GOB=pvoOq@Kohi}Sf$x4irXcp0SkOfBlJ0Jh2 z(Daz~6dm_CT%4gtH`j6eb{xkbq1|tAI^z3Z+UUQJg`v`a zFkKH}REH06Iv8&eUJy7Ck2zJSY~VilJSDa9qRMs1`Zfe2b8q+y0FZbi|3*gZ{_a|Q zKE&mRfS;+UaYt9CBMH6d4#QGJi?qcseOxCVJyV((;^wuU$T&feyB|#m zE+FfCd&HUFwN!b@i%l9@O{~@AZrcxYvPRQyL>^7X2R?Ekw6=@O7DG1iGkERYARK7# z=EH6`JNqHICY>0C4?&VsEuIbxMc=G@&k8VaVt?@+6p7dYT}K#R@vnL8r8}kL8--Q3?rJhi5%rQdQMVU|F8U1w{;Jic5BCAYli{-!OR0enrP8Q-;TaLYH@+;v9?YSGo)*tC9)9dPDNVw~bZ45w@>XLf45I1$3Z+H{ z=J!Za>h!+4{-?6abs^2XBVGn@0_6J zu}^DibdY)AJt@|$_$Ud3xGk3bOOPsI#7EUJWy3fCoGx9DvC#w}7ISW$IDdf->FUEm ze^z9SjAlvD(&sW7@(*8(9)3Fkfl(a+y@=-h&oGR=ucMgN-hH}@O>SAW?j)`9_f!9^ zFaPU1_p2}Zl*JqbT^;!V4Q+uQ`?EdK)MEMvt;wG&rzzCX_j7=;dWbS{>?l%yyllAl z!yh4YNP|%_S3IL^YE1V9z_xN_aFD4vAjl%OE`L=Yw}WnUC@!$(KzUKW7{>dnhDN|V zaef0MkFjbvLt==241Dz6Wi8Ol|E0t1GPnLK)sHxPp$kT>UP3()apd3XoYsR3ZF93@ zqZvfipAaSKwK5i~(*JmO{=7)XB`Yq}NqcIc&Sto_APQ{)DIEQDk%qV83Q#(*peEMI z`}@uD?$E*#OZlyBB56wgIDPg>J0H&n%iW?lXoEL7a7 zq>R>mQ5__FkzUKv|JiNv1Lq3h!%#Ah2F7%Hqo)i*K(J`+Ly=ND_tUA64M^4BfyX(s?#K{4@r1gRS=CF zOYV0%@~>G&7AGW>8{=kwVfM!Hunwf?idX-m;xY6q=E{u=OlPvAw;quyo_%zL zXfC>H0(Pv01teE$IxA|1Sy7|L0I@%w5r-y-AmUX@^6%J2M?` z?i9oMW{Zr47d&g}_GYS?uX;V;^aG;PunNM%0N}LAF3SmW`F_5JjHrvYm&u#zuzrW- zEwl%BN<3cB&hB4g1sQg+e~YBc#Y`Zt(xQy~qV2p|uO8e;=7mr(YT>vNH`L!f9FdXl zFV`6f+vtxA&v33^1ECvq&n3vYdpv{8YAz^c%0e!WL<|}oodq#UguMmwdeJKRYwO+5 z|I@Cc<3q;cPBiM~jSkA({Fq6K-}7Q=TTo$0@#xnJv#ZhzJx`!m_+EeJk$M^vuD({H zNfm6i5V0OcO$%=uZw)D8U|pHimXUK%hpx}`*x$2BsWejNvU`^!?z>F?hko&C^Y>Kq@BH>( z|JbP;3t?U}_SwHm{du~-nipxeQmSmeHkQpLbgT92GBLS7(k#kix{e6I+tNoq0SdTD zbJ$ zu-CeXqicX_7ZsCBe1)!2VXPdn`Y^$blJfFl9%t$1z6m`4;HNs>g3ax>^KO1ecLv+8 zb|nihD!gyrIz=#wi4_L4a=WW29b=i7yG(fsd|U6vZjJylIXzdPUQ$fqu1D1|JVJ4j zPPORx2LDFif>EmLuKwczbyE_w86*i&dB5c(zMK9A^|)`^jN+SNtCy8yuvINj?emmw z_K%!Ao)yvo+lk2_=Z3#uUrUtj>rTHq7WY0f?+YA|O) zJr-0ln)-fwP=F$UBxh;3idb#UctgC^pfOB~bnegkdb?M2tJ632=?aMV6im7GmzY+e zyDikMM(le{f}^9`(O<63x38d0d?F5BpT)`qTs0O5AeRRdQc0G>_f^Ds*$|R6ngj0( zeL16$o)*}<{?>EZi*FD!b_PwP(6Y9NSm1_Eh%EaD2wPgGZtTWUpH6aqKnP@$hT(Ff zWiDC2q+QAKx9t?o7zcLVtDQY8N532LIVPCmEcw~%k>AHOhI>tn%#Sy-@#0C~1+@5? zKpw5c4DLjfy^wgsuB>5(QqfA!i%kWuH!U4DpyBK|I97jfhw+coaA-W=Vwro+`IiHp zyB5_A#K70zmwm5t?|F>Smr!*4_LZwy5EAbM+B+UBHpp&>JUYNJxP<;cV<@!G%UJAU z8+Ut%4yhjl!-D-RpYR8j@mH^VZ6yXBSq)L8k@a(7(FRqvBSMxG{=8&%fTjKbJfk-4 z9{g5R+5sjk=LBilf4MxO&~+bm`ic1w#?!84{LGa-4~G3aQ-?qjH(tY+OdRbALxlbnb~Ceu?sW3;;tfX~@8T5P<( zF6!rK8=!5DDAotl`Ix8^SnTJ+R<|DU;1m`oGi6aAbR;9{jVewq|Ho-+j6a|TK8$L3 z^4576rovD%FAO8?IYX(=376`2olCd_Rke)T0aWfBRwkBYqJdoL6<-N&3*0D&9Ky{Uri0* zaa7Ok(5W(By!>MR?XMNh<^HcWT-yrg%!s+NJ#Rp_S9)xwRdw&V5drol2Q4f65>)bFb~#ZLDSBz02y~KgEQZeM6R(=@FXC1V#9BD{Arzb zcaz7K6?M<1Uh(t2py6d z$q93Q=3)2!1VcPJ@s(VSKQeq=vZA>Oqx5R}RBMnDG>h<}{*U&)Gpwm@ z+d2sey@T{#rB|gx5Gf)}Kn3Y9Rho2^8bB#Z@0|!pQF`wLk&bkv7o~&_0-=|0d+vGf zJ?Gy0`}=kCV?RlrXYcH+z1CcF&N1egI`bI!x9=O>+EijJ;t&I0zY09 z|NP|+XrtMAcT2sE_>^k&o*q0XQ?lCm7cP3yJ*=2Up#?SwA(J`sZC?8T?oQ$QYJe zwu1K}NatItU0$uReoY?v^quhWW;pcq|n>uo%oaKkSAzf{rfb{=&P|yNCeO)QyP=gRf(~5Cf4&9ytA_y;y zg1H|jyYG0V8z*f@BbgOuMD@o_Bxc9r%gP465eEJ04z{5be4^ zBkz~kTIfPtnRDsk++eOzL)2~FeuK3mCoCHSCsmZG;*cEb+i8G+DDSV&?hn=#BLW?= z9GyLpW7*EtoSB!J(!+phq{VtFT2MxzV(QA8C$ed1iuv;Sm|9nnG9 zJi1$$V2?B*e8k+nwcOFUYhcxQSBE5A9fdXXF1w!>l;|iJ5el4#R=OCHXURiY7i&{8 z6XrB;WOWLw{KzYda(CM~i}1=Q+lA*^)guJJDqGA5ipZlPLRFy9XF=h2*-2|I#17Ep6phS_gZ~K)>%@D-QaV2x}P|vfd+59nq-_AgtlZDs2c96 zp`}2AN4~p)^ITp!&IvbvvoCVIGtnUo=^4JmynYB%;%dlDpeS&Pw47=hF zjY>p&qKXu3PCaWNPb+?Gidljii%Q4ZacWj2RuGUn#180&=CbAegRHd~D*iAtcQ+ry zC35IDT>CPEwr^X%=I|~OzG!@Dx$3b0QkwNPve(o^FK!9$##Pd}|KkywA}uQkA9sZN zBE;2{6vXP%c`w*M5`xK8Qv1N-t%4%nq**P92VOmUq$kA&$2}%Ju&x`zp z#n@oTcM{R$4FX-2&ET9`@YalN8IRR{QiMa^3aWBt+6pq!x$d=du<$tqRVh{IPh^xl zLUv*Uhi{0%cODMG=5=n)>Gdp>+4_#>JMB7W=93C&Eiw2yAyirwQk zFD)VQmiu7zuB~RgHrN+t$mN*BLNRBZEp~#3%0bvZH?gJV-Wex`_%;=g#*)xmM)@yi zcAP?E8>v1KOt>#8ZAHL?wsB~AE>Ed((CKAL$3YGjXXhW}^MQaDx$wz0EFSA}r}Z!R ztt=nTM%ih`v7@5P$zOl^KG@te|4aM|KtGm;2%IhY@zDeS-%NH7nZg0p*P0T;*3aY# znJG;#$Az>J0w9?RT}H%r0wF|@?>ScH8fS8fw&@snI#+0U!vZV*d7AUw7P1cVk^&)s z<6<+L?0!_UnX;)|A1s0+jH~0VgCy|xR{0EchJRJsPy2p{na~60hMhSiA8Ib`L`oCh z)-p~dbV|Wxntq^&I(sbOpTNGb4GDVZ3Wm`P$v`O|&Rmx*^~r;0xwO*LLG!t~ynR1D zWH8m-;}pTB`d|`G^=dkB6fu3kkW&rV>JR1m;9${@_2bPg2bFw`StMqxG%Q(8}9FX`V5RSwR!UoaX z?x6Gg^mYvHuaggKEOI^bHVDbK1{*Z@zXH8@f?TZa;(pN&ibu=hY245(DUAHs8l})KMLGwV4=V=GY14% z0@yssv9sd#c#>tcjNu;~aD#+Yr71v((6#f~_u;vgF^29(Z7Lv-Xl zcR$#@a5wdP!Z)0w&sYna3O)FncQ1lF)S{d3&!$~i(vDwaPapmDJNJCc0p@%Ej?S>i z%7v0np*}*CoVwSGaLTi>5ak&xGp(YzWb$^;e-c56hL%_l3GKYK=Z}R26F#5z;e`{p zY)xZ?&+rIGo|i_1Gta5Gz9__C$pJLKQ4_qCg!S>z#=gQ+{PauDhguKnkV=BQd}(r37d5d1Yxj z0qAXn&0&dijYPFO;7@cy3-^CsubvT(8!Q`lPL~5+(+#schRAH8$9RJcmXB2ESSkj- zxeWY{=)MwOm@_GWw3)EKDU{^NI`EnIRoyz1j$r5b82b(Xl)c68SO(2BOzEs4nj_Mn z1pCq06S|L{aJ2i;(zqMw*+UMLKL<9!g8Ycp? z=7fFh=|r(hx2G6x1A5v)4%`iRkZV?W^@+E~{{|WzFxlb$!3SAecIp9a0V+p|y#;On zsIb-ecHPdbQe&#=B`pn*&^Y{T!n-f|yQ~&|0t$Q}QqWG{aXuIX@`AwbS{{&(XFdW9jRh$r0De!$xT9vb(Wz)4v~s=UcfR;xqxovT@!A%Q6M45#3A~B zoQkj@pVT4(G{t=J=aft#6t$NGp{bR|4?atFLc&omKtK{?c%L2NgL6TBFPJ*7OUt{& z4JD13FUr*NXw?YF<5bYvvFbqx$+@6RRcYv5v6m%O+_)&2vCRR2J4TpFG=r4%sM&k= zTy`Qv_8=~{lzEml1nHB~8ZCufJnswoRpHW8G<=3bVEe#hkDT&dm#y#^UT+tpcXRFy zbZ{*oc}D9JG+Uf(E0?;FNir&u252SAA)L!BC_~oh9w_eqZfcW6#J{*>RHwrtaqh{Z zeUJ0P!0F`K2^~5=$46-kf~(qnk{~?)rxqKczCx_Mvr1i^83g*AvEN@4ZllBIa06cv!sSje;P_FC5}*fH z?s9ZfPth1rh%tc>vj8+V=Nzv1L1TK9Eo_7VeZCvyP*y2x!g%+hOLx{sX1J`}N zwcZ=TEmK6e%(za1F~&X5HhsSNbJ<&&=!B&efFMe-l)2%|2G5w4|E?$Qex0X zOI4@vgcCSTQOtObw+v1%j0OutWR88t(DTjeyqj<$ufD}nRrx+*uKfVLF}eby!znSt zpAax<8qx71%8*}CzYHGmM!^jFt*}9>DR?^U{x^y5(QNb{7ZaP%<&MKiT2bmZZ(88> z^$1cpNr{6&L|QN|A~Qw(hzX8oQ~-%-NqpWz7`e^vq}k^20urtiiWOViRL5l^txV1h z?rnO(uV)1_u3Xyi0uga(G)$=TiCZJ(wE`D+`MO9fn6X4z8I{dh@DqPf11=DegLwb4 zxBp7D`G)WvJHq2zun~Bum!pV}VBmr49*SHWTcgoQGysnUQ~@J2d33m8tR#(vj6u>O zCvx8%2^j4Cczp6mm{1B2^c=PIy@`pG{}J|t*hyn{rGK|?>P&PbHc~hU=c-n{? zt&mB9PBc_pe@B3?tmu>PP()VwoTbI6dsk2O4xCw9WA=FM#f{nq=%#?q%*r7)?q~2g zXgxEb4;Lis>(Uk%7eXeCAOm`?P1PUR0!pN>>WJVMIwPzteoaeauq`RG-tb=xdCXs) zs_NeZ0Zo(bo)dr-LmM}3K_rUjOFf!crvt@Fh>~ZhtSL_-t+^$p&Y)93(cdSgr zgse-57Cb_mZVsQd$;$DU6zB8?#l4!yC4e^-QwWpj`5QGwIL$T~=THOtXHyP-YUpd14 z4Vc1iK3QrK6~)YPmvzqXXU#{!HaXF?^^)={y;X-e;Yns?7R*yNp5tD;vAx%#Gp+9~ zMI(JuZ?(Gl7G8jy=Kz1PXLAWtFxYT11_C9wQ z8&G9mW(*Bzm@aXkf5cyQ1br&2v)}Sd;olQ+06Gbz;a=xl3iyzS;{gh1h>MwOvl!Tu zP8^UT#clrHL*;B1$Oi zxITOrJh-QqCy;s`9r3{!2b{Ha0wcA!h~y)O%N@$~a6FC86tZ()J;1+^mh(ReVVhL5xBd!^-V3C8y~KS$dH%lQ#Mk2u zN8rWrW{!D}D!TBmF3<|+oS6>Kfi{gWQWK&H5sGV_fg$ z$#0YsTBN6F6UEn}ZbD#B<5J%HjgCM^`+y#guIeeSbjdj81Ki$e5DQcLJKJpP-|$a> zj{vYhLQfl)ash)4AS+my$sn0YDLe!LHVvqk_e*2CXB;QqWXWAtzE9VVtY^8((%SF!#w>;~sGHu@)FM5d|awF*;9Bcs>YJ#EGlJwf-s*P}>3{ zIR`$vqnBUo798O<5EuGDiUf#?**TyiJR zFEE~kGoGCRQ25ZKEs6;~&MdTg$TASWGaI$k*U*__l_snbTdagy8I5`g%c2AWOUZGN^#juWu$DPViUn zl5RI7pqwrg1wi>+(JzX#SA*Vd1Zbp5D|HD~i=UHk4wog}dVhi%=5B`tYNtuJw#0Hd zx$?jKk{fRRdS>I)MZ|E6mgQ4?B!;2PVI&rQy;1pDHI{LLeY)jMh+?yhUV(cS1hc|b zj6$NcDl4Y=8WiI?8*T_`boWG)<`!2zg{-+;PR!ThXj^&C*ye2gP~*>{mPbgU6{0gx3Qo!EMu zdv>I*;Zre4>co$kZ61eMzfd2-acOy+0>8|u3{jCvQx&AZk)lBLZq-zTz4TkfJyuS) zo2wI`)0?BfD30xF(-fgI*R#oRPQpH{b%QZLs!|-0GmlfZ(ctP7?hqD0^xQ({_{XNV z9&D?c!&^+8!y60H@{IqK%GVmRNk?JMGHDfDP(>YU-clJTfzhjn~ zoqy~$T~FWXm@m*SPlp-q4|1`ZOF1`buFC-QMY@Bdb{vn^1vHMRz7Nib{dW9bxx$sY zQwDhqW!eK^87HUShEhNk;C|dZDE~bc<^~fnOw) zJP*C7>qF50$a0-YdZwMSA9SU$<%sBuPu*leVF`bw^@pzFkUoMvXj-#~fPi#BWG;Sf ztBR%m1cHg6Ty_LJiTa0hqfRVABKF7AZy%DHFT8k!2K~qa3dB0T!CI8PUs48D_7QQ+wwcxQGDAsOU&IUIzWi(pZ6OminHTF#$ECM)9W=OLjQlBy%yty? zI29=~>UuPNY~mUCKsVx7k%1m`tGY_sK+{J;UUFz#UzR4>`^+aUg&U6(W?ocV@xYVn zfFA8rZIjZQ)AW3sDT1s-u^*f0Sic(+^1JK8YRV=0;dd&9r`-_$d^0F%W8l<3wlH{@ zueL;=w}ovVd90TI=j&e#1I*&zvO6h91^DN6H|K#3OH<{oS#FnXwmP6Gx2 ziuLRt)7M!N@`N}R5*q~+6v7#nNtU_HDTIbvN&tXJ_oBv^HwYr>yixI!>v{TE%^e)s z@n_z(lkK`jUrK(IV$tNnKE5Ekhu|`3*c6`OHj{oTziZ{+RO(V~ zO{m&YYj@cPOb^+~su(HxIVip(MS{q9T_}E$QXR+%P_$75SRv=3?if-vrmljNXxhS9=bm4pyYJoLzzYlDnP5|0yD^cK&H)## zjuLGu)K=auDIwNIC&&T}C1LzL_|4XMm4uGNoH5yrRGhuj3XrJBbLpolTK0W*ezfncAq(l3Iaj`gCKh^g@2)C%-j3 zVoXXCcRVY4J0!zzXXO$Pb3Z&h`m~_Q9J0(}exL}xB%XQ2rQo%@_&s`RD646DTV20A z^K0u_nEN}#^6VsN=*}3>TqtOd4}^j)RRDsPnjU2<49ygDdZ6L32U9L(yOdDn!|wCM zx^z077=|%iYbXe6X}p5>D{-fsx4G+0Vg|k1m5bBY^1bZtd*n;a=FDABr0%;a+9ZEu z1aB|wbc6mKi9_27Yz_T7yZ@LK_shw!b4G- z@xE-55AKJEb&K2sH3T%G@ya|W+VG|V4&bdvssAnKV@LOg12ZnE)s_N~_t(KSRygWH zO&_f8k32^!r%@kMa7W|WO*^NBBSKofkZf2n=sTzufVvfiJaJM;X*D0@KF>Y>EjWe={Yr^5M z8NxFqGd)^I6@yNM3PZyA(V_+@t{6zI+Ro`B!L5f#0SHy!Ouws>FcFJmz5xcxmfIuS zGBi_N2+OUj>R}@;!WsMsGJE#Myr=Z>r4!f(`b$_)8~4l;S!c9<7MEu;zW#a8W4)8* z9fm|W0vyXA`x*uL4jPS|+?bvgY@`HDQ3)8`g^Q2u(WCKJ!U5`+*WNsjj(d!p4MLZa zxf@4NSka7D$jZ@$Sc;419nbIQG|;dtd?e9p+GB1|hEo^@Cy;eiKYy8mMO!GyY@rz= zp2ew5zALj`u`6b)HFpEK8riP^=Z6M;Kag$fB;fd$QLh^`4Dn`AnTx7M9pkEc=!NpP^rAqUr1B=D_RE zHTuMzD{x7c;7@RtE=E$*Mi=P*>Fy&X+f>cuR8((3PrQkjt*?#zg4n=K)1|~(Bxuq0 zWJre0e6R<;u+-|_>@GBDSMM-Y^5K|sGD<$p9~FF${g&HOUnB%d{oR#$^VMa{f{f1NQVs*7A%8V%l+f34a9JNZp z!~8U4;)PMJC0|yW5&O_tv(4eA$WZR*QtZfjrzNtr<)*DPx!tr2+spG8$_Q86NL1OZ z`bl8C%D^qdGt7)U^yG9uhElFN@4z)PvxTu*h^eQtJmREXzKr5&58>rEH-WY=m*L`G zgD`#ZOujciFYWEOENq44AEzhJHzq6TmYm%b&1*qXNpZ@YqV4D_F66O7quu^u|bbg!JHm#tyYa`6qez&(x55<~=&~ z-L{gvpd!6loXc6u!zCMKb ztts`;%UPDG#XCR0p2B)iN6sqaKfTrtwWF%Rb_B*^i%~;7(x4;V`a-6h3Egj+U5?DN zvS>PjIqu1kI$RXm>zl)b*ltqOO3Tj|sWLQ2XtkuyBA+3#Ek9KcD%U8a=C6L+O+sd7 zX6?=KyA-}dU8P1#F__OsGPK_!nBtxDAZSmZ3V-;bx*xGeY zp{ibN?hR95c|To5)jIawj32Gc3NFJB4fR~zn_3csE-GoV+GGM6&~Y!{WF5vaw^Ivc ze_$?m*P9fFZ4C_HlSAViZK~BO9mFzsEl}yc@gpnd*%0TU4t_PLmMZi~)$~@)?`C0x zgVo$kAozI-yMlXt-1l>_1*U;Z!Vy-bGIUpR*L@lyNzub6TW5V>J=31IaVe|qw>!Nl zJctp>qCx>zu`!?6Xi*-F#vI z6LjLTH$Q`GAfICxTmJ}$c&bV>V|^dDe_Kx|zl5z&9xUiA_!!yxk~QWsOY+qt+JvLo zYNjkj+rRQ9P8%f|7~`$ssYnSisH7Q*Fq^Me=ui~>l-_b+WstBm!Dq7J;qB&^Id7tT zWJP>hD)kU3vo(zDq<+2I;r0YymJpAbAM{pA`{?dPi&j9sJL1W~AX9E$FzpkJSNxP* zmlSQa^465HN|C$#eNX7x@OqEx&%upX(kA_G{l^k-7A`EurM`JHGd_saUpHozBX;^C zJG`~#LhOD+&hb5K{7u$)p<1;UU+q2Jtknt8^J`Nk9)<7x;oH;%)w*X|`MW|kAN@sr z1#o_E>K9hqw^=&QYRLgYV;%)N3(Z1F5=*rO{4t=b$zG{jhe1gm+r>&^F>kewZqMMM zO1_kybz{B(xAg3ztncj>O|=~b!v}N{ool`^4%&?)t|9(2aWC51M~*(Y24?#W2m1*=~nIpC&i_S6qL zVo?5ahAFQ;G#f^_j-5)QC`TrdVVS=iLSyj^+psC+9%ax@fj-YT&y;w_W1wM!Qr=f9uNJbz`t)u0@UfX``L#${aoK7t1>=G+spzxW^&Q;-HLQ4l*4hrMiu zN#0O^?WD1BfAM?xIp(F~E0AB-2=218)6;%bN3j$d_Fd`*au~dp3@(IT;KAdxvv&n; zic>tVroH2|@}-FS2a>gI2fCx^`x?m?CpYvRE94H(&BoZBR$dRn%~$PBab5iBc0EPF zO(V+EHYeii&mw>2moCO+4xCkyhL<=;zliD{zU;SDS9SksCL--7 z9p%V=jn%gPSvfyjeSzd`DhTIZdw|2~r_Y;Py_SCxSnAwk=@&PTj zW;@!Gi;oqu6V$D*W^46r{5@X#o2ZM(N>dkQNdUjHhTvukbNrY!_b|*}=lnrTa zscr>qc=V$A0sXf=8CR2=%I)*v0MYHg?80m4h3dTfZ5gAlea^Hs23tS6I%lk@9bM6u zz4161dHJm|V0rnY6#Lmxn_fNCht_GKriEI9fQ#il^X?bpB6>(nW{jUaj@*D}k@ncw zNT2ckRldO5#iiulK&*_tyWCyCDyN^A zd~8@BJkJYzd@Y7)U-@>8-{3r|sB88*=OWMlDMsS7IS2Dabgz(>(1UIQ>sLuJ@g!2WAV+U$1_& zeMZ`&CpajIR0^_m;!U9yqmXd^R(p^#ac&flOe^S{>;8852lZB3V2H~w?yTnG>4lGR zhFWvNoc*=`ZQ0+u)7^?=2=-RW;sp5}9i%Ea*x*Xdm{xIhbF+9T4~N7om1@!Q2~V%0 zeF)ICY`?a|2N@s@aa{XKvT{L!KD<7Z()&GCVv-QxNO4RrrW-C%ER%QdD- z%7VUiW~8xxqdAP%R;3O7;ImL}uYab>Q{gLCP-zy);;MI$_tFTfB2_a6`{3}XL#MhqKO{he7-ZY3HP_jKIdogWlHoc z%6Bf6V#A)aO}s33%AFg^KN9I*E$Gd^T$ZFZ;>wfci9veqp*HFkoXbhfnWn-p)j>VQ zxQFq!*(Eh(MVEfeN{*-VyK5YyfnQZt+t+x)AW?Wr>HjhFjt#`1CS zfTm8PeED)ZMTd2niAQ{E$+g>#0*^lKwCINr5B^A`t-fpdWw+GBie&fjVHaYuqJ7NK zc`EL7f~f7n-1aX9zj)m&vT!rUjN!Gm%@_~olBfxR8lg76N1optDav*UW|E}l^}^Jk znQ5cPTtdbKwAaJ6vD?&6ky?kh-Gm+QS{ALSV>H1qN*y?GcufHVdJIL>Zi(<9;o1-a z*p@GE{u&>dnlvfLNoBXDC{f+lIn+yKw z()=;l#VdDR4KY32+7ImKnuvykl|=G{?{9!0R}1xKw`KYwN6sjT1dv4YT%8k|K*EauP0@#( z6_x1rZp}y38B6W_!|4CouKs=ppMw%k)R(HvGs7qio`IeJ@;?63t}LDOl)xE%R{2Wi zbcM?^df7DAew5E~v8A^9HlcTB;gfvBCi|tYLLpSxi>l1}Rdw`Pd`15FNAut3 e+yB22xy6YTE#E?3&*g)F*CS=Ehh-1Uga0308#++{ diff --git a/src/Live/abstract_container.jl b/src/Live/abstract_container.jl new file mode 100644 index 000000000..9ef0de732 --- /dev/null +++ b/src/Live/abstract_container.jl @@ -0,0 +1,44 @@ +""" + AbstractWidgetContainer + +`AbstractWidgetContainer` contain multiple other widgets +and can coordinate their activity. +AbstractWidgetContainer must have two obligatory fields on top of AbstractWidget's fields: + widgets::Vector{AbstractWidget} + active::Int +""" +abstract type AbstractWidgetContainer <: AbstractWidget end + +""" +Set the parent of all widgets in `container` to `container`. +""" +set_as_parent(container::AbstractWidgetContainer) = map( + w -> w.internals.parent = container, + (container.widgets isa AbstractDict ? values(container.widgets) : container.widgets), +) + +""" +Return the active widget in `container`. +""" +get_active(container::AbstractWidgetContainer) = container.widgets[container.active] + +""" +Set the active widget in `container` to `active`. +""" +set_active(container::AbstractWidgetContainer, active) = container.active = active + +""" +Set the active widget in `container` to the next widget. +""" +function activate_next_widget(widget::AbstractWidget, ::Any) + widget.active = min(widget.active + 1, length(widget.widgets)) + return :stop +end + +""" +Set the active widget in `container` to the previous widget. +""" +function activate_prev_widget(widget::AbstractWidget, ::Any) + widget.active = max(widget.active - 1, 1) + return :stop +end diff --git a/src/Live/abstract_widget.jl b/src/Live/abstract_widget.jl new file mode 100644 index 000000000..94e21184d --- /dev/null +++ b/src/Live/abstract_widget.jl @@ -0,0 +1,117 @@ +# ---------------------------------------------------------------------------- # +# ABSTRACT WIDGET # +# ---------------------------------------------------------------------------- # + +""" + AbstractWidget + +Abstract widgets must have three obligatory fields: + measure::Measure + controls:: Dict{Union{KeyInput, Char}, Function} + parent::Union{Nothing, AbstractWidget} + +and one optional one + on_draw::Union{Nothing, Function} = nothing +""" +abstract type AbstractWidget end + +""" + WidgetInternals + +This struct is used to store the internal state of a widget as well as +callbacks assigned to it. +""" +mutable struct WidgetInternals + measure::Measure + parent::Union{Nothing,AbstractWidget} + on_draw::Union{Nothing,Function} + on_activated::Function + on_deactivated::Function + active::Bool +end + +# ----------------------------- widget functions ----------------------------- # +""" + get_active(w::AbstractWidget) + +Nothing: no children. +""" +get_active(::AbstractWidget) = nothing + +""" + isactive(w::AbstractWidget) + +Returns true if the widget is active, i.e. if it is the active widget +""" +function isactive(widget::AbstractWidget) + par = AbstractTrees.parent(widget) + isnothing(par) && return true + return widget == get_active(par) && isactive(par) +end + +""" +Default callback for a widget being activated +""" +on_activated(wdg::AbstractWidget) = wdg.internals.active = true + +""" +Default callback for a widget being deactivated +""" +on_deactivated(wdg::AbstractWidget) = wdg.internals.active = false + +""" +Quit the current app, potentially returning some value. +""" +function quit end +quit(::Nothing) = return +quit(widget::AbstractWidget, ::Any) = quit(AbstractTrees.parent(widget)) +quit(widget::AbstractWidget) = quit(AbstractTrees.parent(widget)) + +""" +Get the current content of a widget +""" +frame(::AbstractWidget) = error("Not implemented") + +# ------------------------------ tree structure ------------------------------ # + +""" +Methods to let the AbstractTrees API handle applications as tree +structures based on the nesting of widgets. +""" + +function AbstractTrees.children(widget::AbstractWidget) + hasfield(typeof(widget), :widgets) || return [] + widget.widgets isa AbstractDict && return collect(values(widget.widgets)) + return widget.widgets +end + +function AbstractTrees.parent(widget::AbstractWidget) + hasfield(typeof(widget), :parent) && return widget.parent + return widget.internals.parent +end + +""" + print_node(io, x) + +Print function to print a node (widget) in an application's hierarchy tree. +It prints the node's stated dimensions vs its content's (calling `frame`). +Used for debugging +""" +function print_node(io, x) + color = isactive(x) ? "bright_blue" : "dim blue" + style = isactive(x) ? "default" : "dim" + content = frame(x) + + measure = hasfield(typeof(x), :measure) ? x.measure : x.internals.measure + hx, wx = measure.h, measure.w + hc, wc = content.measure.h, content.measure.w + + h_color = hx >= hc ? style : "red" + w_color = wx >= wc ? style : "red" + + msg = """{$color}$(typeof(x)){/$color} {dim} ($hx, $wx){/dim} + {$style}content: ({$h_color}$hc{/$h_color}, {$w_color}$wc{/$w_color}){/$style}""" + print(io, apply_style(msg)) +end + +Base.print(io::IO, widget::AbstractWidget) = print_tree(print_node, print, io, widget) diff --git a/src/Live/app.jl b/src/Live/app.jl new file mode 100644 index 000000000..b572cb43e --- /dev/null +++ b/src/Live/app.jl @@ -0,0 +1,535 @@ +# ---------------------------------------------------------------------------- # +# APP INTERNALS # +# ---------------------------------------------------------------------------- # +""" +struct AppInternals + iob::IOBuffer + ioc::IOContext + term::AbstractTerminal + prevcontent::Union{Nothing, AbstractRenderable, String} + prevcontentlines::Vector{String} + raw_mode_enabled::Bool + last_update::Union{Nothing, Int} + refresh_Δt::Int + help_shown::Bool +end + +`AppInternals` handles "under the hood" work for live widgets. +It takes care of keeping track of information such as the content +displayed at the last refresh of the widget to inform the printing +of the widget's content at the next refresh. + +AppInternals also holds linked_widgets which can be used to link to +other widgets to access their internal variables. +""" +@with_repr mutable struct AppInternals + iob::IOBuffer + ioc::IOContext + term::AbstractTerminal + prevcontent::Union{Nothing,AbstractRenderable} + prevcontentlines::Vector{String} + raw_mode_enabled::Bool + last_update::Union{Nothing,Int} + refresh_Δt::Int + help_shown::Bool + help_message::Union{Nothing,String} + should_stop::Bool + + function AppInternals(; refresh_rate::Int = 60, help_message = nothing) + # get output buffers + iob = IOBuffer() + ioc = IOContext(iob, :displaysize => displaysize(stdout)) + + # prepare terminal + raw_mode_enabled = try + raw!(terminal, true) + true + catch err + @debug "Unable to enter raw mode: " exception = (err, catch_backtrace()) + false + end + + # hide the cursor + raw_mode_enabled && print(terminal.out_stream, "\x1b[?25l") + return new( + iob, + ioc, + terminal, + nothing, + String[], + raw_mode_enabled, + nothing, + (Int ∘ round)(1000 / refresh_rate), + false, + help_message, + false, + ) + end +end + +# ---------------------------------------------------------------------------- # +# APP # +# ---------------------------------------------------------------------------- # + +# ------------------------------- CONSTRUCTORS ------------------------------- # +""" +An `App` is a collection of widgets. + +!!! tip + Transition rules bind keys to "movement" in the app to change + focus to a different widget +""" +@with_repr mutable struct App <: AbstractWidgetContainer + internals::AppInternals + measure::Measure + controls::AbstractDict + parent::Union{Nothing,AbstractWidget} + compositor::Compositor + layout::Expr + width::Int + height::Int + expand::Bool + widgets::AbstractDict + transition_rules::AbstractDict + active::Symbol + on_draw::Union{Nothing,Function} + on_stop::Union{Nothing,Function} +end + +isactive(::App) = true + +""" +Execute a transition rule to switch focus to another widget. +""" +function execute_transition_rule(app::App, key)::Bool + haskey(app.transition_rules, key) || return false + rulesset = app.transition_rules[key] + haskey(rulesset, app.active) || return false + app.active = rulesset[app.active] + return true +end + +function quit(app::App) + app.internals.should_stop = true + return nothing +end + +app_controls = Dict( + 'q' => quit, + Esc() => quit, + 'h' => toggle_help, + :setactive => execute_transition_rule, +) + +""" + App( + widget::AbstractWidget; + controls::AbstractDict = app_controls, + width=1.0, + height=min(40, console_height()), + kwargs... + ) + +Convenience constructor for an `App` with a single widget. +""" +function App( + widget::AbstractWidget; + controls::AbstractDict = app_controls, + width = 1.0, + height = min(40, console_height()), + kwargs..., +) + layout = :(A($height, $width)) + return App( + layout; + widgets = Dict{Symbol,AbstractWidget}(:A => widget), + controls = controls, + height = height, + width = fint(width * console_width()), + kwargs..., + ) +end + +function App( + layout::Expr; + widgets::Union{Nothing,AbstractDict} = nothing, + transition_rules::Union{Nothing,AbstractDict} = nothing, + width = console_width(), + height = min(40, console_height()), + controls::AbstractDict = app_controls, + on_draw::Union{Nothing,Function} = nothing, + on_stop::Union{Nothing,Function} = nothing, + expand::Bool = true, + help_message::Union{Nothing,String} = nothing, +) + + # parse the layout expression and get the compositor + compositor = Compositor( + layout; + max_w = min(console_width(), width), + max_h = min(console_height(), height), + ) + measure = render(compositor).measure + + # if widgets are not provided, create empty widgets placeholders + widgets = if isnothing(widgets) + make_placeholders(compositor) + else + widgets + end + + # check that the layout and the widgets match + layout_keys = compositor.elements |> keys |> collect + widgets_keys = widgets |> keys |> collect + @assert issetequal(layout_keys, widgets_keys) "Mismatch between widget names and layout names: $layout_keys vs $widgets_keys" + + on_activated(widgets[first(widgets_keys)]) + + # enforce the size of each widget + widgets = enforce_app_size(compositor, widgets) + + transition_rules = + isnothing(transition_rules) ? infer_transition_rules(layout) : transition_rules + + msg_style = TERM_THEME[].emphasis + app = App( + AppInternals(; help_message = help_message), + measure, + controls, + nothing, + compositor, + layout, + width, + height, + expand, + widgets, + transition_rules, + widgets_keys[1], + on_draw, + on_stop, + ) + + set_as_parent(app) + return app +end + +""" + infer_transition_rules(layout::Expr)::Dict + +If no transition rules are passed, infer them from the layout's +spatial relationships. +""" +function infer_transition_rules(layout::Expr)::Dict + """ recursively get widgets in a layout elements """ + function get_elements(elem::Expr) + out = [] + for node in PreOrderDFS(elem) + node isa Expr || continue + node.args[1] ∉ (:*, :/) && push!(out, node.args[1]) + end + return out + end + get_elements(x) = nothing + + transition_rules = Dict( + ArrowRight() => Dict(), + ArrowLeft() => Dict(), + ArrowDown() => Dict(), + ArrowUp() => Dict(), + ) + + for node in PreOrderDFS(layout) + if node isa Expr + op = node.args[1] + op ∈ (:*, :/) || continue + source = get_elements(node.args[2]) + dest = get_elements(node.args[3]) + + # store commands to and from widgets + first_key, second_key = + op == :* ? (ArrowRight(), ArrowLeft()) : (ArrowDown(), ArrowUp()) + for w in source + transition_rules[first_key][w] = dest[1] + end + for w in dest + transition_rules[second_key][w] = source[1] + end + end + end + + return transition_rules +end + +""" +If no widget was passed, create placeholder widgets. +""" +function make_placeholders(compositor) + elements = compositor.elements + colors = if length(elements) > 1 + getfield.(Palette(blue, pink; N = length(elements)).colors, :string) + else + [pink] + end + + ws = Dict() + for (i, (name, elem)) in enumerate(pairs(elements)) + ws[name] = PlaceHolderWidget(elem.h, elem.w, string(name), colors[i]) + end + return ws +end + +""" + enforce_app_size(compositor::Compositor, widgets::AbstractDict) + +Called when an App is first created to set the size of all widgets. +""" +function enforce_app_size(compositor::Compositor, widgets::AbstractDict) + _keys = widgets |> keys |> collect + + for k in _keys + elem, wdg = compositor.elements[k], widgets[k] + wdg.internals.measure = Measure(elem.h, elem.w) + on_layout_change(wdg, wdg.internals.measure) + end + return widgets +end + +""" + enforce_app_size(app::App, measure::Measure) + +Called when a console is resized to adjust the apps layout. +""" +function enforce_app_size(app::App, measure::Measure) + compositor = Compositor(app.layout; max_w = measure.w, max_h = measure.h) + _keys = app.widgets |> keys |> collect + + for k in _keys + elem, wdg = compositor.elements[k], app.widgets[k] + wdg.internals.measure = Measure(elem.h, elem.w) + on_layout_change(wdg, wdg.internals.measure) + end + + app.compositor = compositor +end + +# ----------------------------------- frame ---------------------------------- # + +""" + on_layout_change(app::App) + +Called when the console is resized to adjust the apps layout. +""" +function on_layout_change(app::App) + new_width = app.expand ? console_width() : min(app.width, console_width()) + new_width == app.measure.w && return + + erase!(app) + clear(stdout) + + # the console is too small, re-design + app.measure = Measure(app.measure.h, new_width) + enforce_app_size(app, app.measure) +end + +""" + frame(app::App) + +Render the app and its content. +""" +function frame(app::App; kwargs...) + isnothing(app.on_draw) || app.on_draw(app) + + # adjust size to changes in console + on_layout_change(app) + + for (name, widget) in pairs(app.widgets) + # toggle active + if length(app.widgets) > 1 + app.active == name ? widget.internals.on_activated(widget) : + widget.internals.on_deactivated(widget) + end + + content = frame(widget) + + update!(app.compositor, name, content) + end + + # reset the activation state of each widget + for widget in values(app.widgets) + # wasactive, willbeactive = widget.internals.active, isactive(widget) + # !wasactive && willbeactive && widget.internals.on_activated(widget) + + widget.internals.active = isactive(widget) + end + + return render(app.compositor) +end + +""" + add_debugging_info!(content::AbstractRenderable, app::App)::AbstractRenderable + +Add debugging information to the top of the app. +""" +function add_debugging_info!(content::AbstractRenderable, app::App)::AbstractRenderable + # print the app's layout as a TREE + tree = sprint(print, app) + + debug_info = Panel(tree; width = content.measure.w) + return debug_info / content +end + +# ---------------------------------------------------------------------------- # +# RENDERING # +# ---------------------------------------------------------------------------- # + +""" + shouldupdate(app::App)::Bool + +Check if a widget's display should be updated based on: + 1. enough time elapsed since last update + 2. the widget has not beed displayed het +""" +function shouldupdate(app::App)::Bool + currtime = Dates.value(now()) + isnothing(app.internals.last_update) && begin + app.internals.last_update = currtime + return true + end + + Δt = currtime - app.internals.last_update + if Δt > app.internals.refresh_Δt + app.internals.last_update = currtime + return true + end + return false +end + +""" + replace_line(internals::AppInternals) + +Erase a line and move cursor +""" +function replace_line(internals::AppInternals) + erase_line(internals.ioc) + down(internals.ioc) +end + +""" + replace_line(internals::AppInternals, newline) + +Erase a line, write new content and move cursor. +""" +function replace_line(internals::AppInternals, newline) + erase_line(internals.ioc) + println(internals.ioc, newline) +end + +""" + refresh!(live::AbstractWidget)::Tuple{Bool, Any} + +Update the terminal display of a app. + +this is done by calling `frame` on the app to get the new content. +Then, line by line, the new content is compared to the previous one and when +a discrepancy occurs the lines gets re-written. +This is all done printing to a buffer first and then to `stdout` to avoid +jitter. +""" +function refresh!(app::App) + # check for keyboard inputs + retval = keyboard_input(app) + app.internals.should_stop && return something(retval, []) + + # check if its time to update + shouldupdate(app) || return nothing + + # get new content + internals = app.internals + content::AbstractRenderable = frame(app) + + LIVE_DEBUG[] == true && begin + content = add_debugging_info!(content, app) + end + + content_lines::Vector{String} = split(string(content), "\n") + nlines::Int = length(content_lines) + nlines_prev::Int = + isnothing(internals.prevcontentlines) ? 0 : length(internals.prevcontentlines) + old_lines = internals.prevcontentlines + nlines_prev == 0 && print(internals.ioc, "\n") + + # render new content + up(internals.ioc, nlines_prev) + for i in 1:nlines + line = content_lines[i] + + # avoid re-writing unchanged lines + !isnothing(internals.prevcontent) && + nlines_prev > i && + begin + old_line = old_lines[i] + line == old_line && begin + down(internals.ioc) + continue + end + end + + # re-write line + replace_line(internals, line) + end + + # output + internals.prevcontent = content + internals.prevcontentlines = content_lines + write(stdout, take!(internals.iob)) + return nothing +end + +""" + erase!(app::App) + +Erase a app from the terminal. +""" +function erase!(app::App) + isnothing(app.internals.prevcontent) && return + + nlines = app.internals.prevcontent.measure.h + up(app.internals.ioc, nlines) + cleartoend(app.internals.ioc) + write(stdout, take!(app.internals.iob)) + nothing +end + +""" + stop!(app::App) + +Restore normal terminal behavior. +""" +function stop!(app::App) + Base.stop_reading(stdin) + + internals = app.internals + print(internals.term.out_stream, "\x1b[?25h") # unhide cursor + print(stdout, "\x1b[?25h") + raw!(internals.term, false) + nothing +end + +""" + play(app::App; transient::Bool=true) + +Keep refreshing a renderable, until the user interrupts it. +""" +function play(app::App; transient::Bool = true) + Base.start_reading(stdin) + + retval = nothing + while isnothing(retval) + retval = refresh!(app) + end + stop!(app) + transient && erase!(app) + + retval = length(retval) > 0 ? retval[1] : retval + return retval +end diff --git a/src/Live/buttons.jl b/src/Live/buttons.jl new file mode 100644 index 000000000..c0c1f179b --- /dev/null +++ b/src/Live/buttons.jl @@ -0,0 +1,191 @@ +# ---------------------------------------------------------------------------- # +# AbstractButton # +# ---------------------------------------------------------------------------- # +abstract type AbstractButton <: AbstractWidget end + +""" +set the buttoon's state to :presed. +""" +function press_button(b::AbstractButton, ::Union{SpaceBar,Enter}) + if b.status == :not_pressed + b.lastpressed = Dates.value(now()) + b.status = :pressed + isnothing(b.callback) || return b.callback(b) + else + b.status = :not_pressed + end + return nothing +end + +button_controls = + Dict('q' => quit, Esc() => quit, Enter() => press_button, SpaceBar() => press_button) + +function on_layout_change(b::AbstractButton, m::Measure) + b.internals.measure = m +end + +""" + make_button_panel(message, color, text_color, pressed, active, w, h; kwargs...) + +Create a panel to display a button. +""" +function make_button_panel(message, color, text_color, pressed, active, w, h; kwargs...) + if pressed == :active + style = "$(text_color) on_$(color)" + background = color + else + style = active ? color : "dim $color" + background = "" + end + + return Panel( + "{$text_color on_$(background)}$message{/$text_color on_$(background)}", + style = style, + width = w, + height = h, + justify = get(kwargs, :justify, :center), + background = background, + kwargs..., + ) +end + +# ---------------------------------------------------------------------------- # +# Button # +# ---------------------------------------------------------------------------- # +# ------------------------------- constructors ------------------------------- # + +""" + Button + +A button widget. +It's display changes when pressed. +A callback can be set to be called when the button is pressed. +""" +@with_repr mutable struct Button <: AbstractButton + internals::WidgetInternals + controls::AbstractDict + message::String + status::Symbol + callback::Union{Nothing,Function} + lastpressed::Int + color::String + text_color::String + kwargs +end + +function Button( + message::String; + controls::AbstractDict = button_controls, + text_color = "bold white", + color = "red", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + return Button( + WidgetInternals(Measure(), nothing, on_draw, on_activated, on_deactivated, false), + controls, + message, + :not_pressed, + nothing, + 0, + color, + text_color, + kwargs, + ) +end + +# ----------------------------------- frame ---------------------------------- # +function frame(b::Button; kwargs...) + isnothing(b.internals.on_draw) || b.internals.on_draw(b) + + status = if b.status == :pressed + currtime = Dates.value(now()) + + if currtime - b.lastpressed > 100 + b.status = :not_pressed + :inactive + else + :active + end + else + :inactive + end + + return make_button_panel( + b.message, + b.color, + b.text_color, + status, + isactive(b), + b.internals.measure.w, + b.internals.measure.h; + kwargs..., + ) +end + +# ---------------------------------------------------------------------------- # +# TOGGLE BUTTON # +# ---------------------------------------------------------------------------- # +# ------------------------------- constructors ------------------------------- # +""" +A button. Pressing it toggles its status between +activated and not. +""" +@with_repr mutable struct ToggleButton <: AbstractButton + internals::WidgetInternals + controls::AbstractDict + message::String + status::Symbol + callback::Union{Nothing,Function} + lastpressed::Int + color::String + text_color::String + kwargs +end + +function ToggleButton( + message::String; + controls::AbstractDict = button_controls, + text_color = "bold white", + color = "red", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + return Button( + WidgetInternals(Measure(), nothing, on_draw, on_activated, on_deactivated, false), + controls, + message, + :not_pressed, + nothing, + 0, + color, + text_color, + kwargs, + ) +end + +# ----------------------------------- frame ---------------------------------- # +function frame(b::ToggleButton; kwargs...) + isnothing(b.internals.on_draw) || b.internals.on_draw(b) + + status = if b.status == :pressed + :active + else + :inactive + end + + return make_button_panel( + b.message, + b.color, + b.text_color, + status, + isactive(b), + b.internals.measure.w, + b.internals.measure.h; + kwargs..., + ) +end diff --git a/src/Live/gallery.jl b/src/Live/gallery.jl new file mode 100644 index 000000000..0910d9eff --- /dev/null +++ b/src/Live/gallery.jl @@ -0,0 +1,80 @@ +""" +A `Gallery` containes multiple widgets, but only shows one at the time. +""" +@with_repr mutable struct Gallery <: AbstractWidgetContainer + internals::WidgetInternals + controls::AbstractDict + widgets::Vector{AbstractWidget} + active::Int + show_panel::Bool + title::String +end + +gallery_controls = Dict( + ArrowRight() => activate_next_widget, + ArrowLeft() => activate_prev_widget, + 'q' => quit, + Esc() => quit, +) + +function Gallery( + widgets::Vector; + controls = gallery_controls, + height::Int = console_height() - 5, + width::Int = console_width(), + show_panel::Bool = true, + title::String = "Widget", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + # set widgets size + Δ = show_panel ? 4 : 0 + measure = Measure(height, width) + for wdg in widgets + on_layout_change(wdg, Measure(measure.h - Δ, measure.w - Δ)) + end + + gal = Gallery( + WidgetInternals(measure, nothing, on_draw, on_activated, on_deactivated, false), + controls, + widgets, + 1, + show_panel, + title, + ) + set_as_parent(gal) + return gal +end + +function on_layout_change(gal::Gallery, m::Measure) + gal.internals.measure = m + Δ = gal.show_panel ? 4 : 0 + for wdg in gal.widgets + on_layout_change(wdg, Measure(m.h - Δ, m.w - Δ)) + end +end + +# ----------------------------------- frame ---------------------------------- # +function frame(gal::Gallery; kwargs...) + isnothing(gal.internals.on_draw) || gal.internals.on_draw(gal) + + content = frame(get_active(gal)) + gal.show_panel || return content + + style = gal.show_panel && isactive(gal) ? "dim" : "hidden" + + Panel( + content; + title = gal.show_panel ? "$(gal.title) $(gal.active)/$(length(gal.widgets))" : + nothing, + justify = :center, + style = style, + title_style = "default", + title_justify = :center, + fit = false, + width = gal.internals.measure.w, + height = gal.internals.measure.h, + padding = (1, 1, 1, 1), + ) +end diff --git a/src/Live/help.jl b/src/Live/help.jl new file mode 100644 index 000000000..d22af5f57 --- /dev/null +++ b/src/Live/help.jl @@ -0,0 +1,88 @@ +""" +display/hide help tooltip +""" +function toggle_help(app, args...;) + internals = app.internals + width = app.measure.w + msg = + if !isnothing(internals.help_message) == true + parse_md(Markdown.parse(app.internals.help_message); width = width - 6) + else + "{dim} no help message shown{/dim}" + end |> RenderableText + + # get the docstring of the currently active widget + active_widget = app.widgets[app.active] + widget_msg = + something( + parse_md(getdocs(active_widget); width = max(20, width - 6)), + "{dim} no help message shown{/dim}", + ) |> RenderableText + + # get the docstring of each control method + col = TERM_THEME[].text_accent + all_controls = [pairs(active_widget.controls)..., pairs(app.controls)...] + already_added = [] + controls = [] + + for (k, c) in all_controls + (k ∈ already_added || k isa Symbol) && continue + + push!( + controls, + RenderableText( + "{bold $col} - $(k){/bold $col}: " * + parse_md(getdocs(c); width = max(20, width - 20)), + ), + ) + push!(already_added, k) + end + # create content + content = [ + msg, + "", + RenderableText( + md"#### Active widget: $(typeof(active_widget))"; + width = width - 10, + ), + "", + widget_msg, + "", + RenderableText(md"#### Controls"; width = width - 10), + controls..., + ] + + # create full message + help_message = Panel( + content; + width = width, + title = "Help", + title_style = "default bold blue", + title_justify = :center, + style = "dim", + ) + + # show/hide message + if internals.help_shown + # hide it + internals.help_shown = false + + # go to the top of the error message and delete everything + h = + console_height() - length(internals.prevcontentlines) - help_message.measure.h - + 1 + move_to_line(stdout, h) + cleartoend(stdout) + + # move cursor back to the top of the live to re-print it in the right position + move_to_line(stdout, console_height() - length(internals.prevcontentlines)) + else + # show it + erase!(app) + println(stdout, help_message) + internals.help_shown = true + end + + internals.prevcontent = nothing + internals.prevcontentlines = String[] +end diff --git a/src/Live/keyboard_input.jl b/src/Live/keyboard_input.jl new file mode 100644 index 000000000..e2b706306 --- /dev/null +++ b/src/Live/keyboard_input.jl @@ -0,0 +1,62 @@ + +""" + keyboard_input(widget::AbstractWidget) + +Get keyboard input from the terminal and execute the corresponding control function +if it exists. Returns a list of return values from the control functions. +""" +function keyboard_input(widget::AbstractWidget) + controls = widget.controls + if bytesavailable(terminal.in_stream) > 0 + # get input + c = readkey(terminal.in_stream) + c = haskey(KEYs, Int(c)) ? KEYs[Int(c)] : Char(c) + + # see if a control has been defined for this key + haskey(controls, c) && return controls[c](widget, c) + + # see if we can just pass any character + c isa Char && haskey(controls, Char) && return controls[Char](widget, c) + end + return [] +end + +""" + keyboard_input(widget::AbstractWidgetContainer) + +Get keyboard input from the terminal and execute the corresponding control function for active widgets. +""" +function keyboard_input(widget::AbstractWidgetContainer) + retvals = [] + if bytesavailable(terminal.in_stream) > 0 + # get input + c = readkey(terminal.in_stream) + c = haskey(KEYs, Int(c)) ? KEYs[Int(c)] : Char(c) # ::Union{Char, KeyInput} + + # execute command on each subwidget + for wdg in PreOrderDFS(widget) + retval = nothing + controls = wdg.controls + + # see if key is an app control key + haskey(controls, :setactive) && begin + control_exectued = controls[:setactive](wdg, c) + control_exectued && return retval + end + + # only apply to active widget(s) + isactive(wdg) || continue + + # see if a control has been defined for this key + haskey(controls, c) && (retval = controls[c](wdg, c)) + + # see if we can just pass any character + c isa Char && haskey(controls, Char) && (retval = controls[Char](wdg, c)) + + # if retval says so, stop looking at other widgets here + retval == :stop && break + isnothing(retval) || push!(retvals, retval) + end + end + return retvals +end diff --git a/src/Live/live.jl b/src/Live/live.jl new file mode 100644 index 000000000..c9ed7ccc8 --- /dev/null +++ b/src/Live/live.jl @@ -0,0 +1,96 @@ +module LiveWidgets +using REPL.TerminalMenus: readkey, terminal +using REPL.Terminals: raw!, AbstractTerminal +using Dates +import Base.Docs: doc as getdocs +using Markdown +using AbstractTrees +import MyterialColors: Palette, blue, pink + +import MyterialColors: pink + +import Term: default_width, reshape_text, TERM_THEME, fint, reshape_code_string, remove_ansi +import ..Renderables: AbstractRenderable, RenderableText +import ..Panels: Panel +import ..Measures: Measure +import ..Measures: width as get_width +import ..Measures: height as get_height +using ..Consoles +import ..Repr: @with_repr, termshow +import ..Style: apply_style +import ..Layout: Spacer, vLine, vstack, hLine, hstack, PlaceHolder +import ..Compositors: Compositor, render, update! +import ..Tprint: tprint +import ..TermMarkdown: parse_md + +export AbstractWidget, refresh!, play, key_press, shouldupdate, frame, stop! +export Pager +export SimpleMenu, ButtonsMenu, MultiSelectMenu +export InputBox, TextWidget, Button, ToggleButton +export Gallery +export App +export ArrowDown, + ArrowUp, + ArrowLeft, + ArrowRight, + DelKey, + HomeKey, + EndKey, + PageUpKey, + PageDownKey, + Enter, + SpaceBar, + Esc, + Del + +const LIVE_DEBUG = Ref(false) + +# ----------------------------- keyboard controls ---------------------------- # +abstract type KeyInput end + +struct ArrowLeft <: KeyInput end +struct ArrowRight <: KeyInput end +struct ArrowUp <: KeyInput end +struct ArrowDown <: KeyInput end +struct DelKey <: KeyInput end +struct HomeKey <: KeyInput end +struct EndKey <: KeyInput end +struct PageUpKey <: KeyInput end +struct PageDownKey <: KeyInput end +struct Enter <: KeyInput end +struct SpaceBar <: KeyInput end +struct Esc <: KeyInput end +struct Del <: KeyInput end + +KEYs = Dict{Int,KeyInput}( + 13 => Enter(), + 27 => Esc(), + 32 => SpaceBar(), + 127 => Del(), + 1000 => ArrowLeft(), + 1001 => ArrowRight(), + 1002 => ArrowUp(), + 1003 => ArrowDown(), + 1004 => DelKey(), + 1005 => HomeKey(), + 1006 => EndKey(), + 1007 => PageUpKey(), + 1008 => PageDownKey(), +) + +# ------------------------------- base widgets ------------------------------- # +include("abstract_widget.jl") +include("help.jl") +include("widgets.jl") +include("pager.jl") +include("buttons.jl") +include("menus.jl") + +# -------------------------------- containers -------------------------------- # +include("abstract_container.jl") +include("gallery.jl") +include("app.jl") + +include("keyboard_input.jl") + +end diff --git a/src/Live/menus.jl b/src/Live/menus.jl new file mode 100644 index 000000000..d5130d00f --- /dev/null +++ b/src/Live/menus.jl @@ -0,0 +1,385 @@ +# ---------------------------------------------------------------------------- # +# ABSTRACT MENU # +# ---------------------------------------------------------------------------- # +""" + AbstractMenu + +Objects of type AbstractMenu present the user with a few options +and let them select one by moving around with the up/down keys +and using Enter to select an option. +""" +abstract type AbstractMenu <: AbstractWidget end + +# --------------------------------- controls --------------------------------- # + +""" set next item to active """ +menu_activate_next(mn::AbstractMenu, ::Any) = mn.active = min(mn.active + 1, mn.n_titles) + +""" set previous item to active """ +menu_activate_prev(mn::AbstractMenu, ::Any) = mn.active = max(1, mn.active - 1) + +""" quit menu and return value""" +function menu_return_value(mn::AbstractMenu, ::Enter) + quit(mn) + return mn.active +end + +vert_menu_controls = Dict( + ArrowDown() => menu_activate_next, + ArrowUp() => menu_activate_prev, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +hor_menu_controls = Dict( + ArrowRight() => menu_activate_next, + ArrowLeft() => menu_activate_prev, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +function on_layout_change(mn::AbstractMenu, m::Measure) + mn.internals.measure = m +end + +# ---------------------------------------------------------------------------- # +# CONCRETE MENUS # +# ---------------------------------------------------------------------------- # +# -------------------------------- simple menu ------------------------------- # +""" +Simple text based menu. +The currently selected option is highlighted with a different style. +""" +@with_repr mutable struct SimpleMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + titles::Vector{String} + n_titles::Int + active_style::String + inactive_style::String + active::Int + layout::Symbol + + function SimpleMenu( + titles::Vector; + controls::Union{Nothing,AbstractDict} = nothing, + width = default_width(), + active_style::String = "white bold", + inactive_style::String = "dim", + layout::Symbol = :vertical, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + ) + controls = something( + controls, + layout == :vertical ? vert_menu_controls : hor_menu_controls, + ) + + return new( + WidgetInternals( + Measure(length(titles), width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + titles, + length(titles), + active_style, + inactive_style, + 1, + layout, + ) + end +end + +""" + active_title(mn::SimpleMenu, i::Int, width::Int) + +Return the title of the i-th item of the menu with the active style. +""" +function active_title(mn::SimpleMenu, i::Int, width::Int) + return RenderableText(mn.titles[i]; style = mn.active_style, width = width) |> string +end + +""" + inactive_title(mn::SimpleMenu, i::Int, width::Int) + +Return the title of the i-th item of the menu with the inactive style. +""" +function inactive_title(mn::SimpleMenu, i::Int, width::Int) + return RenderableText(mn.titles[i]; style = mn.inactive_style, width = width) |> string +end + +function frame(mn::SimpleMenu; kwargs...) + active_symbol = "❯" + titles = mn.titles + + # get size + m = mn.internals.measure + max_titles_width = + mn.layout == :vertical ? + min(m.w, maximum(get_width.(titles)) + textwidth(active_symbol) + 1) : m.w + + # make and stack title + titles = map( + i -> + i == mn.active ? active_title(mn, i, max_titles_width) : + inactive_title(mn, i, max_titles_width), + 1:length(titles), + ) + return if mn.layout == :vertical + vstack(titles...) + else + hstack(titles...) + end +end + +# ------------------------------- buttons menu ------------------------------- # +""" +Simple menu in which each option is a `Panel` object. +Styling reflects which option is currently selected +""" +@with_repr mutable struct ButtonsMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + titles::Vector{String} + active_style::Vector + inactive_style::Vector + active_background::Vector + inactive_background::Vector + n_titles::Int + active::Int + layout::Symbol + panel_kwargs + + function ButtonsMenu( + titles::Vector; + controls::Union{Nothing,AbstractDict} = nothing, + width::Int = console_width(), + active_color::Union{Vector,String} = "black", + active_background::Union{Vector,String} = "white", + inactive_color::Union{Vector,String} = "dim", + inactive_background::Union{Vector,String} = "default", + layout::Symbol = :vertical, + height::Union{Nothing,Int} = length(titles), + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + panel_kwargs..., + ) + controls = something( + controls, + layout == :vertical ? vert_menu_controls : hor_menu_controls, + ) + + # get parameters for each button + n = length(titles) + active_color = active_color isa String ? repeat([active_color], n) : active_color + active_background = + active_background isa String ? repeat([active_background], n) : + active_background + inactive_color = + inactive_color isa String ? repeat([inactive_color], n) : inactive_color + inactive_background = + inactive_background isa String ? repeat([inactive_background], n) : + inactive_background + @assert length(active_color) == n "Incorrect number of values for `active_color`" + @assert length(active_background) == n "Incorrect number of values for `active_background`" + @assert length(inactive_color) == n "Incorrect number of values for `inactive_color`" + @assert length(inactive_background) == n "Incorrect number of values for `inactive_background`" + + measure = if layout == :vertical + Measure(something(height, length(titles)), width) + else + hmax = layout == :vertical ? fint(height / n) : height + Measure(something(height, hmax), width) + end + + return new( + WidgetInternals(measure, nothing, on_draw, on_activated, on_deactivated, false), + controls, + titles, + active_color, + inactive_color, + active_background, + inactive_background, + length(titles), + 1, + layout, + panel_kwargs, + ) + end +end + +""" + active_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + +Return the title of the i-th item of the menu with the active style. +""" +function active_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + active_color, active_background = mn.active_style[i], mn.active_background[i] + return Panel( + "{$(active_color) on_$(active_background)}" * + mn.titles[i] * + "{/$(active_color) on_$(active_background)}"; + background = active_background, + style = "$(active_color) on_$(active_background)", + width = width, + justify = get(panel_kwargs, :justify, :center), + box = get(panel_kwargs, :box, :SQUARE), + height = height, + panel_kwargs..., + ) +end + +""" + inactive_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + +Return the title of the i-th item of the menu with the inactive style. +""" +function inactive_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + inactive_color, inactive_background = mn.inactive_style[i], mn.inactive_background[i] + return Panel( + "{$(inactive_color) on_$(inactive_background)}" * + mn.titles[i] * + "{/$(inactive_color) on_$(inactive_background)}"; + background = inactive_background, + style = inactive_color, + width = width, + justify = get(panel_kwargs, :justify, :center), + box = get(panel_kwargs, :box, :SQUARE), + height = height, + panel_kwargs..., + ) +end + +function frame(mn::ButtonsMenu; kwargs...) + m, n = mn.internals.measure, mn.n_titles + button_width = mn.layout == :vertical ? m.w : fint(m.w / n) + button_height = mn.layout == :vertical ? fint(m.h / n) : m.h + + # make and stack title + titles = map( + i -> + i == mn.active ? + active_title(mn, i, button_width, button_height; mn.panel_kwargs...) : + inactive_title(mn, i, button_width, button_height; mn.panel_kwargs...), + 1:(mn.n_titles), + ) + return if mn.layout == :vertical + vstack(titles...) + else + hstack(titles...) + end +end + +# ---------------------------------------------------------------------------- # +# MULTI SELECT # +# ---------------------------------------------------------------------------- # + +""" +Menu variant for selecting multiple options. +Color indicates current active option, ticks selected options +""" +@with_repr mutable struct MultiSelectMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + options::Vector + active_style::String + inactive_style::String + options_width::Int + selected::Vector{Int} + active::Int + n_titles::Int + selected_sym::String + notselected_sym::String +end + +""" +quit and return selection. +""" +function menu_return_value(mn::MultiSelectMenu, ::Enter) + quit(mn) + return mn.selected +end + +""" +Toggle selection status of current active option +""" +function multi_select_toggle(mn::MultiSelectMenu, ::SpaceBar) + active = mn.active + if active ∈ mn.selected + deleteat!(mn.selected, mn.selected .== active) + else + push!(mn.selected, active) + end +end + +multi_select_controls = Dict( + ArrowDown() => menu_activate_next, + ArrowUp() => menu_activate_prev, + SpaceBar() => multi_select_toggle, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +function MultiSelectMenu( + options::Vector; + controls::AbstractDict = multi_select_controls, + active_style::String = "white bold", + inactive_style::String = "dim", + width::Int = console_width(), + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + selected_sym = apply_style("✔ ", active_style) + notselected_sym = apply_style("□ ", inactive_style) + + max_titles_width = min(width, maximum(get_width.(options)) + 2) + + MultiSelectMenu( + WidgetInternals( + Measure(length(options), width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + options, + active_style, + inactive_style, + max_titles_width, + Int[], + 1, + length(options), + selected_sym, + notselected_sym, + ) +end + +function make_option(mn::MultiSelectMenu, i::Int, isactive::Bool, isselected::Bool) + sym = isselected ? mn.selected_sym : mn.notselected_sym + style = isactive ? mn.active_style : mn.inactive_style + + return RenderableText( + sym * "{$style}" * mn.options[i] * "{/$style}"; + width = mn.options_width, + ) +end + +function frame(mn::MultiSelectMenu; kwargs...) + isnothing(mn.internals.on_draw) || mn.internals.on_draw(mn) + + options = map(i -> make_option(mn, i, i == mn.active, i ∈ mn.selected), 1:(mn.n_titles)) + return vstack(options) +end diff --git a/src/Live/pager.jl b/src/Live/pager.jl new file mode 100644 index 000000000..6460dc28f --- /dev/null +++ b/src/Live/pager.jl @@ -0,0 +1,213 @@ +# ------------------------------- constructors ------------------------------- # +""" +A `Pager` is a widget for visualizing long texts a few lines at the time. +It shows a few lines of a longer text and allows users to move up and down the text +using keys such as arrow up and arrow down. +""" +@with_repr mutable struct Pager <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + text::AbstractString + content::Vector{String} + title::Union{Nothing,String} + line_numbers::Bool + tot_lines::Int + curr_line::Int + page_lines::Int +end + +# --------------------------------- controls --------------------------------- # +""" +move to the next line +""" +next_line(p::Pager, ::Union{Char,ArrowDown}) = + p.curr_line = min(p.tot_lines - p.page_lines, p.curr_line + 1) + +""" +move to the previous line +""" +prev_line(p::Pager, ::Union{Char,ArrowUp}) = p.curr_line = max(1, p.curr_line - 1) + +""" +move to the next page +""" +next_page(p::Pager, ::Union{PageDownKey,ArrowRight,Char}) = + p.curr_line = min(p.tot_lines - p.page_lines, p.curr_line + p.page_lines) + +""" +move to the previous page +""" +prev_page(p::Pager, ::Union{PageUpKey,ArrowLeft,Char}) = + p.curr_line = max(1, p.curr_line - p.page_lines) + +""" +move to first line +""" +home(p::Pager, ::HomeKey) = p.curr_line = 1 + +""" +move to the last line +""" +toend(p::Pager, ::EndKey) = p.curr_line = p.tot_lines - p.page_lines + +pager_controls = Dict( + ArrowRight() => next_page, + ']' => next_page, + ArrowLeft() => prev_page, + '[' => prev_page, + ArrowDown() => next_line, + '.' => next_line, + ArrowUp() => prev_line, + ',' => prev_line, + HomeKey() => home, + EndKey() => toend, + Esc() => quit, + 'q' => quit, +) + +""" + reshape_pager_content(content::AbstractString, line_numbers::Bool)::Vector{string} + +Turns a text into a vector of lines with the right size (and optionally line numbers) +""" +function reshape_pager_content( + content::AbstractString, + line_numbers::Bool, + width::Int, +)::Vector{String} + reshaped_content = if line_numbers == true + join( + map(iln -> "{dim}$(iln[1]) {/dim}" * iln[2], enumerate(split(content, "\n"))), + "\n", + ) + else + content + end + + reshaped_content = reshape_code_string(content, width - 6) + return split(string(RenderableText(reshaped_content; width = width - 6)), "\n") + # return split(reshaped_content, "\n") + +end + +function Pager( + text::String; + controls::AbstractDict = pager_controls, + height = 30, + width = console_width(), + title::Union{Nothing,String} = nothing, + line_numbers::Bool = false, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + content = reshape_pager_content(text, line_numbers, width) + return Pager( + WidgetInternals( + Measure(height, width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + text, + content, + title, + line_numbers, + length(content), + 1, + max(height - 5, 1), + ) +end + +function on_layout_change(p::Pager, m::Measure) + p.page_lines = max(m.h - 5, 1) + p.content = reshape_pager_content(p.text, p.line_numbers, m.w) + p.tot_lines = length(p.content) + p.curr_line = min(p.curr_line, p.tot_lines - p.page_lines) + p.internals.measure = m +end + +# ---------------------------------- frame ---------------------------------- # + +""" + make_page_content(pager::Pager, i::Int, Δi::Int)::String + +Returns the content of the page as a string +""" +function make_page_content(pager, i, Δi) + if Δi >= pager.tot_lines + return join(pager.content, "\n") + else + return join(pager.content[i:min(pager.tot_lines, i + Δi)], "\n") + end +end + +""" + make_scrollbar(pager::Pager, i::Int, Δi::Int)::String + +Generate a scrollbar display to show progress in the pager's content. +""" +function make_scrollbar(pager, i, Δi) + page_lines = pager.page_lines + scrollbar_lines = min(pager.page_lines, 6) + scrollbar_lines_half = scrollbar_lines // 2 + scrollbar = vLine(scrollbar_lines; style = "white on_white") + + p = (i) / (pager.tot_lines - Δi) # progress in the file + scrollbar_center = p * (page_lines) |> round |> Int + nspaces_above = max(0, scrollbar_center - scrollbar_lines_half) |> round |> Int + nspaces_below = max(0, page_lines - scrollbar_lines - nspaces_above) |> round |> Int + + if nspaces_above == 0 + below = + RenderableText(join(repeat([" \n"], nspaces_below + 1)); style = "on_gray23") + return scrollbar / below + elseif nspaces_below == 0 + above = + RenderableText(join(repeat([" \n"], nspaces_above + 1)); style = "on_gray23") + return above / scrollbar + else + above = RenderableText(join(repeat([" \n"], nspaces_above)); style = "on_gray23") + below = RenderableText(join(repeat([" \n"], nspaces_below)); style = "on_gray23") + return above / scrollbar / below + end +end + +function make_page(pager, i, Δi) + page_content = make_page_content(pager, i, Δi) + scrollbar = make_scrollbar(pager, i, Δi) + return page_content * scrollbar +end + +""" + frame(pager::Pager)::AbstractRenderable + +Create a Panel with, as content, the currently visualized lines in the Pager. +""" +function frame(pager::Pager; omit_panel = false)::AbstractRenderable + isnothing(pager.internals.on_draw) || pager.internals.on_draw(pager) + + i, Δi = pager.curr_line, pager.page_lines + page = make_page(pager, i, Δi) + + style = isactive(pager) ? pink : "blue dim" + + # return content + omit_panel && return " " * RenderableText(page) + return Panel( + page, + fit = false, + width = pager.internals.measure.w, + height = pager.internals.measure.h, + padding = (2, 0, 1, 0), + subtitle = "Lines: $(max(1, i)):$(min(i+Δi, pager.tot_lines)) of $(pager.tot_lines)", + subtitle_style = "bold dim", + subtitle_justify = :right, + style = style, + title = pager.title, + title_style = "bold white", + ) +end diff --git a/src/Live/widgets.jl b/src/Live/widgets.jl new file mode 100644 index 000000000..128942739 --- /dev/null +++ b/src/Live/widgets.jl @@ -0,0 +1,235 @@ +""" +Collection of small widgets +""" + +# ---------------------------------------------------------------------------- # +# TEXT WIDGET # +# ---------------------------------------------------------------------------- # + +# ------------------------------- constructors ------------------------------- # +""" +TextWidget just shows a piece of text. +""" +@with_repr mutable struct TextWidget <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + text::String + as_panel::Bool + panel_kwargs +end + +text_widget_controls = Dict('q' => quit, Esc() => quit) + +TextWidget( + text::String; + as_panel = false, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + controls = text_widget_controls, + kwargs..., +) = TextWidget( + WidgetInternals( + Measure(Measure(text).h, console_width()), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + text, + as_panel, + Dict{Symbol,Any}(kwargs), +) + +on_layout_change(t::TextWidget, m::Measure) = t.internals.measure = m + +# ----------------------------------- frame ---------------------------------- # +function frame(tw::TextWidget; kwargs...) + isnothing(tw.internals.on_draw) || tw.internals.on_draw(tw) + measure = tw.internals.measure + + style = get(tw.panel_kwargs, :style, "default") + style = isactive(tw) ? "bold white " * style : style + + panel_kwargs = copy(tw.panel_kwargs) + if :style ∈ keys(tw.panel_kwargs) + panel_kwargs[:style] = panel_kwargs[:style] * (isactive(tw) ? " bold red" : " dim") + else + panel_kwargs[:style] = isactive(tw) ? " bold red" : "dim" + end + + tw.as_panel && return Panel( + tw.text; + width = measure.w, + height = measure.h, + fit = false, + panel_kwargs..., + ) + + txt = if !isactive(tw) + reshape_text(tw.text, measure.w - 4) + else + _txt = reshape_text(tw.text, measure.w - 6) + vLine(get_height(_txt)) * _txt |> string + end + + return RenderableText(txt; width = measure.w - 4) +end + +# ---------------------------------------------------------------------------- # +# INPUT BOX # +# ---------------------------------------------------------------------------- # + +# ------------------------------- constructors ------------------------------- # +""" +InputBox collects and displays user input as text. +""" +@with_repr mutable struct InputBox <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + input_text::Union{Nothing,String} + blinker_update::Int + blinker_status::Symbol + panel_kwargs::Dict{Symbol,Any} +end + +""" +new line +""" +newline(ib::InputBox, ::Enter) = isnothing(ib.input_text) || (ib.input_text *= "\n") + +""" insert space """ +addspace(ib::InputBox, ::SpaceBar) = isnothing(ib.input_text) || (ib.input_text *= " ") + +""" delete last character """ +del(ib::InputBox, ::Del) = + isnothing(ib.input_text) || begin + textwidth(ib.input_text) > 0 && (ib.input_text = ib.input_text[1:(end - 1)]) + end + +""" add character to input """ +addchar(ib::InputBox, c::Char) = + if isnothing(ib.input_text) + ib.input_text = string(c) + else + ib.input_text *= c + end + +input_box_controls = Dict( + Enter() => newline, + SpaceBar() => addspace, + Del() => del, + Esc() => quit, + Char => addchar, +) + +function InputBox(; + controls::AbstractDict = input_box_controls, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + InputBox( + WidgetInternals( + Measure(5, console_width()), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + nothing, + 0, + :off, + kwargs, + ) +end + +on_layout_change(ib::InputBox, m::Measure) = ib.internals.measure = m + +# ----------------------------------- frame ---------------------------------- # +function frame(ib::InputBox; kwargs...) + isnothing(ib.internals.on_draw) || ib.internals.on_draw(ib) + + # create blinking symbol + currtime = Dates.value(now()) + if currtime - ib.blinker_update > 300 + ib.blinker_update = currtime + ib.blinker_status = ib.blinker_status == :on ? :off : :on + end + blinker = if isactive(ib) + ib.blinker_status == :on ? " " : "{on_white} {/on_white}" + else + "" + end + + panel_kwargs = copy(ib.panel_kwargs) + + panel_kwargs[:style] = get(ib.panel_kwargs, :style, "") * (isactive(ib) ? "" : " dim") + # get text to display + text = isnothing(ib.input_text) ? "{dim}start typing...{/dim}" : ib.input_text * blinker + measure = ib.internals.measure + return Panel(text; width = measure.w, height = measure.h, panel_kwargs...) +end + +# ---------------------------------------------------------------------------- # +# PLACEHOLDER # +# ---------------------------------------------------------------------------- # + +""" +Widget with no content to be used as a placeholder for choosing app layout. +""" +mutable struct PlaceHolderWidget <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + color::String + style::String + name::String +end + +on_layout_change(ph::PlaceHolderWidget, m::Measure) = ph.internals.measure = m + +function on_activated(ph::PlaceHolderWidget) + ph.internals.active = true + ph.style = "bold" +end +function on_deactivated(ph::PlaceHolderWidget) + ph.internals.active = false + ph.style = "dim" +end + +function PlaceHolderWidget( + h::Int, + w::Int, + name::String, + color::String; + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + internals = WidgetInternals( + Measure(h, w), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ) + + PlaceHolderWidget(internals, text_widget_controls, color, "dim", name) +end + +function frame(ph::PlaceHolderWidget; kwargs...) + isnothing(ph.internals.on_draw) || ph.internals.on_draw(ph) + m = ph.internals.measure + return PlaceHolder( + m.h, + m.w; + style = "$(ph.color) $(ph.style)", + text = "$(ph.name) ($(m.h), $(m.w)", + ) +end diff --git a/src/Term.jl b/src/Term.jl index f60f8efcd..4071e1169 100644 --- a/src/Term.jl +++ b/src/Term.jl @@ -18,6 +18,7 @@ less(term_demo) # see demo code # Example +``` julia ``` julia begin println(@green "this is green") @@ -39,11 +40,13 @@ const DEBUG_ON = Ref(false) const ACTIVE_CONSOLE_WIDTH = Ref{Union{Nothing,Int}}(nothing) const ACTIVE_CONSOLE_HEIGHT = Ref{Union{Nothing,Int}}(nothing) +const DEFAULT_CONSOLE_WIDTH = Ref{Int}(88) +const DEFAULT_STACKTRACE_WIDTH = Ref{Int}(140) default_width(io = stdout)::Int = - min(88, something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) + min(DEFAULT_CONSOLE_WIDTH[], something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) default_stacktrace_width(io = stderr)::Int = - min(140, something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) + min(DEFAULT_STACKTRACE_WIDTH[], something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) const DEFAULT_ASPECT_RATIO = Ref(4 / 3) # 4:3 - 16:9 - 21:9 @@ -81,8 +84,6 @@ include("link.jl") include("panels.jl") include("errors.jl") include("tprint.jl") -include("progress.jl") -include("logs.jl") include("trees.jl") include("dendograms.jl") include("tables.jl") @@ -90,7 +91,12 @@ include("markdown.jl") include("repr.jl") include("compositors.jl") include("grid.jl") + +# interactive +include("Live/live.jl") include("introspection.jl") +include("progress.jl") +include("logs.jl") include("prompt.jl") include("annotations.jl") @@ -106,6 +112,7 @@ export @with_repr, termshow, @showme export Compositor export grid export inspect +export Pager # ----------------------------------- base ----------------------------------- # using .Measures @@ -165,14 +172,10 @@ using .Logs: install_term_logger, uninstall_term_logger, TermLogger using .Tprint: tprint, tprintln -using .Progress: ProgressBar, ProgressJob, with, @track - using .Trees: Tree using .Dendograms: Dendogram -using .Introspection: inspect, typestree, expressiontree, inspect - using .Tables: Table using .Compositors: Compositor @@ -183,7 +186,16 @@ using .Repr: @with_repr, termshow, install_term_repr, @showme using .Grid +# -------------------------------- interactive ------------------------------- # +using .LiveWidgets + +# ----------------------------- using interactive ---------------------------- # +using .Progress: ProgressBar, ProgressJob, with, @track + +using .Introspection: inspect, typestree, expressiontree, inspect + using .Prompts include("__precompilation.jl") + end diff --git a/src/_compositor.jl b/src/_compositor.jl index 620376f2e..fb29cfdcf 100644 --- a/src/_compositor.jl +++ b/src/_compositor.jl @@ -48,9 +48,14 @@ function get_elements_and_sizes(ex::Expr; placeholder_size = nothing) min_h = min_w = typemax(Int) for e in elements e isa Symbol && continue - min_h = min(min_h, e.args[2]) - min_w = min(min_w, e.args[3]) + + h, w = e.args[2], e.args[3] + h = h isa Int ? h : fint(console_height() * h) + w = w isa Int ? w : fint(console_width() * w) + min_h = min(min_h, h) + min_w = min(min_w, w) end + # fallback size h, w = something(placeholder_size, default_size()) min_h == typemax(Int) && (min_h = h) @@ -89,12 +94,16 @@ function clean_layout_expr(ex::Expr) return ex end -compositor_placeholder(s, h, w, c) = PlaceHolder( - h, - w; - style = c, - text = "{bold underline bright_blue}$s{/bold underline bright_blue} {white}($h × $w){/white}", -) +compositor_placeholder(s, h, w, c) = begin + h = h isa Int ? h : fint(console_height() * h) + w = w isa Int ? w : fint(console_width() * w) + PlaceHolder( + h, + w; + style = c, + text = "{bold underline bright_blue}$s{/bold underline bright_blue} {white}($h × $w){/white}", + ) +end """ extract_renderable_from_kwargs(s, h, w; kwargs...) diff --git a/src/_errors.jl b/src/_errors.jl index a6990493e..8e2c8bbd6 100644 --- a/src/_errors.jl +++ b/src/_errors.jl @@ -60,7 +60,7 @@ function should_skip(frame::StackFrame, modul) mod = something(modul, frame) f = get_frame_file(frame) - bad = mod ∈ ["Base", "Main", nothing, "VSCodeServer", "REPL"] + bad = mod ∈ ["Base", nothing, "VSCodeServer", "REPL"] bad = bad || mod ∈ STACKTRACE_HIDDEN_MODULES[] return bad || ( diff --git a/src/_inspect.jl b/src/_inspect.jl index fb7bf4b73..d6dbcd466 100644 --- a/src/_inspect.jl +++ b/src/_inspect.jl @@ -1,4 +1,6 @@ import Base.Docs: doc as getdocs +using Base.Docs: meta, Binding +import Markdown """ get_docstring(obj) @@ -17,37 +19,35 @@ function get_docstring(obj) end """ - style_methods(methods::Union{Vector{Base.Method}, Base.MethodList}, tohighlight::AbstractString) + get_methods_with_docstrings(obj::Union{Union, DataType, Function}) -Create a `Renderable` with styled `Method` information for `inspect(::DataType)` +Get the docstring for each method for an object (function/datatype). """ -function style_methods( - methods::Union{Vector{Base.Method},Base.MethodList}, - tohighlight::AbstractString; - constructor::Bool = false, -) - txt_col = TERM_THEME[].text - fn_col = TERM_THEME[].func - highlight_col = TERM_THEME[].inspect_highlight - accent_col = TERM_THEME[].inspect_accent - mets = [] - prevmod = "" - for (i, m) in enumerate(methods) - code = " - " * split(string(m), " in ")[1] |> highlight_syntax - code = replace(code, string(m.name) => "{$fn_col}$(m.name){/$fn_col}") - - info = - string(m.module) != prevmod ? - RenderableText( - "{bright_blue} ────── Methods in {$accent_col underline bold}$(m.module){/$accent_col underline bold} for {$accent_col}$tohighlight{/$accent_col} ──────{/bright_blue}", - ) : nothing - prevmod = string(m.module) - - dest = RenderableText( - "\e[0m{dim default italic} → $(m.file):$(m.line){/dim default italic}", - ) - content = isnothing(info) ? code / dest / "" : info / code / dest / "" - push!(mets, content) +function get_methods_with_docstrings( + obj::Union{Union,DataType,Function}, +)::Tuple{Vector,Vector} + # get the parent module and the methods list for the object + mod = parentmodule(obj) + mm = methods(obj) + + # get the module's multidoc + binding = Binding(mod, Symbol(obj)) + dict = meta(mod) + multidoc = dict[binding] + + # for each module, attempt to get the docstring as markdown + docstrings = [] + for m in mm + # cleanup signature + sig = length(m.sig.types) == 1 ? Tuple{} : Tuple{m.sig.types[2:end]...} + + haskey(multidoc.docs, sig) || begin + push!(docstrings, nothing) + continue + end + docs = multidoc.docs[sig].text[1] |> Markdown.parse + push!(docstrings, docs) end - return mets + + return mm, docstrings end diff --git a/src/_repr.jl b/src/_repr.jl index 434e3f47e..925719dc6 100644 --- a/src/_repr.jl +++ b/src/_repr.jl @@ -2,8 +2,9 @@ import Term: default_width import OrderedCollections: OrderedDict function repr_get_obj_fields_display(obj) - field_names = fieldnames(typeof(obj)) theme = TERM_THEME[] + + field_names = fieldnames(typeof(obj)) length(field_names) == 0 && return RenderableText( "$obj{$(theme.repr_type)}::$(typeof(obj)){/$(theme.repr_type)}", ) @@ -24,10 +25,13 @@ function repr_get_obj_fields_display(obj) push!(values, RenderableText.(val; style = theme.repr_values)) end - line = vLine(length(fields); style = theme.repr_line) - space = Spacer(length(fields), 1) - - return rvstack(fields...) * line * space * lvstack(values...) + return Table( + OrderedDict(:field => fields, :value => values); + hpad = 0, + box = :NONE, + show_header = false, + compact = true, + ) end """ @@ -46,6 +50,9 @@ typename(typedef::Expr) = error("Could not parse type-head from: $typedef") end +""" +Create a Panel showing repr content using the current theme's style info. +""" repr_panel( obj, content, @@ -79,7 +86,14 @@ function vec_elems2renderables(v::Union{Tuple,AbstractVector}, N, max_w; ellipsi end function matrix2content(mtx::AbstractMatrix; max_w = 12, max_items = 50, max_D = 10) - max_D = console_width() < 150 ? 5 : max_D + max_D = if console_width() > 150 + max_D + elseif console_width() < 80 + 3 + else + 5 + end + N = min(max_items, size(mtx, 1)) D = min(max_D, size(mtx, 2)) @@ -98,7 +112,7 @@ function matrix2content(mtx::AbstractMatrix; max_w = 12, max_items = 50, max_D = headers = "(" .* string.(1:length(columns)) .* ")" |> collect end - # add a column of numbers + # add a column of row numbers if size(mtx, 1) <= max_items pushfirst!(columns, "{dim}(" .* string.(1:length(columns[1])) .* "){/dim}") else diff --git a/src/boxes.jl b/src/boxes.jl index e10cd3679..029bfe6f7 100644 --- a/src/boxes.jl +++ b/src/boxes.jl @@ -181,7 +181,7 @@ function get_title_row( # compose title line boxline = getfield(box, row) - open, close, space = "{" * style * "}", "{/" * style * "}", " " + open, close, space = "{" * style * "}", "{/" * style * "}\e[0m", " " topen, tclose = "\e[0m", open if !isnothing(title_style) @@ -222,10 +222,10 @@ function get_title_row( title * get_rrow(box, rw - tr, row) * close - return Segment("\e[0m" * line * "\e[0m") + return Segment(line) end end - return Segment("\e[0m" * line * "\e[0m") + return Segment(line) end """ diff --git a/src/compositors.jl b/src/compositors.jl index 8aafccb9d..73fd921cd 100644 --- a/src/compositors.jl +++ b/src/compositors.jl @@ -7,7 +7,8 @@ import ..Layout: PlaceHolder import ..Measures: width, height, default_size import ..Renderables: AbstractRenderable, RenderableText, Renderable import ..Repr: @with_repr, termshow -import Term: highlight, update! +import ..Consoles: console_height, console_width +import Term: highlight, update!, fint export Compositor @@ -33,6 +34,20 @@ each `LayoutElement` if there is one, the placeholder otherwise. w::Int renderable::Union{Nothing,String,AbstractRenderable} placeholder::PlaceHolder + + function LayoutElement( + id::Symbol, + h::Number, + w::Number, + renderable::Union{Nothing,String,AbstractRenderable}, + placeholder::PlaceHolder; + max_w::Int = console_width(), + max_h::Int = console_height(), + ) + h = h isa Int ? h : fint(max_h * h) + w = w isa Int ? w : fint(max_w * w) + return new(id, h, w, renderable, placeholder) + end end Base.size(e::LayoutElement) = (e.h, e.w) @@ -62,6 +77,8 @@ function Compositor( vpad::Int = 0, placeholder_size = nothing, check::Bool = true, + max_w::Int = console_width(), + max_h::Int = console_height(), kwargs..., ) elements = get_elements_and_sizes(layout; placeholder_size = placeholder_size) @@ -91,7 +108,9 @@ function Compositor( e.args[2], # height e.args[3], # width renderables[n], - placeholders[n], + placeholders[n]; + max_w = max_w, + max_h = max_h, ) for (n, e) in zip(names, elements) ) @@ -134,9 +153,14 @@ function update!( return end - # check that the shapes match + # if content is too small, pad it elem = compositor.elements[id] - if elem.w != width(content) || elem.h != height(content) + height(content) < elem.h && + (content = vertical_pad(content; height = elem.h, method = :top)) + width(content) < elem.w && (content = pad(content; width = elem.w, method = :right)) + + # check that the shapes match + if elem.w > width(content) || elem.h > height(content) content_shape = "{red}$(height(content)) × $(width(content)){/red}" target_shape = "{bright_blue}$(elem.h) × $(elem.w){/bright_blue}" @warn "Shape mismatch while updating compositor element {yellow}`$id`{/yellow}.\nGot $content_shape, expected $target_shape" @@ -164,7 +188,7 @@ Render a compositor's current layout. Get a renderable from each `LayoutElement` in the compositor and evaluate the layout expression interpolating the renderables. """ -function render(compositor::Compositor; show_placeholders = false) +function render(compositor::Compositor; show_placeholders = false)::AbstractRenderable # evaluate compositor elements = getfield.(values(compositor.elements), :id) renderables = getfield.(values(compositor.elements), :renderable) diff --git a/src/console.jl b/src/console.jl index 776916a84..a13f9be39 100644 --- a/src/console.jl +++ b/src/console.jl @@ -126,19 +126,22 @@ Get the current console width. """ console_width(io::IO = stdout) = something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2]) -struct Console +mutable struct Console height width end Console(width) = Console(console_height(), width) +Console() = Console(console_height(), console_width()) +Base.displaysize(c::Console) = (c.height, c.width) function enable(console::Console) ACTIVE_CONSOLE_WIDTH[] = console.width - nothing + console end -function disable(::Console) +function disable(console::Console) ACTIVE_CONSOLE_WIDTH[] = nothing + console end end diff --git a/src/errors.jl b/src/errors.jl index 00bdd0be6..e7a220dd5 100644 --- a/src/errors.jl +++ b/src/errors.jl @@ -41,6 +41,8 @@ import ..Measures: height export install_term_stacktrace +const STACKTRACE_PRINTED_ERROR_MSG = Ref(false) + """ Stores information useful for creating the layout of a stack trace visualization. @@ -140,7 +142,8 @@ function install_term_stacktrace(; end # print message panel if VSCode is not handling that through a second call to this fn - (hasfield(typeof(io), :io) && isa(io.io, Base.TTY)) && begin + + if STACKTRACE_PRINTED_ERROR_MSG[] == false msg = highlight(sprint(Base.showerror, er)) |> apply_style err_panel = Panel( RenderableText( @@ -155,6 +158,9 @@ function install_term_stacktrace(; fit = false, ) print(io, err_panel) + STACKTRACE_PRINTED_ERROR_MSG[] = true + else + STACKTRACE_PRINTED_ERROR_MSG[] = false end catch cought_err # catch when something goes wrong during error handling in Term diff --git a/src/highlight.jl b/src/highlight.jl index b9599926b..bb24f771e 100644 --- a/src/highlight.jl +++ b/src/highlight.jl @@ -8,7 +8,7 @@ using Highlights.Format highlight_regexes = OrderedDict( :number => (r"(?(? - (r"(?(?(?![\:\<])[\+\-\*\%\^\&\|\!\=\>\<\~])"), + (r"(?(?(?![\:\<])[\+\-\*\%\^\&\|\!\=\>\<\~\[\]])"), :string => (r"(?[\'\"][\w\n]*[\'\"])",), :code => (r"(?([\`]{3}|[\`]{1})(\n|.)*?([\`]{3}|[\`]{1}))",), :expression => (r"(?\:\(+.+[\)])",), @@ -143,3 +143,18 @@ function load_code_and_highlight(path::AbstractString, lineno::Int; δ::Int = 3) return join(cleaned_lines, "\n") end + +""" + load_code_and_highlight(path::AbstractString)::String + +Load and highlight the syntax of an entire file +""" +function load_code_and_highlight(path::AbstractString)::String + lines = readlines(path) + code = [highlight_syntax(ln; style = true) for ln in lines] + + # clean + clean(line) = replace(line, " {/ }" => "") + codelines = clean.(code) + return join(codelines, "\n") +end diff --git a/src/introspection.jl b/src/introspection.jl index 49d10a157..85bbf7e43 100644 --- a/src/introspection.jl +++ b/src/introspection.jl @@ -2,7 +2,7 @@ module Introspection using InteractiveUtils import InteractiveUtils: supertypes as getsupertypes - +import OrderedCollections: OrderedDict import MyterialColors: pink, pink_light, orange, grey_dark, light_green import Term: @@ -15,15 +15,25 @@ import Term: expr2string, default_width, TERM_THEME, - highlight_syntax + highlight_syntax, + load_code_and_highlight, + str_trunc, + reshape_text import ..Renderables: RenderableText import ..Panels: Panel import ..Dendograms: Dendogram import ..Trees: Tree -import ..Layout: hLine +import ..Layout: hLine, vLine, Spacer, rvstack, lvstack import ..Tprint: tprintln import ..Repr: termshow +using ..LiveWidgets +import ..LiveWidgets: ArrowDown, ArrowUp, KeyInput +import ..TermMarkdown: parse_md +import ..Consoles: console_width, console_height +import ..Style: apply_style +import ..Compositors: Compositor +import ..Links: Link include("_inspect.jl") @@ -100,6 +110,39 @@ end # INTROSPECT DATATYPES # # ---------------------------------------------------------------------------- # +function style_methods( + methods::Union{Vector{Base.Method},Base.MethodList}, + docstrings::Vector, + width::Int, +) + mets = [] + fn_col = TERM_THEME[].func + panel_col = TERM_THEME[].text_accent + col = TERM_THEME[].inspect_highlight + + for (i, (m, docs)) in enumerate(zip(methods, docstrings)) + # method code + code = split(string(m), " in ")[1] |> highlight_syntax + code = reshape_text(apply_style(code), width; ignore_markup = true) + + # get docstring + docs = if !isnothing(docs) + docs = parse_md(something(docs, ""); width = width) + else + docs = "{green}No docstring found{/green}" + end + docs = hLine(width, "DocString"; style = "green") / docs / "" + + # method source + modul = "{default}Source: {bold $col}" * string(m.module) * "{/bold $col}{/default}" + source = "{dim}$(m.file):$(m.line){/dim}" + + out = code / "" / docs + push!(mets, out / hLine(width; style = "dim") / modul / source) + end + return mets +end + """ inspect(T::DataType; documentation::Bool=false, constructors::Bool=true, methods::Bool=true, supertypes::Bool=true) @@ -110,48 +153,89 @@ Flags can be used to choose the level of detail in the information presented: - methods: show methods using `T` in their signature - supertypes: show methods using `T`'s supertypes in their signature """ -function inspect( - T::Union{Union,DataType}; - documentation::Bool = true, - constructors::Bool = true, - methods::Bool = false, - supertypes::Bool = false, -) +function inspect(T::Union{Union,DataType};) + # get app size + layout = :(A(4, 1.0) / B(30, 1.0)) + comp = Compositor(layout) + widget_width = comp.elements[:B].w - 6 + + # get fields theme = TERM_THEME[] - hLine("inspecting: $T", style = theme.text_accent) |> print + field_names = apply_style.(string.(fieldnames(T)), theme.repr_accent) + field_types = apply_style.(map(f -> "::" * string(f), T.types), theme.repr_type) + + line = vLine(length(field_names); style = theme.repr_name) + space = Spacer(length(field_names), 1) + fields = rvstack(field_names...) * space * lvstack(string.(field_types)...) + type_name = apply_style(string(T), theme.repr_name * " bold") + + # get each method as a Pager + type_methods = style_methods(get_methods_with_docstrings(T)..., widget_width - 12) + methods_pagers = + map( + m -> Pager( + string(m[2]); + title = "Method $(m[1]) of $(length(type_methods))", + width = widget_width, + page_lines = comp.elements[:B].h - 8, + ), + enumerate(type_methods), + ) |> collect + + # create app + menu = ButtonsMenu( + ["Info", "Methods"]; + width = comp.elements[:A].w, + height = comp.elements[:A].h - 1, + layout = :horizontal, + ) - documentation || termshow(T; showdocs = false) - documentation && begin - termshow(T) - end - print("\n"^3) - - # types hierarchy - "{$(theme.text_accent)}○ Types hierarchy:" |> tprintln - " " * Tree(T) |> print - - # constructors - constructors && begin - "\n{$(theme.text_accent)}○ {$(theme.inspect_accent)}$T{/$(theme.inspect_accent)} constructors:" |> - tprintln - t_name = split(string(T), '.')[end] - print.(style_methods(Base.methods(T), t_name; constructor = true)) - end + # define widgets that go inside the top level Gallery + gallery_widgets = [ + Pager( # first widget is a pager with struct info + string( + Panel( + type_name / (" " * line * fields); + fit = false, + width = widget_width - 10, + justify = :center, + title = "Fields", + title_style = "bright_blue bold", + style = "bright_blue dim", + ) / hLine(widget_width - 10; style = "dim") / "" / Tree(T), + ); + width = comp.elements[:B].w - 1, + page_lines = comp.elements[:B].h - 7, + ), + Gallery( # inner gallery shows each method + methods_pagers; + width = comp.elements[:B].w - 1, + height = comp.elements[:B].h - 2, + show_panel = false, + ), + ] + + # make the app out of a menu and the top level gallery + widgets = OrderedDict( + :A => menu, + :B => Gallery( + gallery_widgets; + controls = Dict(), + width = comp.elements[:B].w, + height = comp.elements[:B].h - 1, + show_panel = false, + ), + ) - # methods with T and supertypes - methods && begin - for dt in getsupertypes(T)[1:(end - 1)] - _methods = methodswith(dt) - length(_methods) == 0 && continue - dt_name = split(string(dt), '.')[end] - - "\n{$(theme.text_accent)}○ Methods for {$(theme.inspect_accent)}$dt{/$(theme.inspect_accent)}:" |> - tprintln - print.(style_methods(_methods, dt_name)) - supertypes || break - end + transition_rules = Dict(ArrowDown() => Dict(:A => :B), ArrowUp() => Dict(:B => :A)) + + function cb(app) + app.widgets[:B].active = app.widgets[:A].active end - nothing + + app = App(layout, widgets, transition_rules; on_draw = cb) + play(app; transient = false) + return nothing end function inspect(F::Function; documentation::Bool = true) diff --git a/src/layout.jl b/src/layout.jl index a71235841..aea92257d 100644 --- a/src/layout.jl +++ b/src/layout.jl @@ -122,8 +122,6 @@ function pad(text::AbstractString, left::Int = 0, right::Int = 0; bg = nothing) end """ ---- - pad(s::Segment, left::Int = 0, right::Int = 0; kwargs...) Pad a segment. @@ -240,6 +238,8 @@ function vertical_pad(text::AbstractString, target_height::Int, method::Symbol) end end +# vertical_pad(text::AbstractString; height::Int, method::Symbol=:center) = vertical_pad(text, height, method) + """ vertical_pad(text::AbstractString, above::Int = 0, below::Int = 0) @@ -644,7 +644,12 @@ mutable struct vLine <: AbstractLayoutElement end """ - vLine(height::Number, style::Union{String, Nothing}; box::Symbol=:ROUNDED) + vLine( + height::Int; + style::String = TERM_THEME[].line, + box::Symbol = TERM_THEME[].box, + char::Union{Char,Nothing} = nothing, + ) Create a `vLine` given a height and, optionally, style information. """ @@ -707,21 +712,23 @@ function hLine( pad_txt::Bool = true, ) box = BOXES[box] - text = apply_style(text) * "\e[0m" + text = apply_style(text) * "{$style}" tl, tr = get_lr_widths(textlen(text)) lw, rw = get_lr_widths(width) _pad = pad_txt ? " " : get_lrow(box, 1, :top; with_left = false) line = + "{$style}" * get_lrow(box, lw - tl, :top; with_left = false) * _pad * text * _pad * "{$style}" * get_rrow(box, rw - tr, :top; with_right = false) * + "{/$style}{/$style}" * "\e[0m" - return hLine([Segment(line, style)], Measure(1, width)) + return hLine([Segment(line)], Measure(1, width)) end """ @@ -835,7 +842,7 @@ function PlaceHolder( ltrim_str(original, _w - _l) * "{default bold white}" * text * - "{/default bold white}" * + "{/default bold white}{$style}" * rtrim_str(original, _w + _l), ) end diff --git a/src/logs.jl b/src/logs.jl index 1ec43e716..4292711e5 100644 --- a/src/logs.jl +++ b/src/logs.jl @@ -15,7 +15,9 @@ import Term: rint, highlight, TERM_THEME, - str_trunc + str_trunc, + ltrim_str, + default_width import ..Consoles: console_width, console_height, change_scroll_region, move_to_line import ..Renderables: AbstractRenderable, RenderableText @@ -37,7 +39,7 @@ import ..Progress: SeparatorColumn, PercentageColumn import ..Measures: width, height -import ..Layout: hstack, rvstack, lvstack, vertical_pad, pad +import ..Layout: hstack, rvstack, lvstack, vertical_pad, pad, vLine export TermLogger, install_term_logger @@ -204,6 +206,7 @@ function Logging.handle_message( fname = ".{underline}$(frame.func){/underline}" end end + fname = split(fname, ".")[end] # prepare styles color = if lvl == Logging.Info @@ -225,37 +228,22 @@ function Logging.handle_message( msg = string(msg) msg = length(msg) > 1500 ? ltrim_str(msg, 1500 - 3) * "..." : msg - # prepare the first line of information + # prepare the first line: function name and log message fn_color = logger.theme.func firstline = "{$color underline bold}@$(string(lvl)){/$color underline bold} {$fn_color }($(_mod)$fname):{/$fn_color }" # print first line - msg_lines = split(msg, "\n") - length(msg_lines) > 0 && ( - firstline *= - " " * RenderableText( - reshape_text(msg_lines[1], console_width() - textlen(firstline) - 1); - style = logmsg_color, - ) + msg = RenderableText( + msg; + width = console_width() - textlen(firstline) - 1, + style = logmsg_color, ) - tprint(firstline; highlight = false) - - # for multi-lines message, print each line separately. - _vert = " $vert " - vert_width = textlen(_vert) - for n in 2:length(msg_lines) - # make sure the text fits in the given space - txt = RenderableText( - reshape_text(msg_lines[n], console_width() - vert_width - 1); - style = logmsg_color, - ) - v = join(repeat([_vert], height(txt)), "\n") - tprint(v * txt; highlight = false) - end + vline = " " * vLine(msg.measure.h; style = outline_markup) + tprint((firstline / vline) * " " * msg; highlight = false) # --------------------------------- contents --------------------------------- # # if no kwargs we can just quit - if length(kwargs) == 0 || length(msg_lines) == 0 + if length(kwargs) == 0 print_closing_line(color) return nothing end @@ -265,36 +253,35 @@ function Logging.handle_message( Optionally trim these strings to ensure formatting is fine. """ - # function to reshape all content appropriately - w = min(120, (Int ∘ round)((console_width() - 6) / 5) - 1) # six to allow space for vert and = - fmt_str(x, style; f = 1) = RenderableText(string(x); width = f * w - 1, style = style) - fmt_str(::Function, style; f = 1) = RenderableText("Function"; style = style) + # Create display of type,k->v for each kwarg + _types = map(t -> t isa Function ? Function : typeof(t), (collect(values(kwargs)))) + types_w = min(console_width() / 5, maximum(width.(string.(_types)))) |> round |> Int - # get types, keys and values as RenderableText with style - ks = map(k -> fmt_str(k, logger.theme.text_accent), keys(kwargs)) + _keys = map(k -> string(k), keys(kwargs)) + keys_w = min(console_width() / 5, maximum(width.(_keys))) |> round |> Int - _types = map(t -> t isa Function ? Function : typeof(t), (collect(values(kwargs)))) - _types = map(t -> fmt_str("$t::", "dim " * logger.theme.type), _types) + _vals = map(v -> highlight(string(v)), collect(values(kwargs))) + vals_w = min(console_width() / 5 * 3 - 7, maximum(width.(_vals)) - 7) |> round |> Int - vals = map(v -> style_log_msg_kw_value(logger, v), collect(values(kwargs))) - vals_style = [x[2] for x in vals] - vv = first.(vals) - vals = map(i -> fmt_str(vv[i], vals_style[i]; f = 3), 1:length(vv)) + # function to format content, style and shape + fmt_str(x, style::String, w::Int) = RenderableText(string(x); width = w, style = style) + fmt_str(::Function, style::String, w::Int) = + RenderableText("Function"; style = style, width = w) - # get the ma width of each piece of content - type_w = min(maximum(width.(_types)), w) - keys_w = min(maximum(width.(ks)), w) - vals_w = min(maximum(width.(vals)), 2w) + # get types, keys and values as RenderableText with style + ks = fmt_str.(_keys, logger.theme.text_accent, keys_w) + ts = fmt_str.(_types, "dim " * logger.theme.type, types_w) + vs = fmt_str.(_vals, "", vals_w) # print all kwargs eq = "{$(logger.theme.operator)}={/$(logger.theme.operator)}" tprintln(" $vert"; highlight = false) - for (t, k, v) in zip(_types, ks, vals, _types) + for (t, k, v) in zip(ts, ks, vs) # get the height of the tallest piece of content on this line h = maximum(height.([k, v, t])) # make sure all renderables have the same height and each columns' renderable has the right width - t = vertical_pad(pad(t; width = type_w, method = :left); height = h, method = :top) + t = vertical_pad(pad(t; width = types_w, method = :left); height = h, method = :top) k = vertical_pad(pad(k; width = keys_w, method = :left); height = h, method = :top) v = vertical_pad(pad(v; width = vals_w, method = :right); height = h, method = :top) diff --git a/src/markdown.jl b/src/markdown.jl index af0b3a2ce..b41a6d070 100644 --- a/src/markdown.jl +++ b/src/markdown.jl @@ -8,7 +8,6 @@ import UnicodeFun: to_latex import Term: reshape_text, highlight_syntax, - fillin, escape_brackets, default_width, TERM_THEME, diff --git a/src/measures.jl b/src/measures.jl index 4cc8c6550..da7660f99 100644 --- a/src/measures.jl +++ b/src/measures.jl @@ -1,7 +1,7 @@ module Measures import Term: rint, remove_ansi, remove_markup, default_width, DEFAULT_ASPECT_RATIO, textlen - +import Base: == export Measure """ @@ -14,6 +14,7 @@ mutable struct Measure w::Int end +Base.string(M::Measure) = "(h: $(M.h), w: $(M.w))" Base.show(io::IO, M::Measure) = print(io, "Measure (h: $(M.h), w: $(M.w))") """ @@ -35,12 +36,15 @@ function Measure(str::AbstractString) end Measure(::Nothing) = Measure(0, 0) +Measure() = Measure(0, 0) """ The sum of measures returns a measure with the highest value along each dimension. """ Base.:+(m1::Measure, m2::Measure)::Measure = Measure(m1.h + m2.h, max(m1.w, m2.w)) +==(m1::Measure, m2::Measure)::Bool = m1.h == m2.h && m1.w == m2.w + """ width diff --git a/src/panels.jl b/src/panels.jl index d57bb1114..e33072dc9 100644 --- a/src/panels.jl +++ b/src/panels.jl @@ -1,14 +1,7 @@ module Panels import Term: - join_lines, - fillin, - ltrim_str, - default_width, - remove_ansi, - get_bg_color, - textlen, - TERM_THEME + join_lines, ltrim_str, default_width, remove_ansi, get_bg_color, textlen, TERM_THEME import ..Renderables: AbstractRenderable, RenderablesUnion, Renderable, RenderableText import ..Layout: pad, vstack, Padding, lvstack @@ -56,6 +49,11 @@ mutable struct Panel <: AbstractPanel segments::Vector measure::Measure + """ + Panel(x1, x2; kwargs...) + + Catch construction with exactly two items passed + """ function Panel(x1, x2; kwargs...) # this is necessary to handle the special case in which 2 objs are passed # but they are not segments/measure @@ -70,7 +68,6 @@ end Base.size(p::Panel) = size(p.measure) """ ---- Panel(; fit::Bool = false, height::Int = 2, @@ -131,7 +128,6 @@ function Panel(; end """ ---- Panel( content::Union{AbstractString,AbstractRenderable}; fit::Bool = false, @@ -199,7 +195,6 @@ content_as_renderable( RenderableText(content, width = width - Δw, background = background, justify = justify) """ ---- Panel( content::Union{AbstractString,AbstractRenderable}, @@ -254,7 +249,6 @@ function Panel( end """ ---- Panel( content::Union{AbstractString,AbstractRenderable}, ::Val{false}, @@ -427,7 +421,7 @@ function render( ) # get left/right vertical lines - σ(s) = apply_style("\e[0m{" * style * "}" * s * "{/" * style * "}") + σ(s) = apply_style("{" * style * "}" * s * "{/" * style * "}") left, right = σ(box.mid.left), σ(box.mid.right) # get an empty padding line diff --git a/src/renderables.jl b/src/renderables.jl index 47085298d..0c495b486 100644 --- a/src/renderables.jl +++ b/src/renderables.jl @@ -4,7 +4,6 @@ import Term: split_lines, reshape_text, ltrim_str, - fillin, join_lines, unescape_brackets_with_space, DEBUG_ON, @@ -14,6 +13,8 @@ import Term: get_bg_color, textlen +import Term + import Term: highlight as highlighter import ..Consoles: console_width import ..Measures: Measure diff --git a/src/repr.jl b/src/repr.jl index 3695e650c..5b5168df2 100644 --- a/src/repr.jl +++ b/src/repr.jl @@ -17,7 +17,7 @@ import Term: remove_markup, reshape_code_string -import ..Layout: vLine, rvstack, lvstack, Spacer, vstack, cvstack, hLine, pad +import ..Layout: vLine, rvstack, lvstack, Spacer, vstack, cvstack, hLine, pad, hstack import ..Renderables: RenderableText, info, AbstractRenderable import ..Consoles: console_width import ..Panels: Panel, TextBox @@ -25,6 +25,7 @@ import ..Style: apply_style import ..Tprint: tprint, tprintln import ..Tables: Table import ..TermMarkdown: parse_md +import ..Measures: height export @with_repr, termshow, install_term_repr, @showme @@ -47,7 +48,7 @@ function termshow end --- termshow(io::IO, obj) -Generic method for any object not caught my dedicated methods. +Generic method for any object not caught by dedicated methods. Creates a `Panel` with the object's fields and contents. """ termshow(io::IO, obj) = print( @@ -111,7 +112,7 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) theme = TERM_THEME[] # prepare text renderables - k = RenderableText.(short_string.(keys(obj)); style = theme.repr_accent * " bold") + _keys = RenderableText.(short_string.(keys(obj)); style = theme.repr_accent * " bold") ktypes = RenderableText.( map(k -> "{{" * short_string(typeof(k)) * "}}", collect(keys(obj))); @@ -124,32 +125,18 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) style = theme.repr_type * " dim", ) - # trim if too many - arrows = if length(k) > 10 - k, ktypes, vals, vtypes = k[1:10], ktypes[1:10], vals[1:10], vtypes[1:10] - - push!(k, RenderableText("⋮"; style = theme.repr_accent)) - push!(ktypes, RenderableText("⋮"; style = theme.repr_type * " dim")) - push!(vals, RenderableText("⋮"; style = theme.repr_values)) - push!(vtypes, RenderableText("⋮"; style = theme.repr_type * " dim")) - - vstack(RenderableText.(fill("=>", length(k) - 1); style = TERM_THEME[].operator)...) - else - vstack(RenderableText.(fill("=>", length(k)); style = TERM_THEME[].operator)...) - end - - # prepare other renderables - space = Spacer(length(k), 1) - line = vLine(length(k); style = "dim $(TERM_THEME[].emphasis)") - - _keys_renderables = cvstack(ktypes...) * line * space * cvstack(k...) - _values_renderables = cvstack(vals...) * space * line * cvstack(vtypes...) + content = OrderedDict( + :type => ktypes, + :key => _keys, + :arrow => RenderableText.(fill("=>", length(_keys)); style = theme.operator), + :value => vals, + :vtype => vtypes, + ) - m = length(keys(obj)) return print( io, Panel( - _keys_renderables * space * arrows * space * _values_renderables; + Table(content; show_header = false, box = :NONE, hpad = 0, compact = true); fit = true, title = escape_brackets(string(typeof(obj))), title_justify = :left, @@ -158,7 +145,6 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) style = theme.repr_panel, title_style = theme.repr_name, padding = (2, 2, 1, 1), - subtitle = "{$(TERM_THEME[].text_accent)}$m{/$(TERM_THEME[].text_accent)}{default} $(plural("item", m)){/default}", subtitle_justify = :right, ), ) diff --git a/src/segments.jl b/src/segments.jl index 357e3e3ba..4ebd71385 100644 --- a/src/segments.jl +++ b/src/segments.jl @@ -52,21 +52,6 @@ Base.show(io::IO, ::MIME"text/plain", seg::Segment) = # LAYOUT # # ---------------------------------------------------------------------------- # -""" - Term.fillin(segments::Vector{Segment})::Vector{Segment} - -Ensure that for each segment the text has the same width -""" -function Term.fillin(segments::Vector{Segment})::Vector{Segment} - w = maximum(width.(segments)) - - filled::Vector{Segment} = [] - for seg in segments - push!(filled, Segment(seg.text * " "^(w - seg.measure.w))) - end - return filled -end - # -------------------------------- concatenate ------------------------------- # """ concatenate strings and segments diff --git a/src/theme.jl b/src/theme.jl index fb9d4a930..de3b234f0 100644 --- a/src/theme.jl +++ b/src/theme.jl @@ -42,11 +42,15 @@ style outputs to terminal. logmsg::String = "#8abeff" # tree - tree_title::String = "$orange italic" - tree_node::String = "$yellow italic" - tree_leaf::String = yellow_light - tree_guide::String = blue - tree_max_width::Int = 44 + tree_mid::String = blue + tree_terminator::String = blue + tree_skip::String = blue + tree_dash::String = blue + tree_trunc::String = blue + tree_pair::String = red_light + tree_keys::String = yellow + tree_title::String = "bold " * orange + tree_max_leaf_width::Int = 44 # repr repr_accent::String = "bold #e0db79" @@ -92,7 +96,7 @@ style outputs to terminal. md_h6::String = "bold $cyan_lighter" md_latex::String = "$yellow_light italic" md_code::String = "$yellow_light italic" - md_codeblock_bg::String = "#262626" + md_codeblock_bg::String = "#202020" md_quote::String = "#5a74f2" md_footnote::String = "#9aacdb" md_table_header::String = "bold yellow" @@ -159,10 +163,14 @@ LightTheme = Theme( logmsg = "#8abeff", # tree - tree_title = "$orange italic", - tree_node = "$yellow_darker italic", - tree_leaf = yellow_dark, - tree_guide = blue_darker, + tree_mid = blue_darker, + tree_terminator = blue_darker, + tree_skip = blue_darker, + tree_dash = blue_darker, + tree_trunc = blue_darker, + tree_pair = red_light, + tree_keys = red_dark, + tree_max_leaf_width = 44, # repr repr_accent = "bold $yellow_darker", diff --git a/src/trees.jl b/src/trees.jl index fd4d41115..10a095079 100644 --- a/src/trees.jl +++ b/src/trees.jl @@ -1,22 +1,11 @@ module Trees -import OrderedCollections: OrderedDict -import Base: @kwdef +import AbstractTrees: print_tree, TreeCharSet, children using InteractiveUtils -import Term: - loop_last, - escape_brackets, - fillin, - highlight, - rint, - TERM_THEME, - textlen, - str_trunc, - expr2string - -import ..Renderables: AbstractRenderable -import ..Layout: vstack, pad, hLine +import Term: replace_multi, highlight, reshape_text, TERM_THEME, Theme + +import ..Renderables: AbstractRenderable, RenderableText import ..Style: apply_style import ..Segments: Segment import ..Measures: Measure @@ -29,292 +18,157 @@ export Tree # ---------------------------------------------------------------------------- # treeguides = Dict( - :standardtree => (" ", "│ ", "├── ", "└── "), - :boldtree => (" ", "┃ ", "┣━━ ", "┗━━ "), - :asciitree => (" ", "| ", "+-- ", "`-- "), + :standardtree => TreeCharSet("├", "└", "│", "─", "⋮", " ⇒ "), + :roundedtree => TreeCharSet("├──", "╰─", "│", "─", "⋮", " ⇒ "), + :boldtree => TreeCharSet("┣━━", "┗━━", "┃", "━", "⋮", " ⇒ "), + :asciitree => TreeCharSet("+--", "`--", "|", "--", "...", " => "), ) -""" - TreeGuides - -Store strings to make up a `Tree`'s guides (the line elements showing connections). -""" -struct TreeGuides - space::String - vline::String - branch::String - leaf::String -end - -""" - TreeGuides(guides_type::Symbol, style::String) - -Get tree guides with style information applied -""" -TreeGuides(guides_type::Symbol, style::String) = - TreeGuides(map((g) -> apply_style("{$style}$g{/$style}"), treeguides[guides_type])...) - # ---------------------------------------------------------------------------- # # TREE # # ---------------------------------------------------------------------------- # -# ----------------------------------- leaf ----------------------------------- # +const _TREE_PRINTING_TITLE = Ref{Union{Nothing,String}}(nothing) """ - asleaf + print_node(io, node) -Style an object to render it as a a string +Core function to enable fancy tree printing. Styles the leaf/key of each node. """ -function asleaf end +function print_node(io, node; kw...) + theme::Theme = TERM_THEME[] + + if isnothing(_TREE_PRINTING_TITLE[]) # print node + styled = if node isa AbstractString + highlight(node, :string; theme = theme) + else + styled = highlight(string(node); theme = theme) + end + reshaped = reshape_text(styled, theme.tree_max_leaf_width) + print(io, reshaped) + else # print title + title = _TREE_PRINTING_TITLE[] + print(io, apply_style(title, theme.tree_title)) + end -asleaf(x) = str_trunc(highlight(string(x)), TERM_THEME[].tree_max_width) -asleaf(x::Nothing) = nothing -asleaf(x::AbstractVector) = str_trunc(string(x), TERM_THEME[].tree_max_width) -asleaf(x::AbstractString) = str_trunc(highlight(x, :string), TERM_THEME[].tree_max_width) + _TREE_PRINTING_TITLE[] = nothing +end """ - Leaf + print_key(io, k; kw...) -End items in a `Tree`. No sub-trees. +Print a tree's node's key with some style. """ -struct Leaf - name::Union{Nothing,String} - text::Union{Nothing,String} - idx::Int # rendering index +function print_key(io, k; kw...) + s = TERM_THEME[].tree_keys + print(io, apply_style("{s}" * string(k) * "{/s}")) end -# ----------------------------------- tree ----------------------------------- # """ - Tree + style_guides(tree::String, guides::TreeCharSet, theme::Theme) -A tree is composed of nodes (other trees) and leaves (end items). -It renders as a hierarchical structure with lines (guides) connecting the various elements +Apply style to a tree's guides by inserting it into its string representation. +Not ideal as it will affect the style of other elements with the same characters +like Panels, but ok for no. """ -@kwdef struct Tree <: AbstractRenderable - segments::Union{Nothing,Vector{Segment}} = nothing - measure::Measure = Measure(segments) - - name::String - level::Int - nodes::Vector{Tree} - leaves::Vector{Leaf} - idx::Int = 0 # rendering index for tree that are nodes in a lager tree - - title_style::String = TERM_THEME[].tree_title - node_style::String = TERM_THEME[].tree_node - leaf_style::String = TERM_THEME[].tree_leaf - guides_style::String = TERM_THEME[].tree_guide - guides_type::Symbol = :standardtree +function style_guides(tree::String, guides::TreeCharSet, theme::Theme) + return replace_multi( + tree, + guides.mid => apply_style(guides.mid, theme.tree_mid), + guides.terminator => apply_style(guides.terminator, theme.tree_terminator), + guides.skip => apply_style(guides.skip, theme.tree_skip), + guides.dash => apply_style(guides.dash, theme.tree_dash), + guides.trunc => apply_style(guides.trunc, theme.tree_trunc), + strip(guides.pair) => apply_style(string(strip(guides.pair)), theme.tree_pair), + ) end """ -Show/render a `Tree` + Tree + +Renderable tree. """ -function Base.show(io::IO, tree::Tree) - if io != stdout - print( - io, - "Tree: $(length(tree.nodes)) nodes, $(length(tree.leaves)) leaves | Idx: $(tree.idx)", - ) - else - println.(io, tree.segments) - end +struct Tree <: AbstractRenderable + segments::Vector{Segment} + measure::Measure end """ -Add a new node to an existing tree's nodes or levaes. -""" -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::AbstractDict) - return push!( - nodes, - Tree( - v; - level = level + 1, - title = str_trunc(string(k), TERM_THEME[].tree_max_width), - idx = length(nodes) + length(leaves) + 1, - ), + Tree( + tree; + guides::Union{TreeCharSet,Symbol} = :standardtree, + theme::Theme = TERM_THEME[], + printkeys::Union{Nothing,Bool} = true, + print_node_function::Function = print_node, + print_key_function::Function = print_key, + title::Union{String, Nothing}=nothing, + prefix::String = " ", + kwargs..., ) -end -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Pair) - k = if isnothing(v.first) - nothing - else - str_trunc(string(v.first), TERM_THEME[].tree_max_width) - end - idx = length(nodes) + length(leaves) + 1 - return push!(leaves, Leaf(k, asleaf(v.second), idx)) -end +Constructor for `Tree` -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Any) - k = isnothing(k) ? nothing : str_trunc(string(k), TERM_THEME[].tree_max_width) - idx = length(nodes) + length(leaves) + 1 - return push!(leaves, Leaf(k, asleaf(v), idx)) -end +It uses `AbstractTrees.print_tree` to get a string representation of `tree` (any object +compatible with the `AbstractTrees` packge). Applies style to the string and creates a +renderable `Tree`. -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Vector) - for _v in v - _k = - _v isa Union{Dict,OrderedDict} ? collect(keys(_v))[1] : - (v isa Pair ? _v.first : v) - addnode!(nodes, leaves, level + 1, _k, _v) - end -end +Arguments: +- `tree`: anything compatible with `AbstractTree` +- `guides`: if a symbol, the name of preset tree guides types. Otherwise an instance of + `AbstractTrees.TreeCharSet` +- `theme`: `Theme` used to set tree style. +- `printkeys`: If `true` print keys. If `false` don't print keys. +- `print_node_function`: Function used to print nodes. +- `print_key_function`: Function used to print keys. +- `title`: Title of the tree. +- `prefix`: Prefix to be used in `AbstractTrees.print_tree` -""" - Tree(data::Union{AbstractDict, Pair}; level=0, title::String="tree", kwargs...) -Construct a `Tree` out of a `Dict` or `OrderedDict`. Recursively handle nested `Dict`s. +For other kwargs look at `AbstractTrees.print_tree` """ function Tree( - data::Union{AbstractDict,Pair,Vector}; - level = 0, - title::String = "tree", + tree; + guides::Union{TreeCharSet,Symbol} = :standardtree, + theme::Theme = TERM_THEME[], + printkeys::Union{Nothing,Bool} = true, + print_node_function::Function = print_node, + print_key_function::Function = print_key, + title::Union{String,Nothing} = nothing, + prefix::String = " ", kwargs..., ) - - # initialize - nodes::Vector{Tree} = [] - leaves::Vector{Leaf} = [] - - # go over all entries - for (k, v) in zip(keys(data), values(data)) - addnode!(nodes, leaves, level, k, v) - end - - # if we're handling the first tree, render it. Otherwise parse nested trees. - if level > 0 - # we don't need to render - return Tree(; - name = title, - level = level, - nodes = nodes, - leaves = leaves, - kwargs..., - ) - else - # render and get measure - segments = render( - Tree(; name = title, level = level, nodes = nodes, leaves = leaves, kwargs...), - ) - measure = Measure(segments) - - return Tree(; - segments = segments, - measure = measure, - name = str_trunc(title, TERM_THEME[].tree_max_width), - level = level, - nodes = nodes, - leaves = leaves, + _TREE_PRINTING_TITLE[] = title + + # print tree + guides = guides isa Symbol ? treeguides[guides] : guides + tree = sprint( + io -> print_tree( + print_node_function, + print_key_function, + io, + tree; + charset = guides, + printkeys = printkeys, + prefix = prefix, kwargs..., - ) - end -end - -# ---------------------------------- render ---------------------------------- # - -""" - render(tree::Tree)::Vector{Segment} - -Render a `Tree` into segments. Recursively handle nested trees. - - -""" -function render( - tree::Tree; - prevguides::String = "", - lasttree = false, - waslast = [], - guides = nothing, -)::Vector{Segment} - guides = isnothing(guides) ? TreeGuides(tree.guides_type, tree.guides_style) : guides - hasleaves = length(tree.leaves) > 0 - - segments::Vector{Segment} = [] - - """ - Add a segment to the segments vector - """ - _add(x::String, style) = push!(segments, Segment(x, style)) - _add(x::String) = _add(x, "default") - - # ------------------------------ render in parts ----------------------------- # - # render initial part - if tree.level == 0 - header_text = "{$(tree.title_style)}$(tree.name){/$(tree.title_style)}" - header = - (" " * header_text * " ") / - hLine(textlen(tree.name) + 2; style = "$(tree.title_style) dim", box = :HEAVY) - - append!(segments, header.segments) - else - _pre_guides = "" - for (n, (l, last)) in enumerate(loop_last(waslast)) - # ugly, get the correct sequence of guides based on where we are/what came before - if last - _end = lasttree ? guides.leaf : guides.branch - _pre_guides *= l ? _end : guides.space + ), + ) - else - _end = n == length(waslast) ? guides.branch : guides.vline - _pre_guides *= lasttree ? (l ? guides.leaf : guides.vline) : _end - end - end + # style keys + rx = Regex("(?<=$(guides.dash)) [\\w.,\":\\[\\]\\d]+ (?=$(strip(guides.pair)))") + tree = replace( + tree, + rx => SubstitutionString( + "{$(theme.tree_keys)}" * s"\g<0>" * "{/$(theme.tree_keys)}", + ), + ) - _add(_pre_guides * "{$(tree.node_style)}$(tree.name){/$(tree.node_style)}") - end - tree.level == 0 && _add(prevguides * guides.vline) - - # get all nodes and sub-trees in order for rendering - elements = vcat(tree.nodes, tree.leaves) - idxs = getfield.(elements, :idx) - elements = elements[sortperm(idxs)] - # @info "rendering $(length(elements)) elements" elements - - for (last, elem) in loop_last(elements) - if elem isa Tree - prev = prevguides * (last ? guides.space : guides.vline) - - append!( - segments, - render( - elem; - prevguides = prev, - lasttree = last, - waslast = vcat(waslast, last), # vcat(waslast, lasttree), - guides = guides, - ), - ) - # hasleaves && length(elem.leaves) > 0 && _add(prevguides * guides.vline) - elseif elem isa Leaf - # @info "rendering leaf $(elem.idx): $(elem.name) > $(elem.text)" - seg = last ? guides.leaf : guides.branch - if isnothing(elem.text) - k = isnothing(elem.name) ? "" : highlight(elem.name) - v = "" - else - k = if isnothing(elem.name) - "" - else - "{$(tree.leaf_style)}$(elem.name){/$(tree.leaf_style)}: " - end - v = elem.text - end - _add(prevguides * seg * k * v) - end - end + # style guides + tree = style_guides(tree, guides, theme) - # left pad segments - if tree.level == 0 - header_length = length(header.segments) - padded_segments = vcat( - header.segments..., - pad(segments[(header_length + 1):end], rint(header.measure.w / 2 - 1))..., - ) - return fillin(padded_segments) - else - return segments - end + # turn into a renderable + rt = RenderableText(tree) + return Tree(rt.segments, rt.measure) end # ---------------------------------------------------------------------------- # @@ -365,38 +219,27 @@ end Tree(T::DataType)::Tree Construct a `Tree` visualization of `T`'s types hierarchy +The key is in costructing the actual hierarchy tree recursively. """ function Tree(T::DataType)::Tree - theme = TERM_THEME[] # create a dictionary of types hierarchy subs = Dict(string(s) => nothing for s in subtypes(T)) data = make_hierarchy_dict(supertypes(T), T, subs) - return Tree( - data; - title = string(supertypes(T)[end - 1]), - # title = "Any", - title_style = "$(theme.emphasis_light) italic", - guides_style = theme.emphasis, - ) -end + # define a fn to avoid printing nodes + s = TERM_THEME[].tree_mid + fn(io::IO, x) = + length(children(x)) > 0 ? print(io, apply_style("{$s}┬{/$s}")) : print(io, "") -function _key(e::Expr) - if length(e.args) > 1 - "$(expr2string(e)) {dim $(TERM_THEME[].emphasis)}($(e.head): {/dim $(TERM_THEME[].emphasis)}{red bold default}$(e.args[1]){/red bold default}{dim blue}){/dim blue}" - else - string(e.head) - end -end -_values(e::Expr) = length(e.args) > 1 ? e.args[2:end] : e.args + # change style of pair + _style = TERM_THEME[].tree_pair + TERM_THEME[].tree_pair = "hidden" -_pair(x) = nothing => x -_pair(e::Expr) = Dict(_key(e) => _pair.(_values(e))) + # print tree + _tree = Tree(data; printkeys = true, print_node_function = fn) + TERM_THEME[].tree_pair = _style -function Tree(expr::Expr; kwargs...) - parsed = _pair(expr) - parsed = Dict(collect(keys(parsed))[1] => parsed) - return Tree(parsed; title = expr2string(expr)) + return _tree end end diff --git a/test/06_test_box.jl b/test/06_test_box.jl index 7b8d45050..69ec0798a 100644 --- a/test/06_test_box.jl +++ b/test/06_test_box.jl @@ -48,7 +48,7 @@ import Term: Segment ) @test left.measure.w == 22 @test left.text == - "\e[0m\e[31m╭──── \e[34mtest\e[39m\e[31m\e[31m ──────────╮\e[39m\e[0m\e[39m" + "\e[31m╭──── \e[34mtest\e[39m\e[31m\e[31m ──────────╮\e[39m\e[0m\e[39m" right = get_title_row( :top, @@ -61,7 +61,7 @@ import Term: Segment ) @test right.measure.w == 22 @test right.text == - "\e[0m\e[31m╭─────────── \e[34mtest\e[39m\e[31m\e[31m ───╮\e[39m\e[0m\e[39m" + "\e[31m╭─────────── \e[34mtest\e[39m\e[31m\e[31m ───╮\e[39m\e[0m\e[39m" center = get_title_row( :top, @@ -74,7 +74,7 @@ import Term: Segment ) @test center.measure.w == 22 @test center.text == - "\e[0m\e[31m╭─────── \e[34mtest\e[39m\e[31m\e[31m ───────╮\e[39m\e[0m\e[39m" + "\e[31m╭─────── \e[34mtest\e[39m\e[31m\e[31m ───────╮\e[39m\e[0m\e[39m" for width in (15, 21, 33, 58), justify in (:left, :center, :right) line = get_title_row( diff --git a/test/08_test_panel.jl b/test/08_test_panel.jl index 8ff8e816b..c097c649f 100644 --- a/test/08_test_panel.jl +++ b/test/08_test_panel.jl @@ -245,7 +245,7 @@ id est laborum.""", oooo """ p = Panel(circle; fit = true, padding = (2, 2, 0, 0)) @test string(p) == - "\e[0m\e[22m╭────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m oooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰────────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭────────────────╮\e[22m\e[0m\n\e[22m│\e[22m oooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooo \e[22m│\e[22m\n\e[0m\e[22m╰────────────────╯\e[22m\e[0m\e[0m" p = Panel( "test"^25; @@ -332,7 +332,7 @@ ads ); background = "on_red", fit = true) @test string(p) == - "\e[0m\e[22m╭──────────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m asasd\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdasadas\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdsasdasdsadasdsa\e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44mads\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m \e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭──────────────────────╮\e[22m\e[0m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m asasd\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdasadas\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdsasdasdsadasdsa\e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44mads\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m \e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────────╯\e[22m\e[0m\e[0m" end @testset "\e[34mPANEL - UnicodePlots" begin diff --git a/test/09_test_layout.jl b/test/09_test_layout.jl index f89c0f2c6..6a3f44454 100644 --- a/test/09_test_layout.jl +++ b/test/09_test_layout.jl @@ -50,7 +50,7 @@ end p = Panel(height = 10, width = 20) @test string(vertical_pad(p, 4, 4)) == - " \n \n \n \n\e[0m\e[22m╭──────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────╯\e[22m\e[0m\e[0m\n \n \n \n " + " \n \n \n \n\e[0m\e[22m╭──────────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──────────────────╯\e[22m\e[0m\e[0m\n \n \n \n " vertical_pad!(p, 4, 4) @test p isa Panel @@ -63,11 +63,11 @@ end p = Panel(height = 2, width = 4) @test string(vertical_pad(p; height = 5, method = :top)) == - "\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n \n " + "\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n \n " @test string(vertical_pad(p; height = 5, method = :bottom)) == - " \n \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m" + " \n \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m" @test string(vertical_pad(p; height = 5, method = :center)) == - " \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n " + " \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n " end @testset "\e[34mlayout - spacer" begin @@ -110,7 +110,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - "\e[0m\e[22m╭───╮\e[22m\e[0m \n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n\e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭────────╮\e[22m\e[0m \n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n\e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭───╮\e[22m\e[0m \n\e[22m│\e[22m \e[22m│\e[22m \n\e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭────────╮\e[22m\e[0m \n\e[22m│\e[22m \e[22m│\e[22m \n\e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 @@ -119,7 +119,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - " \e[0m\e[22m╭───╮\e[22m\e[0m \n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n \e[0m\e[22m╭────────╮\e[22m\e[0m \n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + " \e[0m\e[22m╭───╮\e[22m\e[0m \n \e[22m│\e[22m \e[22m│\e[22m \n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n \e[0m\e[22m╭────────╮\e[22m\e[0m \n \e[22m│\e[22m \e[22m│\e[22m \n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 @@ -128,7 +128,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - " \e[0m\e[22m╭───╮\e[22m\e[0m\n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m\n \e[0m\e[22m╭────────╮\e[22m\e[0m\n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m\n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + " \e[0m\e[22m╭───╮\e[22m\e[0m\n \e[22m│\e[22m \e[22m│\e[22m\n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m\n \e[0m\e[22m╭────────╮\e[22m\e[0m\n \e[22m│\e[22m \e[22m│\e[22m\n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m\n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 end diff --git a/test/10_test_inspect.jl b/test/10_test_inspect.jl index d3ff6c2f9..29e98c791 100644 --- a/test/10_test_inspect.jl +++ b/test/10_test_inspect.jl @@ -57,17 +57,17 @@ end dosmth(m::MyStr) = print(m.x) - intro = @capture_out begin - inspect(MyStr; methods = true, supertypes = true) - end - intro = remove_ansi(intro) - @test intro isa String + # intro = @capture_out begin + # inspect(MyStr; methods = true, supertypes = true) + # end + # intro = remove_ansi(intro) + # @test intro isa String # intro = @capture_out begin # inspect(Panel; methods = true, supertypes = true,) # end # @compare_to_string(intro, "introspection_panel") - @test_nothrow inspect(Panel; methods = true, supertypes = true) + # @test_nothrow inspect(Panel; methods = true, supertypes = true) intro = @capture_out begin inspect(print) diff --git a/test/11_test_theme.jl b/test/11_test_theme.jl index 6ebee2ec0..520680fed 100644 --- a/test/11_test_theme.jl +++ b/test/11_test_theme.jl @@ -31,11 +31,14 @@ end warn = "green", error = "bold #d13f3f", logmsg = "#8abeff", - tree_title = "green italic", - tree_node = "yellow italic", - tree_leaf = "yellow", - tree_guide = "red", - tree_max_width = 22, + tree_mid = "blue", + tree_terminator = "blue", + tree_skip = "blue", + tree_dash = "blue", + tree_trunc = "blue", + tree_pair = "red", + tree_keys = "green", + tree_max_leaf_width = 22, repr_accent = "green", repr_name = "yellow", repr_type = "red", diff --git a/test/13_test_logs.jl b/test/13_test_logs.jl index 85ee09a75..bffdc21e5 100644 --- a/test/13_test_logs.jl +++ b/test/13_test_logs.jl @@ -5,14 +5,20 @@ using Term.Progress import ProgressLogging import UUIDs: uuid4 +struct MyLogsStruct + x::String + y::Vector + z::Int +end + @testset "\e[34mLOGS test" begin install_term_logger() println("\nTesting logging, stdout temporarily disabled") - @suppress_out begin + output = @capture_out begin @info "my log!" - @warn "tell us if this was [bold red]undexpected![/bold red]" + @warn "tell us if this was {bold red}undexpected!{/bold red}" x = collect(1:2:20) y = x * x' @@ -27,15 +33,20 @@ import UUIDs: uuid4 sdfs s""" 1 + 2 + + @info MyStruct("aa a"^100, zeros(200), 4) end + + # IS_WIN || @compare_to_string output "logs.txt" + uninstall_term_logger() end -@testset "\e[34mLOGS handle_progress" begin - logger = TermLogger(devnull, TERM_THEME[]) - for fraction in (nothing, 0.0, 0.5, 1.0) - handle_progress(logger, ProgressLogging.Progress(id = uuid4(), fraction = fraction)) - end +# @testset "\e[34mLOGS handle_progress" begin +# logger = TermLogger(devnull, TERM_THEME[]) +# for fraction in (nothing, 0.0, 0.5, 1.0) +# handle_progress(logger, ProgressLogging.Progress(id = uuid4(), fraction = fraction)) +# end - @test true -end +# @test true +# end diff --git a/test/16_test_tree.jl b/test/16_test_tree.jl index 58e10170e..a8a53976f 100644 --- a/test/16_test_tree.jl +++ b/test/16_test_tree.jl @@ -1,104 +1,84 @@ -import Term: Tree +import Term: Tree, TERM_THEME, LightTheme import OrderedCollections: OrderedDict -tree_dict = Dict( - "nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsdfd" => - Dict("n1" => 1, "n2" => 2), -) - -tree_dict_1 = - Dict("nested" => Dict("n1" => 1, "n2" => 2), "nested2" => Dict("n1" => "a", "n2" => 2)) - -tree_dict_2 = Dict( - "nested" => Dict("n1" => 1, "n2" => 2), - "leaf2" => 2, - "leaf" => 2, - "leafme" => "v", - "canopy" => "test", - ["a"] => :test, -) - -tree_dict_3 = Dict( - "nested" => Dict( - "deeper" => Dict("aleaf" => "unbeliefable", "leaflet" => "level 3"^20), - "n2" => Int, - "n3" => 1 + 2, +trees = [ + Dict( + "nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsdfd" => + Dict("n1" => 1, "n2" => 2), ), - "nested2" => Dict("n1" => "a", "n2" => 2), -) - -tree_dict_4 = Dict( - "nested" => Dict( - "deeper" => Dict( - "aleaf" => "unbeliefable", - "leaflet" => "level 3", - "sodeep" => Dict("a" => 4), + Dict("nested" => Dict("n1" => 1, "n2" => 2), "nested2" => Dict("n1" => "a", "n2" => 2)), + Dict( + "nested" => Dict("n1" => 1, "n2" => 2), + "leaf2" => 2, + "leaf" => 2, + "leafme" => "v", + "canopy" => "test", + ["a"] => :test, + ), + Dict( + "nested" => Dict( + "deeper" => Dict("aleaf" => "unbeliefable", "leaflet" => "level 3"^20), + "n2" => Int, + "n3" => 1 + 2, ), - "n2" => Int, - "n3" => 1 + 2, - "adict" => Dict("x" => 2), + "nested2" => Dict("n1" => "a", "n2" => 2), ), - "nested2" => Dict("n1" => "a", "n2" => 2), -) - -tree_dict_order_1 = - OrderedDict(3 => OrderedDict(3 => 8, 1 => "a"), 2 => OrderedDict(3 => 8, 1 => "a")) - -tree_dict_order_2 = OrderedDict(2 => 1, 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1)) + Dict( + "nested" => Dict( + "deeper" => Dict( + "aleaf" => "unbeliefable", + "leaflet" => "level 3", + "sodeep" => Dict("a" => 4), + ), + "n2" => Int, + "n3" => 1 + 2, + "adict" => Dict("x" => 2), + ), + "nested2" => Dict("n1" => "a", "n2" => 2), + ), + OrderedDict(3 => OrderedDict(3 => 8, 1 => "a"), 2 => OrderedDict(3 => 8, 1 => "a")), + OrderedDict(2 => 1, 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1)), + [1, 2, [2, 3, 4]], + [ + 1, + [2, [3, 4], "a"^200], + :c, + OrderedDict(2 => "a", 1 => :ok, "a" => 2, :test => [1, 2]), + ], + Int, + String, + :(print, :(x, y)), +] @testset "\e[34mTree" begin - # creation - @testtree(Tree(tree_dict), 6, 50) - - @testtree(Tree(tree_dict_1), 9, 15) - - @testtree(Tree(tree_dict_2), 11, 18) - - @testtree(Tree(tree_dict_3), 12, 66) - - @testtree(Tree(tree_dict_4), 16, 33) - - @testtree(Tree(tree_dict_order_1), 9, 14) - @testtree(Tree(tree_dict_order_2), 8, 14) - - # styling - for guides_type in (:standardtree, :boldtree, :asciitree) - @test_nothrow Tree( - tree_dict; - title = string(guides_type), - guides_type = guides_type, - ) + thm1 = TERM_THEME[] + thm2 = LightTheme + + for (i, theme) in enumerate((thm1, thm2)) + for (j, guides_type) in enumerate((:standardtree, :boldtree, :asciitree)) + for (k, tree) in enumerate(trees) + if VERSION ≥ v"1.7" # ! not sure why but this fails in older versions: segmentation fault + IS_WIN || @compare_to_string string( + Tree( + tree; + theme = theme, + guides = guides_type, + printkeys = true, + title = "tree_$(i)_$(j)_$(k)", + ), + ) "tree_$(i)_$(j)_$(k)" + end + end + end end - @testtree( - Tree( - tree_dict; - title = "my colors", - title_style = "bold red", - node_style = "blue underline", - leaf_style = "green", - guides_style = "red dim", - ), - 6, - 52, - ) - # test with no errors @test_nothrow Tree(Float64) @test_nothrow Tree(AbstractFloat) - # compare to string - (VERSION < v"1.7.1" || IS_WIN) || begin - @compare_to_string string(Tree(tree_dict)) "tree_1" - @compare_to_string string(Tree(tree_dict_1)) "tree_2" - @compare_to_string string(Tree(tree_dict_2)) "tree_3" - @compare_to_string string(Tree(tree_dict_3)) "tree_4" - @compare_to_string string(Tree(tree_dict_order_1)) "tree_5" - @compare_to_string string(Tree(tree_dict_order_2)) "tree_6" - end - # test printing - @test sprint(io -> show(io, Tree(tree_dict_1))) == "Tree: 2 nodes, 0 leaves | Idx: 0" - @test sprint(io -> show(io, MIME("text/plain"), Tree(tree_dict_1).segments[1])) == - "Segment{String} \e[2m(size: Measure (h: 1, w: 15))\e[0m" + @test sprint(io -> show(io, Tree(trees[1]))) == + "\e[38;5;117mTree <: AbstractRenderable\e[0m \e[2m(h:10, w:80)\e[0m" + @test sprint(io -> show(io, MIME("text/plain"), Tree(trees[1]).segments[1])) == + "Segment{String} \e[2m(size: Measure (h: 1, w: 80))\e[0m" end diff --git a/test/19_test_repr.jl b/test/19_test_repr.jl index 1a46ddb94..fabcd7465 100644 --- a/test/19_test_repr.jl +++ b/test/19_test_repr.jl @@ -29,6 +29,20 @@ end IS_WIN || @compare_to_string sprint(termshow, Rocket) "repr_rocket_struct" IS_WIN || @compare_to_string sprint(termshow, T()) "repr_T_struct" end + + @with_repr struct MyTestStruct3 + x::String + y::Array + z::Int + a::Panel + c::String + end + + mts = MyTestStruct3("aa aa"^100, zeros(100, 100), 3, Panel(), "b b b"^100) + + VERSION ≥ v"1.7" && begin + IS_WIN || @compare_to_string sprint(termshow, mts) "mts_repr" + end end @testset "REPR @with_repr with doc" begin @@ -48,6 +62,10 @@ end @compare_to_string sprint(io -> show(io, MIME("text/plain"), Rocket2)) "repr_rocket_2_show" end +"test function" +fn(x::Int) = x +fn(s::String) = s + objs = if VERSION >= v"1.7.1" ( (1, [1, 2, 3]), @@ -56,7 +74,7 @@ objs = if VERSION >= v"1.7.1" (4, zeros(120, 300)), (5, zeros(200)), (6, zeros(3, 3, 3)), - (7, clear), + (7, fn), (8, :(x / y + √9)), (9, zeros(10)), (10, zeros(5, 5)), @@ -67,7 +85,7 @@ else (1, [1, 2, 3]), (2, Dict(:x => [1, 2, 3], "a" => Dict(:z => "a"))), (3, Dict(i => i for i in 1:100)), - (7, clear), + (7, fn), ) end diff --git a/test/20_test_compositor.jl b/test/20_test_compositor.jl index f0f380f01..cf77763e5 100644 --- a/test/20_test_compositor.jl +++ b/test/20_test_compositor.jl @@ -37,11 +37,11 @@ end @test_logs (:warn, r"Could not update compositor") update!(C4, :FOO, Panel()) C5 = Compositor(:(A(100, 55) * B(20, 15))) - @test_logs (:warn, r"Shape mismatch while updating compositor element") update!( - C5, - :A, - Panel(), - ) + # @test_logs (:warn, r"Shape mismatch while updating compositor element") update!( + # C5, + # :A, + # Panel(; width=20), + # ) compositors = [C1, C1_b, C2, C3] diff --git a/test/26_test_live.jl b/test/26_test_live.jl new file mode 100644 index 000000000..72cd5f15a --- /dev/null +++ b/test/26_test_live.jl @@ -0,0 +1,385 @@ +using Term.LiveWidgets +import Term.LiveWidgets: + ArrowDown, + ArrowUp, + ArrowLeft, + ArrowRight, + DelKey, + HomeKey, + EndKey, + PageUpKey, + PageDownKey, + Enter, + SpaceBar, + Esc, + Del + +import Term.LiveWidgets: + newline, + addspace, + del, + addchar, + WidgetInternals, + PlaceHolderWidget, + menu_activate_next, + menu_return_value, + multi_select_toggle, + next_page, + next_line, + prev_page, + prev_line, + home, + toend, + activate_next_widget, + activate_prev_widget, + AppInternals, + toggle_help, + get_active, + on_layout_change + +import Term.Compositors: Compositor +import Term.Consoles: Console, enable, disable +import Term: Measure, AbstractRenderable + +import OrderedCollections: OrderedDict + +# ---------------------------------------------------------------------------- # +# basic widgets # +# ---------------------------------------------------------------------------- # + +@testset "WidgetInternals" begin + w = TextWidget("a") + + @test w.internals.active isa Bool + @test w.internals.measure isa Measure + @test isnothing(w.internals.on_draw) + @test w.internals.on_activated isa Function + @test w.internals.on_deactivated isa Function +end + +@testset "TextWidget" begin + texts = ["test", "This is long test"^25] + panel = [true, false] + + for (i, t) in enumerate(texts), (j, p) in enumerate(panel) + widget = TextWidget(t; as_panel = p) + asframe = frame(widget) + + IS_WIN || @compare_to_string(asframe, "widget_text_$(i)_$(j)") + + @test asframe isa AbstractRenderable + @test widget.controls isa AbstractDict + @test widget.internals isa WidgetInternals + end +end + +@testset "InputBox" begin + ib = InputBox() + + @test isnothing(ib.input_text) + addchar(ib, 'a') + addchar(ib, 'b') + del(ib, Del()) + addspace(ib, SpaceBar()) + newline(ib, Enter()) + addchar(ib, 'c') + + @test ib.input_text == "a \nc" + @test ib.controls isa AbstractDict + @test ib.internals isa WidgetInternals + @test ib.internals.measure == Measure(5, 80) + + as_frame = frame(ib) + @test as_frame isa AbstractRenderable + IS_WIN || @compare_to_string as_frame "widget_inputbox" +end + +@testset "PlaceHolderWidget" begin + ph = PlaceHolderWidget(5, 20, "test", "red") + + @test ph.controls isa AbstractDict + @test ph.internals isa WidgetInternals + @test ph.internals.measure == Measure(5, 20) + + as_frame = frame(ph) + @test as_frame isa AbstractRenderable + IS_WIN || @compare_to_string as_frame "widget_placeholder" +end + +# ---------------------------------------------------------------------------- # +# MENU # +# ---------------------------------------------------------------------------- # + +@testset "SimpleMenu" begin + for (i, w) in enumerate((50, 100)) + for (j, orientation) in enumerate((:vertical, :horizontal)) + for (k, style) in enumerate(("red", "green")) + mn = SimpleMenu( + ["one", "two", "three"]; + width = w, + layout = orientation, + active_style = style, + inactive_style = "dim", + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + + # if orientation != :vertical + # @test mn.internals.measure == Measure(3, w) + # else + # @test mn.internals.measure == Measure(w, 3) + # end + + IS_WIN || @compare_to_string frame(mn) "widget_simplemenu_$(i)_$(j)_$(k)" + + menu_activate_next(mn, 1) + IS_WIN || @compare_to_string frame(mn) "widget_simplemenu_$(i)_$(j)_$(k)_b" + + @test menu_return_value(mn, Enter()) == 2 + end + end + end +end + +@testset "ButtonsMenu" begin + for (i, w) in enumerate((50, 100)) + for (j, orientation) in enumerate((:vertical, :horizontal)) + for (k, style) in enumerate(("red", "green")) + for (l, height) in enumerate((5, 10)) + mn = ButtonsMenu( + ["one", "two", "three"]; + width = w, + layout = orientation, + active_style = style, + inactive_style = "dim", + height = height, + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + + # if orientation == :vertical + # @test mn.internals.measure == Measure(height, w) + # else + # @test mn.internals.measure == Measure(w, height) + # end + + IS_WIN || + @compare_to_string frame(mn) "widget_buttonsmenu_$(i)_$(j)_$(k)_($l)" + + menu_activate_next(mn, 1) + IS_WIN || + @compare_to_string frame(mn) "widget_buttonsmenu_$(i)_$(j)_$(k)_$(l)_b" + + @test menu_return_value(mn, Enter()) == 2 + end + end + end + end +end + +@testset "MultiSelectMenu" begin + for (i, w) in enumerate((50, 100)) + for (k, style) in enumerate(("red", "green")) + mn = MultiSelectMenu( + ["one", "two", "three"]; + width = w, + active_style = style, + inactive_style = "dim", + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + @test mn.internals.measure == Measure(3, w) + + IS_WIN || @compare_to_string frame(mn) "widget_multiselectmenu_$(i)_$(k)" + + menu_activate_next(mn, 1) + IS_WIN || @compare_to_string frame(mn) "widget_multiselectmenu_$(i)_$(k)_b" + + multi_select_toggle(mn, SpaceBar()) + @test menu_return_value(mn, Enter()) == [2] + end + end +end + +# ---------------------------------------------------------------------------- # +# Pager & Gallery # +# ---------------------------------------------------------------------------- # + +@testset "Pager" begin + txt = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\nincididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation\nullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\nvoluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserun\n mollit anim id est laborum."^5 + + for (i, w) in enumerate((30, 60)) + for (j, h) in enumerate((20, 40)) + for (k, ln) in enumerate((true, false)) + pag = Pager(txt; width = w, height = h, line_numbers = ln, title = "test") + + @test pag.controls isa AbstractDict + @test pag.internals isa WidgetInternals + @test pag.internals.measure == Measure(h, w) + @test pag.content isa Vector{String} + + LiveWidgets.prev_line(pag, 'a') + LiveWidgets.next_line(pag, 'a') + LiveWidgets.prev_line(pag, 'a') + next_page(pag, 'a') + prev_page(pag, 'a') + next_page(pag, 'a') + + home(pag, HomeKey()) + toend(pag, EndKey()) + prev_page(pag, ArrowLeft()) + + IS_WIN || @compare_to_string frame(pag) "widget_pager_$(i)_$(j)_$(k)" + end + end + end +end + +@testset "Gallery" begin + for (i, w) in enumerate((56, 80)) + for (j, h) in enumerate((20, 40)) + for (k, sp) in enumerate((true, false)) + gal = Gallery( + [TextWidget("aaa"), Pager("aaa" .^ 200)]; + height = h, + width = w, + show_panel = sp, + ) + + @test gal.internals isa WidgetInternals + @test gal.controls isa AbstractDict + @test gal.widgets isa Vector + + IS_WIN || @compare_to_string frame(gal) "widget_gal_$(i)_$(j)_$(k)" + + activate_prev_widget(gal, 1) + activate_next_widget(gal, 1) + activate_next_widget(gal, 1) + + IS_WIN || @compare_to_string frame(gal) "widget_gal_$(i)_$(j)_$(k)_b" + + @test get_active(gal) isa AbstractWidget + end + end + end +end + +# ---------------------------------------------------------------------------- # +# APP # +# ---------------------------------------------------------------------------- # + +@testset "App Layout Only" begin + layout = :((r(10, 0.5) * g(10, 0.5)) / b(10, 1.0)) + + for (j, h) in enumerate((20, 40)) + for (k, e) in enumerate((true, false)) + app = App( + layout; + height = h, + expand = e, + help_message = """ + This is just an example of how to create a simple app without any specific content. + + !!! note + You can make apps too! + """, + ) + + @test app.internals isa AppInternals + @test app.measure isa Measure + @test app.controls isa AbstractDict + @test app.widgets isa AbstractDict + @test app.compositor isa Compositor + + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)" + + IS_WIN || + @compare_to_string sprint(print, app) "single_widghet_app_$(j)_$(k)_print" + + toggle_help(app) + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)_help" + toggle_help(app) + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)_nohelp" + + sleep(1) + end + end +end + +@testset "App Single Widget" begin + for (i, w) in enumerate((0.5, 20)) + for (j, h) in enumerate((20, 40)) + for (k, e) in enumerate((true, false)) + app = App(TextWidget("a"^100); width = w, height = h, expand = e) + + @test app.internals isa AppInternals + @test app.measure isa Measure + @test app.controls isa AbstractDict + @test app.widgets isa AbstractDict + @test app.compositor isa Compositor + + # IS_WIN || @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)" + + # IS_WIN || + # @compare_to_string sprint(print, app) "app_single_widget_$(i)_$(j)_$(k)_print" + + # toggle_help(app) + # IS_WIN || + # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_help" + # toggle_help(app) + # IS_WIN || + # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_nohelp" + + # c1, c2 = Console(30), Console(90) + + # for (m, c) in enumerate((c1, c2, c1)) + # enable(c) + # on_layout_change(app) + # # IS_WIN || + # # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_$(m)" + # disable(c) + # end + + sleep(1) + end + end + end +end + +@testset "App complete" begin + rgb_visualizer = TextWidget("") + + R = InputBox(title = "R value", style = "red", title_justify = :center) + G = InputBox(title = "G value", style = "green", title_justify = :center) + B = InputBox(title = "B value", style = "blue", title_justify = :center) + + button = Button("random"; color = "light_slate_grey", text_color = "white") + + widgets = OrderedDict{Symbol,AbstractWidget}( + :A => rgb_visualizer, + :R => R, + :G => G, + :B => B, + :b => button, + ) + + layout = :(A(22, 0.4) * (R(6, 0.6) / G(6, 0.6) / B(6, 0.6) / b(4, 0.6))) + app = App(layout; widgets = widgets) + + # IS_WIN || @compare_to_string frame(app) "app_complete" + + # c1, c2 = Console(30), Console(90) + + # for (m, c) in enumerate((c1, c2, c1)) + # enable(c) + # on_layout_change(app) + # # IS_WIN || @compare_to_string frame(app) "app_complete_$(m)" + # disable(c) + # end + + # sleep(1) +end diff --git a/test/__test_utils.jl b/test/__test_utils.jl index e7a6d05f6..af28a593f 100644 --- a/test/__test_utils.jl +++ b/test/__test_utils.jl @@ -26,7 +26,7 @@ and clean it up """ fromfile(filepath) = replace_multi(read(filepath, String), "\\n" => "\n", "\\e" => "\e") -fromfilelines(filepath) = lines = readlines(filepath) +fromfilelines(filepath) = readlines(filepath) """ Highlight different characters between two strings. @@ -50,7 +50,7 @@ function highlight_diff(s1::String, s2::String; stop = 500) hLine("FIRST", style = "blue") |> tprint println(s1) hLine("SECOND", style = "blue") |> tprint - println(s1) + println(s2) hLine(style = "dim blue") |> tprint i = 1 diff --git a/test/runtests.jl b/test/runtests.jl index 40f79d45f..8d38787fe 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -62,6 +62,7 @@ end @runner "23_test_link.jl" @runner "24_prompts.jl" @runner "25_annotations.jl" +@runner "26_test_live.jl" @runner "98_test_examples.jl" @runner "99_test_errors.jl" diff --git a/test/txtfiles/annotations_1.txt b/test/txtfiles/annotations_1.txt index 9968476c9..468fc45b5 100644 --- a/test/txtfiles/annotations_1.txt +++ b/test/txtfiles/annotations_1.txt @@ -1,17 +1,17 @@ Panel(content; fit=true) -──┬── ───┬─── ────┬─── +──┬── ───┬─── ────┬─── │ │ │ │ ╭───────────────────────────────────────╮ - ╰─│ this is the struct constructor call │ + ╰─│ this is the struct constructor call │ ╰───────────────────────────────────────╯ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ here you put what goes inside the panel │ + ╰─│ here you put what goes inside the panel │ ╰───────────────────────────────────────────╯ │ │ ╭───────────────────────────────────────╮ - ╰─│ Setting this as `true` adjusts │ - │ the panel's width to fit `content` │ - │ . Otherwise `Panel` will have │ - │ a fixed width │ + ╰─│ Setting this as `true` adjusts │ + │ the panel's width to fit `content` │ + │ . Otherwise `Panel` will have │ + │ a fixed width │ ╰───────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_2.txt b/test/txtfiles/annotations_2.txt index f6de8d9f3..7a861e8b7 100644 --- a/test/txtfiles/annotations_2.txt +++ b/test/txtfiles/annotations_2.txt @@ -1,32 +1,32 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭────────────╮ │ - ╰─│ is it  │ │ - │ helpful? │ │ + ╰─│ is it  │ │ + │ helpful? │ │ ╰────────────╯ │ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_3.txt b/test/txtfiles/annotations_3.txt index d3d1bad44..407925ef5 100644 --- a/test/txtfiles/annotations_3.txt +++ b/test/txtfiles/annotations_3.txt @@ -1,32 +1,32 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭────────────╮ │ - ╰─│ is it  │ │ - │ helpful? │ │ + ╰─│ is it  │ │ + │ helpful? │ │ ╰────────────╯ │ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_4.txt b/test/txtfiles/annotations_4.txt index 234fdea73..560877aa6 100644 --- a/test/txtfiles/annotations_4.txt +++ b/test/txtfiles/annotations_4.txt @@ -1,34 +1,34 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭─────────────────────────────╮ - ╰─│ is it helpful? This  │ - │ is a very long message  │ - │ to check that everything  │ - │  is working correctly  │ + ╰─│ is it helpful? This  │ + │ is a very long message  │ + │ to check that everything  │ + │  is working correctly  │ ╰─────────────────────────────╯ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_5.txt b/test/txtfiles/annotations_5.txt index c36eb949c..3c14300d1 100644 --- a/test/txtfiles/annotations_5.txt +++ b/test/txtfiles/annotations_5.txt @@ -1,6 +1,6 @@ this has some style - ──┬── + ──┬── │ │ ╭────────────────────────────────────────╮ - ╰─│ style means color or stuff like bold │ + ╰─│ style means color or stuff like bold │ ╰────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_6.txt b/test/txtfiles/annotations_6.txt index ba2394f77..216c36430 100644 --- a/test/txtfiles/annotations_6.txt +++ b/test/txtfiles/annotations_6.txt @@ -1,15 +1,15 @@ -╭────────────────────── Annotation: usage ─────────────────────╮ -│ │ -│ │ -│ Annotation("main text", "main"=>"most important") │ -│ ─────┬───── ────────────┬─────────── │ -│ │ │ │ -│ │ ╭────────────────────────────────╮ │ -│ ╰─│ main message to be annotated │ │ -│ ╰────────────────────────────────╯ │ -│ │ │ -│ │ ╭──────────────╮ │ -│ ╰─│ annotation │ │ -│ ╰──────────────╯ │ -│ │ +╭────────────────────── Annotation: usage ─────────────────────╮ +│ │ +│ │ +│ Annotation("main text", "main"=>"most important") │ +│ ─────┬───── ────────────┬─────────── │ +│ │ │ │ +│ │ ╭────────────────────────────────╮ │ +│ ╰─│ main message to be annotated │ │ +│ ╰────────────────────────────────╯ │ +│ │ │ +│ │ ╭──────────────╮ │ +│ ╰─│ annotation │ │ +│ ╰──────────────╯ │ +│ │ ╰──────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/automatic_repr_1.txt b/test/txtfiles/automatic_repr_1.txt index fb83b76f1..992a49ff7 100644 --- a/test/txtfiles/automatic_repr_1.txt +++ b/test/txtfiles/automatic_repr_1.txt @@ -1,5 +1,6 @@ -╭──── Dict {Int64, Symbol}  ──────╮ -│ │ -│  {Int64} │ 1 => x │ {Symbol}  │ -│ │ -╰────────────────────── 1 item ───╯ +╭──── Dict {Int64, Symbol}  ──────╮ +│ │ +│   {Int64}  1 => x  {Symbol}   │ +│   │ +│ │ +╰─────────────────────────────────╯ diff --git a/test/txtfiles/automatic_repr_2.txt b/test/txtfiles/automatic_repr_2.txt index 1a22848f9..e4e32bc90 100644 --- a/test/txtfiles/automatic_repr_2.txt +++ b/test/txtfiles/automatic_repr_2.txt @@ -1,6 +1,7 @@ -╭─────────────────────────────────╮ -│ x + y │ -│ ───────────────────────────── │ -│ head::Symbol│ call │ -│ args::Vector│ Any[:+, :x, :y] │ -╰──────────────────────── Expr ───╯ +╭──────────────────────────────────╮ +│ x + y │ +│ ────────────────────────────── │ +│  head::Symbol  call   │ +│  args::Vector Any[:+, :x, :y]  │ +│   │ +╰───────────────────────── Expr ───╯ diff --git a/test/txtfiles/automatic_repr_showme_1.txt b/test/txtfiles/automatic_repr_showme_1.txt index ea149a04d..81f2b1519 100644 --- a/test/txtfiles/automatic_repr_showme_1.txt +++ b/test/txtfiles/automatic_repr_showme_1.txt @@ -1,6 +1,6 @@ ──────────────────────────────────────────────────────────────────────────────── - ╭──── @showme ─────────────────────────────────────────────────────────╮ - │ Showing definition for method called by: `tprint(stdout, "test")` │ + ╭──── @showme ─────────────────────────────────────────────────────────╮ + │ Showing definition for method called by: `tprint(stdout, "test")` │ ╰──────────────────────────────────────────────────────────────────────╯ Arguments @@ -8,15 +8,15 @@ ⨀ "test"::String Method definition -┌────────────────────────────────────────────────────────────────────┐ -│ function tprint(io::IO, x::AbstractString; highlight = true)  │ -│  x = (highlight ? apply_style ∘ highlighter : apply_style)(  │ -│ x)  │ -│   │ -│  x =  │ -│  Measure(x).w <= console_width(io) ? x :  │ -│  string(RenderableText(string(x), width = console_width  │ -│ (io)))  │ -│  print(io, x)  │ -│ end  │ -└────────────────────────────────────────────────────────────────────┘ \ No newline at end of file +┌────────────────────────────────────────────────────────────────────┐ +│ function tprint(io::IO, x::AbstractString; highlight = true)  │ +│  x = (highlight ? apply_style ∘ highlighter : apply_style)(  │ +│ x)  │ +│   │ +│  x =  │ +│  Measure(x).w <= console_width(io) ? x :  │ +│  string(RenderableText(string(x), width = console_width  │ +│ (io)))  │ +│  print(io, x)  │ +│ end  │ +└────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/backtrace_1.txt b/test/txtfiles/backtrace_1.txt deleted file mode 100644 index 7685fbba9..000000000 --- a/test/txtfiles/backtrace_1.txt +++ /dev/null @@ -1,27 +0,0 @@ -╭──── Error Stack ─────────────────────────────────────────────────────────────╮ -│ │ -│ ──────────────────────────── In module Base ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ (1) │ _start() │ │ -│ ╰───────────────────────────────────────────── TOP LEVEL ───╯ │ -│ │ -│ ──────────────────────────────────────────────────────────────────────── │ -│  Skipped 18 frames in Base, Main  │ -│ ──────────────────────────────────────────────────────────────────────── │ -│ │ -│ ──────────────────────────── In module Main ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ │ f0 │ │ -│ │ inlined │ │ -│ │ │ ╭───────────────────────────────────────╮ │ │ -│ │ ╰─│ 104  f1(x) = 3x │ │ │ -│ (20) │ │ 105  f0(x; kwargs...) = begin │ │ │ -│ │ │❯ 106  st = stacktrace() │ │ │ -│ │ │ 107  ctx = StacktraceCont... │ │ │ -│ │ │ 108  bt = render_backtrac... │ │ │ -│ │ ╰───────────── error line ──────────────╯ │ │ -│ ╰──────────────────────────────────────────── ERROR LINE ───╯ │ -│ │ -╰──── Error Stack ─────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/backtrace_2.txt b/test/txtfiles/backtrace_2.txt deleted file mode 100644 index f2be0b1e1..000000000 --- a/test/txtfiles/backtrace_2.txt +++ /dev/null @@ -1,86 +0,0 @@ -╭──── Error Stack ─────────────────────────────────────────────────────────────╮ -│ │ -│ ──────────────────────────── In module Base ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ (1) │ _start() │ │ -│ ╰───────────────────────────────────────────── TOP LEVEL ───╯ │ -│ │ -│ (2) exec_options(opts::Base.JLOptions) │ -│ │ -│ (3) eval │ -│ inlined │ -│ │ -│ (4) top-level scope │ -│ │ -│ (5) include(fname::String) │ -│ │ -│ (6) _include(mapexpr::Function, mod::Module, _path::S │ -│ tring) │ -│ │ -│ (7) include_string(mapexpr::typeof(identity), mod::Mo │ -│ dule, code::String, filename::String) │ -│ │ -│ (8) eval │ -│ inlined │ -│ │ -│ top-level scope │ -│ (9) │ ╭────────────────────────────────╮ │ -│ ╰─│❯ 32 @time @timeit_include($fn) │ │ -│ ╰────────────────────────────────╯ │ -│ │ -│ (10) macro expansion │ -│ inlined │ -│ │ -│ macro expansion │ -│ inlined │ -│ (11) │ ╭──────────────────────────╮ │ -│ ╰─│❯ 237 $(Expr(:tryfinally, │ │ -│ ╰──────────────────────────╯ │ -│ │ -│ (12) include │ -│ inlined │ -│ │ -│ (13) _include(mapexpr::Function, mod::Module, _path::S │ -│ tring) │ -│ │ -│ (14) include_string(mapexpr::typeof(identity), mod::Mo │ -│ dule, code::String, filename::String) │ -│ │ -│ (15) eval │ -│ inlined │ -│ │ -│ top-level scope │ -│ (16) │ ╭─────────────────╮ │ -│ ╰─│❯ 103 f2(x) = 2x │ │ -│ ╰─────────────────╯ │ -│ │ -│ (17) macro expansion │ -│ inlined │ -│ │ -│ macro expansion │ -│ inlined │ -│ (18) │ ╭──────────────────────────────────────╮ │ -│ ╰─│❯ 113 bt2 = f0(f2(f1(2)); hide_fra... │ │ -│ ╰──────────────────────────────────────╯ │ -│ │ -│ ──────────────────────────── In module Main ──────────────────────────── │ -│ │ -│ f0#22(x::Int64; hide_frames::Bool) │ -│ (19) │ ╭───────────────────────────────╮ │ -│ ╰─│❯ 105 f0(x; kwargs...) = begin │ │ -│ ╰───────────────────────────────╯ │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ │ f0 │ │ -│ │ inlined │ │ -│ │ │ ╭───────────────────────────────────────╮ │ │ -│ │ ╰─│ 104  f1(x) = 3x │ │ │ -│ (20) │ │ 105  f0(x; kwargs...) = begin │ │ │ -│ │ │❯ 106  st = stacktrace() │ │ │ -│ │ │ 107  ctx = StacktraceCont... │ │ │ -│ │ │ 108  bt = render_backtrac... │ │ │ -│ │ ╰───────────── error line ──────────────╯ │ │ -│ ╰──────────────────────────────────────────── ERROR LINE ───╯ │ -│ │ -╰──── Error Stack ─────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_titile_panel_7.txt b/test/txtfiles/centered_titile_panel_7.txt index 390bdcaf6..c597051e6 100644 --- a/test/txtfiles/centered_titile_panel_7.txt +++ b/test/txtfiles/centered_titile_panel_7.txt @@ -1,3 +1,3 @@ -╭──── test ──────────╮ -│ │ -╰────────── aaaaa ───╯ \ No newline at end of file +╭──── test ──────────╮ +│ │ +╰────────── aaaaa ───╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_1.txt b/test/txtfiles/centered_title_panel_1.txt index 184129a56..e4e23bfa6 100644 --- a/test/txtfiles/centered_title_panel_1.txt +++ b/test/txtfiles/centered_title_panel_1.txt @@ -1,3 +1,3 @@ -╭──── test ────────────────────────────╮ -│ │ +╭──── test ────────────────────────────╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_2.txt b/test/txtfiles/centered_title_panel_2.txt index 08ef96817..37c9d242d 100644 --- a/test/txtfiles/centered_title_panel_2.txt +++ b/test/txtfiles/centered_title_panel_2.txt @@ -1,3 +1,3 @@ -╭──────────────── test ────────────────╮ -│ │ +╭──────────────── test ────────────────╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_3.txt b/test/txtfiles/centered_title_panel_3.txt index f978c5c40..1ccb25f60 100644 --- a/test/txtfiles/centered_title_panel_3.txt +++ b/test/txtfiles/centered_title_panel_3.txt @@ -1,3 +1,3 @@ -╭───────────────────────────── test ───╮ -│ │ +╭───────────────────────────── test ───╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_4.txt b/test/txtfiles/centered_title_panel_4.txt index 0d1aab507..939539b05 100644 --- a/test/txtfiles/centered_title_panel_4.txt +++ b/test/txtfiles/centered_title_panel_4.txt @@ -1,3 +1,3 @@ -╭──── test ──────────────────────────────────────╮ -│ │ +╭──── test ──────────────────────────────────────╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_5.txt b/test/txtfiles/centered_title_panel_5.txt index 651d030d3..379171d99 100644 --- a/test/txtfiles/centered_title_panel_5.txt +++ b/test/txtfiles/centered_title_panel_5.txt @@ -1,3 +1,3 @@ -╭───────────────────── test ─────────────────────╮ -│ │ +╭───────────────────── test ─────────────────────╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_6.txt b/test/txtfiles/centered_title_panel_6.txt index aef3181f7..f25e170e5 100644 --- a/test/txtfiles/centered_title_panel_6.txt +++ b/test/txtfiles/centered_title_panel_6.txt @@ -1,3 +1,3 @@ -╭─────────────────────────────────────── test ───╮ -│ │ +╭─────────────────────────────────────── test ───╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/compositor_2.txt b/test/txtfiles/compositor_2.txt index 96ed9c9c9..00826e844 100644 --- a/test/txtfiles/compositor_2.txt +++ b/test/txtfiles/compositor_2.txt @@ -1,16 +1,16 @@ ╲ ╲ ╲ ╲ ╲ ╲ ╭──────────╮ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │  ╲ ╲ ╲ ╲ ╲ ╲╰──────────╯ ╲ ╲ ╲ ╲ ╲ ╲   ╲ ╲ ╲ ╲ ╲ ╲ diff --git a/test/txtfiles/compositor_4.txt b/test/txtfiles/compositor_4.txt index 07f89c5d2..3f2ac7ef7 100644 --- a/test/txtfiles/compositor_4.txt +++ b/test/txtfiles/compositor_4.txt @@ -1,32 +1,32 @@ ╭──────────────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ ╰──────────────────╯ ╭──────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ ╰──────────╯ diff --git a/test/txtfiles/exptree_expr_1.txt b/test/txtfiles/exptree_expr_1.txt index 9de3aa7f4..2b5e347a2 100644 --- a/test/txtfiles/exptree_expr_1.txt +++ b/test/txtfiles/exptree_expr_1.txt @@ -1,15 +1,16 @@ -╭─────────────────────────────────── 2x+3y+2 ──────────────────────────────────╮ -│ │ -│ 2x+3y+2 │ -│ ━━━━━━━━━ │ -│ │  │ -│ └── 2x+3y+2 (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  ├── 3y (call: *) │ -│  │ ├── 3 │ -│  │ └── y │ -│  └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭─────────────────────────────────── 2x+3y+2 ──────────────────────────────────╮ +│ │ +│ 2x + 3y + 2 │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ ├─ 3 ⇒ 3y │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 3 │ +│ │ └─ 3 ⇒ y │ +│ └─ 4 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_2.txt b/test/txtfiles/exptree_expr_2.txt index 760d5c1da..d9137f926 100644 --- a/test/txtfiles/exptree_expr_2.txt +++ b/test/txtfiles/exptree_expr_2.txt @@ -1,16 +1,17 @@ -╭────────────────────────────────── 2x+3+2+2y ─────────────────────────────────╮ -│ │ -│ 2x+3+2+2y │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── 2x+3+2+2y (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  ├── 3 │ -│  ├── 2 │ -│  └── 2y (call: *) │ -│   ├── 2 │ -│   └── y │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── 2x+3+2+2y ─────────────────────────────────╮ +│ │ +│ 2x + 3 + 2 + 2y │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ ├─ 3 ⇒ 3 │ +│ ├─ 4 ⇒ 2 │ +│ └─ 5 ⇒ 2y │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ y │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_3.txt b/test/txtfiles/exptree_expr_3.txt index 74ca21121..7f10218df 100644 --- a/test/txtfiles/exptree_expr_3.txt +++ b/test/txtfiles/exptree_expr_3.txt @@ -1,14 +1,15 @@ -╭────────────────────────────────── 2*x^(3+y) ─────────────────────────────────╮ -│ │ -│ 2*x^(3+y) │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── 2*x^(3+y) (call: *) │ -│  ├── 2 │ -│  └── x^(3+y) (call: ^) │ -│   ├── x │ -│   └── 3+y (call: +) │ -│    ├── 3 │ -│    └── y │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── 2*x^(3+y) ─────────────────────────────────╮ +│ │ +│ 2 * x ^ (3 + y) │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ x ^ (3 + y) │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 3 + y │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ y │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_4.txt b/test/txtfiles/exptree_expr_4.txt index ccfa1cec6..044b0f375 100644 --- a/test/txtfiles/exptree_expr_4.txt +++ b/test/txtfiles/exptree_expr_4.txt @@ -1,16 +1,18 @@ -╭───────────────────────────────── (1+1)-2*x^2 ────────────────────────────────╮ -│ │ -│ (1+1)-2*x^2 │ -│ ━━━━━━━━━━━━━ │ -│ │  │ -│ └── (1+1)-2*x^2 (call: -) │ -│  ├── 1+1 (call: +) │ -│  │ ├── 1 │ -│  │ └── 1 │ -│  └── 2*x^2 (call: *) │ -│   ├── 2 │ -│   └── x^2 (call: ^) │ -│    ├── x │ -│    └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭───────────────────────────────── (1+1)-2*x^2 ────────────────────────────────╮ +│ │ +│ (1 + 1) - 2 * x ^ 2 │ +│ ├─ 1 ⇒ - │ +│ ├─ 2 ⇒ 1 + 1 │ +│ │ ├─ 1 ⇒ + │ +│ │ ├─ 2 ⇒ 1 │ +│ │ └─ 3 ⇒ 1 │ +│ └─ 3 ⇒ 2 * x ^ 2 │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ x ^ 2 │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_5.txt b/test/txtfiles/exptree_expr_5.txt index 10518fe74..23f2aeadb 100644 --- a/test/txtfiles/exptree_expr_5.txt +++ b/test/txtfiles/exptree_expr_5.txt @@ -1,10 +1,9 @@ -╭────────────────────────────────── mod(22,6) ─────────────────────────────────╮ -│ │ -│ mod(22,6) │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── mod(22,6) (call: mod) │ -│  ├── 22 │ -│  └── 6 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── mod(22,6) ─────────────────────────────────╮ +│ │ +│ mod(22, 6) │ +│ ├─ 1 ⇒ mod │ +│ ├─ 2 ⇒ 22 │ +│ └─ 3 ⇒ 6 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_6.txt b/test/txtfiles/exptree_expr_6.txt index ef8e6012e..556f8f35a 100644 --- a/test/txtfiles/exptree_expr_6.txt +++ b/test/txtfiles/exptree_expr_6.txt @@ -1,18 +1,21 @@ -╭──────────────────────────────── 2*x^(3+y)+2z ────────────────────────────────╮ -│ │ -│ 2*x^(3+y)+2z │ -│ ━━━━━━━━━━━━━━ │ -│ │  │ -│ └── 2*x^(3+y)+2z (call: +) │ -│  ├── 2*x^(3+y) (call: *) │ -│  │ ├── 2 │ -│  │ └── x^(3+y) (call: ^) │ -│  │  ├── x │ -│  │  └── 3+y (call: +) │ -│  │   ├── 3 │ -│  │   └── y │ -│  └── 2z (call: *) │ -│   ├── 2 │ -│   └── z │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────────── 2*x^(3+y)+2z ────────────────────────────────╮ +│ │ +│ 2 * x ^ (3 + y) + 2z │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2 * x ^ (3 + y) │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x ^ (3 + y) │ +│ │ ├─ 1 ⇒ ^ │ +│ │ ├─ 2 ⇒ x │ +│ │ └─ 3 ⇒ 3 + y │ +│ │ ├─ 1 ⇒ + │ +│ │ ├─ 2 ⇒ 3 │ +│ │ └─ 3 ⇒ y │ +│ └─ 3 ⇒ 2z │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ z │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_7.txt b/test/txtfiles/exptree_expr_7.txt index c20133378..2036df5b4 100644 --- a/test/txtfiles/exptree_expr_7.txt +++ b/test/txtfiles/exptree_expr_7.txt @@ -1,19 +1,23 @@ -╭──────────────────────────────── 2x+3*√(3*x^2) ───────────────────────────────╮ -│ │ -│ 2x+3*√(3*x^2) │ -│ ━━━━━━━━━━━━━━━ │ -│ │  │ -│ └── 2x+3*√(3*x^2) (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  └── 3*√(3*x^2) (call: *) │ -│   ├── 3 │ -│   └── √(3*x^2) (call: √) │ -│    └── 3*x^2 (call: *) │ -│     ├── 3 │ -│     └── x^2 (call: ^) │ -│      ├── x │ -│      └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────────── 2x+3*√(3*x^2) ───────────────────────────────╮ +│ │ +│ 2x + 3 * √(3 * x ^ 2) │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ └─ 3 ⇒ 3 * √(3 * x ^ 2) │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ √(3 * x ^ 2) │ +│ ├─ 1 ⇒ √ │ +│ └─ 2 ⇒ 3 * x ^ 2 │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ x ^ 2 │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_8.txt b/test/txtfiles/exptree_expr_8.txt index 19c496813..49476be5a 100644 --- a/test/txtfiles/exptree_expr_8.txt +++ b/test/txtfiles/exptree_expr_8.txt @@ -1,10 +1,10 @@ -╭──────────────────────────── print(lstrip("test")) ───────────────────────────╮ -│ │ -│ print(lstrip("test")) │ -│ ━━━━━━━━━━━━━━━━━━━━━━━ │ -│ │  │ -│ └── print(lstrip("test")) (call: print) │ -│  └── lstrip("test") (call: lstrip) │ -│   └── test │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────── print(lstrip("test")) ───────────────────────────╮ +│ │ +│ print(lstrip("test")) │ +│ ├─ 1 ⇒ print │ +│ └─ 2 ⇒ lstrip("test") │ +│ ├─ 1 ⇒ lstrip │ +│ └─ 2 ⇒ test │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/link_panel_1_1_1.txt b/test/txtfiles/link_panel_1_1_1.txt index 5d8d4568b..287daae9a 100644 --- a/test/txtfiles/link_panel_1_1_1.txt +++ b/test/txtfiles/link_panel_1_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰─────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_2.txt b/test/txtfiles/link_panel_1_1_2.txt index 83581faad..bcaddf598 100644 --- a/test/txtfiles/link_panel_1_1_2.txt +++ b/test/txtfiles/link_panel_1_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ abcd │ ╰─────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_3.txt b/test/txtfiles/link_panel_1_1_3.txt index 7273b73a8..ab3d10a0d 100644 --- a/test/txtfiles/link_panel_1_1_3.txt +++ b/test/txtfiles/link_panel_1_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_4.txt b/test/txtfiles/link_panel_1_1_4.txt index 8b73ae572..6ac2545bf 100644 --- a/test/txtfiles/link_panel_1_1_4.txt +++ b/test/txtfiles/link_panel_1_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_5.txt b/test/txtfiles/link_panel_1_1_5.txt index 952079ec0..914b0e99e 100644 --- a/test/txtfiles/link_panel_1_1_5.txt +++ b/test/txtfiles/link_panel_1_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_1.txt b/test/txtfiles/link_panel_1_2_1.txt index 54ffcbd7a..96a700620 100644 --- a/test/txtfiles/link_panel_1_2_1.txt +++ b/test/txtfiles/link_panel_1_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_2.txt b/test/txtfiles/link_panel_1_2_2.txt index 69804995b..8d6421869 100644 --- a/test/txtfiles/link_panel_1_2_2.txt +++ b/test/txtfiles/link_panel_1_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_3.txt b/test/txtfiles/link_panel_1_2_3.txt index 09fc9f8f0..6d42ae7c9 100644 --- a/test/txtfiles/link_panel_1_2_3.txt +++ b/test/txtfiles/link_panel_1_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_4.txt b/test/txtfiles/link_panel_1_2_4.txt index 8b73ae572..6ac2545bf 100644 --- a/test/txtfiles/link_panel_1_2_4.txt +++ b/test/txtfiles/link_panel_1_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_5.txt b/test/txtfiles/link_panel_1_2_5.txt index 4c8561368..fbc0109ab 100644 --- a/test/txtfiles/link_panel_1_2_5.txt +++ b/test/txtfiles/link_panel_1_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_1.txt b/test/txtfiles/link_panel_2_1_1.txt index 028e1683b..695d054b0 100644 --- a/test/txtfiles/link_panel_2_1_1.txt +++ b/test/txtfiles/link_panel_2_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_2.txt b/test/txtfiles/link_panel_2_1_2.txt index b63b93b07..af1b3d71d 100644 --- a/test/txtfiles/link_panel_2_1_2.txt +++ b/test/txtfiles/link_panel_2_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_3.txt b/test/txtfiles/link_panel_2_1_3.txt index b6b3785de..7dabf3024 100644 --- a/test/txtfiles/link_panel_2_1_3.txt +++ b/test/txtfiles/link_panel_2_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰─────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_4.txt b/test/txtfiles/link_panel_2_1_4.txt index 0fc0cc462..40b283a71 100644 --- a/test/txtfiles/link_panel_2_1_4.txt +++ b/test/txtfiles/link_panel_2_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_5.txt b/test/txtfiles/link_panel_2_1_5.txt index 0f23f3d6f..0368aefee 100644 --- a/test/txtfiles/link_panel_2_1_5.txt +++ b/test/txtfiles/link_panel_2_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_1.txt b/test/txtfiles/link_panel_2_2_1.txt index ec5f960d2..18c4b3a89 100644 --- a/test/txtfiles/link_panel_2_2_1.txt +++ b/test/txtfiles/link_panel_2_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_2.txt b/test/txtfiles/link_panel_2_2_2.txt index 8acee6bc0..d21f761fa 100644 --- a/test/txtfiles/link_panel_2_2_2.txt +++ b/test/txtfiles/link_panel_2_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_3.txt b/test/txtfiles/link_panel_2_2_3.txt index d7b845526..5284f2b2f 100644 --- a/test/txtfiles/link_panel_2_2_3.txt +++ b/test/txtfiles/link_panel_2_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_4.txt b/test/txtfiles/link_panel_2_2_4.txt index 0fc0cc462..40b283a71 100644 --- a/test/txtfiles/link_panel_2_2_4.txt +++ b/test/txtfiles/link_panel_2_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_5.txt b/test/txtfiles/link_panel_2_2_5.txt index 2d6fc5cd9..72510730d 100644 --- a/test/txtfiles/link_panel_2_2_5.txt +++ b/test/txtfiles/link_panel_2_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_1.txt b/test/txtfiles/link_panel_3_1_1.txt index 00d39cf4b..f0847444c 100644 --- a/test/txtfiles/link_panel_3_1_1.txt +++ b/test/txtfiles/link_panel_3_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_2.txt b/test/txtfiles/link_panel_3_1_2.txt index cc3250f63..56e45f7cb 100644 --- a/test/txtfiles/link_panel_3_1_2.txt +++ b/test/txtfiles/link_panel_3_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_3.txt b/test/txtfiles/link_panel_3_1_3.txt index 07a5c6289..2643a31f2 100644 --- a/test/txtfiles/link_panel_3_1_3.txt +++ b/test/txtfiles/link_panel_3_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰─────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_4.txt b/test/txtfiles/link_panel_3_1_4.txt index 35ba9093c..da77d0d9c 100644 --- a/test/txtfiles/link_panel_3_1_4.txt +++ b/test/txtfiles/link_panel_3_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_5.txt b/test/txtfiles/link_panel_3_1_5.txt index ebaf0da5c..0c8f1d100 100644 --- a/test/txtfiles/link_panel_3_1_5.txt +++ b/test/txtfiles/link_panel_3_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_1.txt b/test/txtfiles/link_panel_3_2_1.txt index 15d556534..95e9da211 100644 --- a/test/txtfiles/link_panel_3_2_1.txt +++ b/test/txtfiles/link_panel_3_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_2.txt b/test/txtfiles/link_panel_3_2_2.txt index 503665b0a..4b22d8615 100644 --- a/test/txtfiles/link_panel_3_2_2.txt +++ b/test/txtfiles/link_panel_3_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_3.txt b/test/txtfiles/link_panel_3_2_3.txt index d4d2c07bd..df6a840b9 100644 --- a/test/txtfiles/link_panel_3_2_3.txt +++ b/test/txtfiles/link_panel_3_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_4.txt b/test/txtfiles/link_panel_3_2_4.txt index 35ba9093c..da77d0d9c 100644 --- a/test/txtfiles/link_panel_3_2_4.txt +++ b/test/txtfiles/link_panel_3_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_5.txt b/test/txtfiles/link_panel_3_2_5.txt index d6c64be16..86471b644 100644 --- a/test/txtfiles/link_panel_3_2_5.txt +++ b/test/txtfiles/link_panel_3_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/markdown_2.txt b/test/txtfiles/markdown_2.txt index 78ac30592..93f820381 100644 --- a/test/txtfiles/markdown_2.txt +++ b/test/txtfiles/markdown_2.txt @@ -1,5 +1,5 @@ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Markdown rendering in Term.jl ┃ +┃ Markdown rendering in Term.jl ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ {bold #42A5F5 underline}twp{/bold #42A5F5 underline} diff --git a/test/txtfiles/markdown_3.txt b/test/txtfiles/markdown_3.txt index 9b4f1e557..20eec8e95 100644 --- a/test/txtfiles/markdown_3.txt +++ b/test/txtfiles/markdown_3.txt @@ -14,11 +14,11 @@ and footnotes {#9aacdb}[1]{/#9aacdb} for your content {#9aacdb}[named]{/#9aacdb} And, of course, you can show some code too: - ┌──────────────────────────────────────────────┐ - │ function say_hi(x)  │ - │  print("Hellow World")  │ - │ end  │ - └──────────────────────────────────── julia ───┘ + ┌──────────────────────────────────────────────┐ + │ function say_hi(x)  │ + │  print("Hellow World")  │ + │ end  │ + └──────────────────────────────────── julia ───┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -32,22 +32,22 @@ You can use "quotes" to highlight a section: but if you really need to grab someone's attention, use admonitions: - ╭──── Note ────────────────────────────────────────╮ - │ You can use different levels │ + ╭──── Note ────────────────────────────────────────╮ + │ You can use different levels │ ╰──────────────────────────────────────────────────╯ - ╭──── Warning ─────────────────────────────────────╮ - │ to send different messages │ + ╭──── Warning ─────────────────────────────────────╮ + │ to send different messages │ ╰──────────────────────────────────────────────────╯ - ╭──── Danger ──────────────────────────────────────╮ - │ to your reader │ + ╭──── Danger ──────────────────────────────────────╮ + │ to your reader │ ╰──────────────────────────────────────────────────╯ - ╭──── Wow! ────────────────────────────────────────╮ - │ Turns out that admonitions can be pretty │ - │ useful! │ - │ What will you use them for? │ + ╭──── Wow! ────────────────────────────────────────╮ + │ Turns out that admonitions can be pretty │ + │ useful! │ + │ What will you use them for? │ ╰──────────────────────────────────────────────────╯ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -69,12 +69,12 @@ and ordered lists too: {bold} 3. {/bold}item three - ╭──── Tables ──────────────────────────────────────╮ - │ You can use the Markdown table syntax (https: │ - │ //www │ - │ .markdownguide.org/extended-sy │ - │ ntax/#tables) to insert tables - Term.jl will │ - │ convert them to Table object! │ + ╭──── Tables ──────────────────────────────────────╮ + │ You can use the Markdown table syntax (https: │ + │ //www │ + │ .markdownguide.org/extended-sy │ + │ ntax/#tables) to insert tables - Term.jl will │ + │ convert them to Table object! │ ╰──────────────────────────────────────────────────╯ ╭───────────┬──────────────┬────────────╮ diff --git a/test/txtfiles/mts_repr.txt b/test/txtfiles/mts_repr.txt new file mode 100644 index 000000000..e9c684bfb --- /dev/null +++ b/test/txtfiles/mts_repr.txt @@ -0,0 +1,10 @@ +╭─────────────────────────────────────────────────────────────╮ +│  x::String  aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa...   │ +│  y::Array   [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0...   │ +│  z::Int64   3   │ +│    ╭─────────────────────────────────────────...  │ +│  a::Panel  │...   │ +│    ╰─────────────────────────────────────────...  │ +│  c::String  b b bb b bb b bb b bb b bb b bb b bb...   │ +│   │ +╰─────────────────────────────────────────── MyTestStruct3 ───╯ diff --git a/test/txtfiles/panels_constructors_1.txt b/test/txtfiles/panels_constructors_1.txt index 144a96535..0f7f18334 100644 --- a/test/txtfiles/panels_constructors_1.txt +++ b/test/txtfiles/panels_constructors_1.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭───╮ │ -│ │ │ │ -│ ╰───╯ │ -│ ╭──────╮ │ -│ │ │ │ -│ ╰──────╯ │ +│ ╭───╮ │ +│ │ │ │ +│ ╰───╯ │ +│ ╭──────╮ │ +│ │ │ │ +│ ╰──────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_constructors_2.txt b/test/txtfiles/panels_constructors_2.txt index 144a96535..0f7f18334 100644 --- a/test/txtfiles/panels_constructors_2.txt +++ b/test/txtfiles/panels_constructors_2.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭───╮ │ -│ │ │ │ -│ ╰───╯ │ -│ ╭──────╮ │ -│ │ │ │ -│ ╰──────╯ │ +│ ╭───╮ │ +│ │ │ │ +│ ╰───╯ │ +│ ╭──────╮ │ +│ │ │ │ +│ ╰──────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro.txt b/test/txtfiles/panels_layout_macro.txt index a3c679943..26aca855d 100644 --- a/test/txtfiles/panels_layout_macro.txt +++ b/test/txtfiles/panels_layout_macro.txt @@ -1,20 +1,20 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ inner │ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ out │ │ │ -│ │ │ ╭────────────────────────────────────────────────────────────╮ │ │ │ -│ │ │ │ deep │ │ │ │ -│ │ │ ╰────────────────────────────────────────────────────────────╯ │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ test │ -│ adasdasda │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│  ... content omitted ...  │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ inner │ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ out │ │ │ +│ │ │ ╭────────────────────────────────────────────────────────────╮ │ │ │ +│ │ │ │ deep │ │ │ │ +│ │ │ ╰────────────────────────────────────────────────────────────╯ │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ test │ +│ adasdasda │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│  ... content omitted ...  │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro2.txt b/test/txtfiles/panels_layout_macro2.txt index ca8d029e9..4417cf28f 100644 --- a/test/txtfiles/panels_layout_macro2.txt +++ b/test/txtfiles/panels_layout_macro2.txt @@ -1,20 +1,20 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ red │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ done │ -│ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ red │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ done │ +│ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro3.txt b/test/txtfiles/panels_layout_macro3.txt index 273952ab7..6eadef609 100644 --- a/test/txtfiles/panels_layout_macro3.txt +++ b/test/txtfiles/panels_layout_macro3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ │ +│ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro4.txt b/test/txtfiles/panels_layout_macro4.txt index 2763250bc..506c830e7 100644 --- a/test/txtfiles/panels_layout_macro4.txt +++ b/test/txtfiles/panels_layout_macro4.txt @@ -1,5 +1,5 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro5.txt b/test/txtfiles/panels_layout_macro5.txt index d9e2ab4e0..ecb0a8f43 100644 --- a/test/txtfiles/panels_layout_macro5.txt +++ b/test/txtfiles/panels_layout_macro5.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ a │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ b │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ a │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ b │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro6.txt b/test/txtfiles/panels_layout_macro6.txt index 6388f9736..1c3f7e631 100644 --- a/test/txtfiles/panels_layout_macro6.txt +++ b/test/txtfiles/panels_layout_macro6.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ a │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ b │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ a │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ b │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/rend_text_shape_i.txt b/test/txtfiles/rend_text_shape_i.txt deleted file mode 100644 index 832b0987d..000000000 --- a/test/txtfiles/rend_text_shape_i.txt +++ /dev/null @@ -1,8 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit, -sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua. Ut enim ad minim veniam, quis nostrud exercitation -ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit -esse cillum dolore eu fugiat nulla pariatur. Excepteur -sint occaecat cupidatat non proident, sunt in culpa qui -officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/test/txtfiles/repr_T_struct.txt b/test/txtfiles/repr_T_struct.txt index 2c5f3f344..0b17f7736 100644 --- a/test/txtfiles/repr_T_struct.txt +++ b/test/txtfiles/repr_T_struct.txt @@ -1,3 +1,3 @@ ╭──────────╮ -│ T()::T │ -╰──── T ───╯ +│ T()::T │ +╰──── T ───╯ diff --git a/test/txtfiles/repr_rocket.txt b/test/txtfiles/repr_rocket.txt index 745f453e4..bbe136fff 100644 --- a/test/txtfiles/repr_rocket.txt +++ b/test/txtfiles/repr_rocket.txt @@ -1,6 +1,7 @@ -╭────────────────────────────────╮ -│ width::Int64│ 10 │ -│ height::Int64│ 50 │ -│ mass::Float64│ 5000.0 │ -│ manufacturer::String│ NASA │ -╰───────────────────── Rocket ───╯ +╭─────────────────────────────────╮ +│   width::Int64   10   │ +│   height::Int64   50   │ +│   mass::Float64  5000.0  │ +│  manufacturer::String  NASA   │ +│   │ +╰────────────────────── Rocket ───╯ diff --git a/test/txtfiles/repr_rocket_2.txt b/test/txtfiles/repr_rocket_2.txt index 567d576fd..ae4fbd500 100644 --- a/test/txtfiles/repr_rocket_2.txt +++ b/test/txtfiles/repr_rocket_2.txt @@ -1,6 +1,7 @@ -╭─────────────────────────────╮ -│ width::Int64│ 1 │ -│ height::Int64│ 1 │ -│ mass::Float64│ 1.0 │ -│ manufacturer::String│ me │ -╰───────────────── Rocket2 ───╯ +╭──────────────────────────────╮ +│   width::Int64   1   │ +│   height::Int64   1   │ +│   mass::Float64  1.0  │ +│  manufacturer::String me   │ +│   │ +╰────────────────── Rocket2 ───╯ diff --git a/test/txtfiles/repr_rocket_2_show.txt b/test/txtfiles/repr_rocket_2_show.txt index 6a3e87486..41fc5c421 100644 --- a/test/txtfiles/repr_rocket_2_show.txt +++ b/test/txtfiles/repr_rocket_2_show.txt @@ -1,11 +1,11 @@ ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Rocket2 <: Any │ - │ │ width ::Int64 │ - │ │ height ::Int64 │ - │ │ mass ::Float64 │ - │ │manufacturer ::String │ - │ │ + │ │ + │ Rocket2 <: Any │ + │ │ width ::Int64 │ + │ │ height ::Int64 │ + │ │ mass ::Float64 │ + │ │manufacturer ::String │ + │ │ ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ docs \ No newline at end of file diff --git a/test/txtfiles/repr_rocket_struct.txt b/test/txtfiles/repr_rocket_struct.txt index e0d51f8eb..2c10eb827 100644 --- a/test/txtfiles/repr_rocket_struct.txt +++ b/test/txtfiles/repr_rocket_struct.txt @@ -1,30 +1,30 @@ ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Rocket <: Any │ - │ │ width ::Int64 │ - │ │ height ::Int64 │ - │ │ mass ::Float64 │ - │ │manufacturer ::String │ - │ │ + │ │ + │ Rocket <: Any │ + │ │ width ::Int64 │ + │ │ height ::Int64 │ + │ │ mass ::Float64 │ + │ │manufacturer ::String │ + │ │ ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ No documentation found. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Summary ┃ +┃ Summary ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ┌──────────────────────────────────────────────────────────────────┐ - │ struct Rocket  │ - └──────────────────────────────────────────────────────────────────┘ + ┌──────────────────────────────────────────────────────────────────┐ + │ struct Rocket  │ + └──────────────────────────────────────────────────────────────────┘ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Fields ┃ +┃ Fields ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ┌──────────────────────────────────────────────────────────────────┐ - │ width :: Int64  │ - │ height :: Int64  │ - │ mass :: Float64  │ - │ manufacturer :: String  │ - └──────────────────────────────────────────────────────────────────┘ \ No newline at end of file + ┌──────────────────────────────────────────────────────────────────┐ + │ width :: Int64  │ + │ height :: Int64  │ + │ mass :: Float64  │ + │ manufacturer :: String  │ + └──────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_1.txt b/test/txtfiles/reshaped_rend_with_markup_1.txt index 2b2772594..210237ad4 100644 --- a/test/txtfiles/reshaped_rend_with_markup_1.txt +++ b/test/txtfiles/reshaped_rend_with_markup_1.txt @@ -1,7 +1,7 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_2.txt b/test/txtfiles/reshaped_rend_with_markup_2.txt index 2b2772594..210237ad4 100644 --- a/test/txtfiles/reshaped_rend_with_markup_2.txt +++ b/test/txtfiles/reshaped_rend_with_markup_2.txt @@ -1,7 +1,7 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_3.txt b/test/txtfiles/reshaped_rend_with_markup_3.txt index 9fe460c93..27fb7e3b0 100644 --- a/test/txtfiles/reshaped_rend_with_markup_3.txt +++ b/test/txtfiles/reshaped_rend_with_markup_3.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_4.txt b/test/txtfiles/reshaped_rend_with_markup_4.txt index 9fe460c93..27fb7e3b0 100644 --- a/test/txtfiles/reshaped_rend_with_markup_4.txt +++ b/test/txtfiles/reshaped_rend_with_markup_4.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_5.txt b/test/txtfiles/reshaped_rend_with_markup_5.txt index 751eb908f..8cd71405f 100644 --- a/test/txtfiles/reshaped_rend_with_markup_5.txt +++ b/test/txtfiles/reshaped_rend_with_markup_5.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_6.txt b/test/txtfiles/reshaped_rend_with_markup_6.txt index 751eb908f..8cd71405f 100644 --- a/test/txtfiles/reshaped_rend_with_markup_6.txt +++ b/test/txtfiles/reshaped_rend_with_markup_6.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_16.txt b/test/txtfiles/reshaped_text_16.txt deleted file mode 100644 index d7a13229b..000000000 --- a/test/txtfiles/reshaped_text_16.txt +++ /dev/null @@ -1,18 +0,0 @@ -Lorem ipsum {bold}dolor sit{/bold} amet, -consectetur adipiscing elit, -ed do e{red}iusmod tempor incididunt{/red} -ut {bold}labore et {underline}dolore{/underline} magna aliqua.{/bold} -{bold}{/bold} Ut enim ad minim -veniam, quis{green} nostrud exercitation{/green} -{green} {on_black}ullamco laboris nisi ut aliquip{/on_black}{/green} -{green}{on_black}ex {/on_black}{/green} -ea commodo consequat.{blue} Duis aute{/blue} -{blue}irure dolor in{/blue} reprehenderit - -in voluptate velit{/green} esse {italic}cillum{/italic} -{italic}dolore{/italic}{red} eu{/red}{italic green} fugiat {/italic green}nulla -pariatur. Excepteur{red} sint{/red}{blue} occaecat{/blue} -{blue} cupidatat {/blue}non proident, -sunt in culpa qui {italic}officia{/italic} deserun -t mollit anim -id est laborum. \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_17.txt b/test/txtfiles/reshaped_text_17.txt deleted file mode 100644 index 68c4a56e3..000000000 --- a/test/txtfiles/reshaped_text_17.txt +++ /dev/null @@ -1,15 +0,0 @@ -Term.jl is a {#9558B2}Julia{/#9558B2} package for -creating styled terminal outputs. - - -Term provides a simple {italic green4 bold}markup{/italic green4 bold} -{italic green4 bold}language{/italic green4 bold} to add {bold bright_blue}color{/bold bright_blue} and {bold underline}styles{/bold underline} -to your text. -More complicated text layout -can be created using {red}"Renderable"{/red} -{red}{/red} objects such -as {red}"Panel"{/red} and {red}"TextBox"{/red}. -These can also be nested and -stacked to create {italic pink3}fancy{/italic pink3} and -{underline}informative{/underline} terminal ouputs -for your Julia code \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_1.txt b/test/txtfiles/reshaped_text_markuo_1.txt deleted file mode 100644 index 107e4cc2f..000000000 --- a/test/txtfiles/reshaped_text_markuo_1.txt +++ /dev/null @@ -1,4 +0,0 @@ -{red}dasda asda dadasda{green}aadasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}adada ad{/red} -{red}{bold}as sad ad ada{/red}ad adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_2.txt b/test/txtfiles/reshaped_text_markuo_2.txt deleted file mode 100644 index 107e4cc2f..000000000 --- a/test/txtfiles/reshaped_text_markuo_2.txt +++ /dev/null @@ -1,4 +0,0 @@ -{red}dasda asda dadasda{green}aadasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}adada ad{/red} -{red}{bold}as sad ad ada{/red}ad adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_3.txt b/test/txtfiles/reshaped_text_markuo_3.txt deleted file mode 100644 index aa40a0310..000000000 --- a/test/txtfiles/reshaped_text_markuo_3.txt +++ /dev/null @@ -1,7 +0,0 @@ -{red}dasda asda dadasda{green}aa{/red} -{red}{green}dasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}ad{/red} -{red}{bold}ada ad{/red}{/bold} -{red}{bold}as sad ad ada{/red}ad{/bold} -{bold}adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1.txt b/test/txtfiles/single_widghet_app_1_1.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_help.txt b/test/txtfiles/single_widghet_app_1_1_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_nohelp.txt b/test/txtfiles/single_widghet_app_1_1_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_print.txt b/test/txtfiles/single_widghet_app_1_1_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_1_2.txt b/test/txtfiles/single_widghet_app_1_2.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_help.txt b/test/txtfiles/single_widghet_app_1_2_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_nohelp.txt b/test/txtfiles/single_widghet_app_1_2_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_print.txt b/test/txtfiles/single_widghet_app_1_2_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_2_1.txt b/test/txtfiles/single_widghet_app_2_1.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_help.txt b/test/txtfiles/single_widghet_app_2_1_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_nohelp.txt b/test/txtfiles/single_widghet_app_2_1_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_print.txt b/test/txtfiles/single_widghet_app_2_1_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_2_2.txt b/test/txtfiles/single_widghet_app_2_2.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_help.txt b/test/txtfiles/single_widghet_app_2_2_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_nohelp.txt b/test/txtfiles/single_widghet_app_2_2_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_print.txt b/test/txtfiles/single_widghet_app_2_2_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/small_panel_title_1_1_1.txt b/test/txtfiles/small_panel_title_1_1_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_1.txt +++ b/test/txtfiles/small_panel_title_1_1_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_1_2.txt b/test/txtfiles/small_panel_title_1_1_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_2.txt +++ b/test/txtfiles/small_panel_title_1_1_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_1_3.txt b/test/txtfiles/small_panel_title_1_1_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_3.txt +++ b/test/txtfiles/small_panel_title_1_1_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_1.txt b/test/txtfiles/small_panel_title_1_2_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_1.txt +++ b/test/txtfiles/small_panel_title_1_2_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_2.txt b/test/txtfiles/small_panel_title_1_2_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_2.txt +++ b/test/txtfiles/small_panel_title_1_2_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_3.txt b/test/txtfiles/small_panel_title_1_2_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_3.txt +++ b/test/txtfiles/small_panel_title_1_2_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_1.txt b/test/txtfiles/small_panel_title_1_3_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_1.txt +++ b/test/txtfiles/small_panel_title_1_3_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_2.txt b/test/txtfiles/small_panel_title_1_3_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_2.txt +++ b/test/txtfiles/small_panel_title_1_3_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_3.txt b/test/txtfiles/small_panel_title_1_3_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_3.txt +++ b/test/txtfiles/small_panel_title_1_3_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_1.txt b/test/txtfiles/small_panel_title_1_4_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_1.txt +++ b/test/txtfiles/small_panel_title_1_4_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_2.txt b/test/txtfiles/small_panel_title_1_4_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_2.txt +++ b/test/txtfiles/small_panel_title_1_4_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_3.txt b/test/txtfiles/small_panel_title_1_4_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_3.txt +++ b/test/txtfiles/small_panel_title_1_4_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_1.txt b/test/txtfiles/small_panel_title_2_1_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_1.txt +++ b/test/txtfiles/small_panel_title_2_1_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_2.txt b/test/txtfiles/small_panel_title_2_1_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_2.txt +++ b/test/txtfiles/small_panel_title_2_1_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_3.txt b/test/txtfiles/small_panel_title_2_1_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_3.txt +++ b/test/txtfiles/small_panel_title_2_1_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_1.txt b/test/txtfiles/small_panel_title_2_2_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_1.txt +++ b/test/txtfiles/small_panel_title_2_2_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_2.txt b/test/txtfiles/small_panel_title_2_2_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_2.txt +++ b/test/txtfiles/small_panel_title_2_2_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_3.txt b/test/txtfiles/small_panel_title_2_2_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_3.txt +++ b/test/txtfiles/small_panel_title_2_2_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_1.txt b/test/txtfiles/small_panel_title_2_3_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_1.txt +++ b/test/txtfiles/small_panel_title_2_3_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_2.txt b/test/txtfiles/small_panel_title_2_3_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_2.txt +++ b/test/txtfiles/small_panel_title_2_3_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_3.txt b/test/txtfiles/small_panel_title_2_3_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_3.txt +++ b/test/txtfiles/small_panel_title_2_3_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_1.txt b/test/txtfiles/small_panel_title_2_4_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_1.txt +++ b/test/txtfiles/small_panel_title_2_4_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_2.txt b/test/txtfiles/small_panel_title_2_4_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_2.txt +++ b/test/txtfiles/small_panel_title_2_4_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_3.txt b/test/txtfiles/small_panel_title_2_4_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_3.txt +++ b/test/txtfiles/small_panel_title_2_4_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_1.txt b/test/txtfiles/small_panel_title_3_1_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_1.txt +++ b/test/txtfiles/small_panel_title_3_1_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_2.txt b/test/txtfiles/small_panel_title_3_1_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_2.txt +++ b/test/txtfiles/small_panel_title_3_1_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_3.txt b/test/txtfiles/small_panel_title_3_1_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_3.txt +++ b/test/txtfiles/small_panel_title_3_1_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_1.txt b/test/txtfiles/small_panel_title_3_2_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_1.txt +++ b/test/txtfiles/small_panel_title_3_2_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_2.txt b/test/txtfiles/small_panel_title_3_2_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_2.txt +++ b/test/txtfiles/small_panel_title_3_2_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_3.txt b/test/txtfiles/small_panel_title_3_2_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_3.txt +++ b/test/txtfiles/small_panel_title_3_2_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_1.txt b/test/txtfiles/small_panel_title_3_3_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_1.txt +++ b/test/txtfiles/small_panel_title_3_3_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_2.txt b/test/txtfiles/small_panel_title_3_3_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_2.txt +++ b/test/txtfiles/small_panel_title_3_3_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_3.txt b/test/txtfiles/small_panel_title_3_3_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_3.txt +++ b/test/txtfiles/small_panel_title_3_3_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_1.txt b/test/txtfiles/small_panel_title_3_4_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_1.txt +++ b/test/txtfiles/small_panel_title_3_4_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_2.txt b/test/txtfiles/small_panel_title_3_4_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_2.txt +++ b/test/txtfiles/small_panel_title_3_4_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_3.txt b/test/txtfiles/small_panel_title_3_4_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_3.txt +++ b/test/txtfiles/small_panel_title_3_4_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_1.txt b/test/txtfiles/small_panel_title_4_1_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_1.txt +++ b/test/txtfiles/small_panel_title_4_1_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_2.txt b/test/txtfiles/small_panel_title_4_1_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_2.txt +++ b/test/txtfiles/small_panel_title_4_1_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_3.txt b/test/txtfiles/small_panel_title_4_1_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_3.txt +++ b/test/txtfiles/small_panel_title_4_1_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_1.txt b/test/txtfiles/small_panel_title_4_2_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_1.txt +++ b/test/txtfiles/small_panel_title_4_2_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_2.txt b/test/txtfiles/small_panel_title_4_2_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_2.txt +++ b/test/txtfiles/small_panel_title_4_2_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_3.txt b/test/txtfiles/small_panel_title_4_2_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_3.txt +++ b/test/txtfiles/small_panel_title_4_2_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_1.txt b/test/txtfiles/small_panel_title_4_3_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_1.txt +++ b/test/txtfiles/small_panel_title_4_3_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_2.txt b/test/txtfiles/small_panel_title_4_3_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_2.txt +++ b/test/txtfiles/small_panel_title_4_3_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_3.txt b/test/txtfiles/small_panel_title_4_3_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_3.txt +++ b/test/txtfiles/small_panel_title_4_3_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_1.txt b/test/txtfiles/small_panel_title_4_4_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_1.txt +++ b/test/txtfiles/small_panel_title_4_4_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_2.txt b/test/txtfiles/small_panel_title_4_4_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_2.txt +++ b/test/txtfiles/small_panel_title_4_4_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_3.txt b/test/txtfiles/small_panel_title_4_4_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_3.txt +++ b/test/txtfiles/small_panel_title_4_4_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_1.txt b/test/txtfiles/small_panel_title_5_1_1.txt index aaf5f3b92..fc1ecd853 100644 --- a/test/txtfiles/small_panel_title_5_1_1.txt +++ b/test/txtfiles/small_panel_title_5_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ──╮ -│ │ +╭──── aa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_2.txt b/test/txtfiles/small_panel_title_5_1_2.txt index afcf8fe20..bb5f70a0d 100644 --- a/test/txtfiles/small_panel_title_5_1_2.txt +++ b/test/txtfiles/small_panel_title_5_1_2.txt @@ -1,3 +1,3 @@ -╭─── aa ───╮ -│ │ +╭─── aa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_3.txt b/test/txtfiles/small_panel_title_5_1_3.txt index afcf8fe20..bb5f70a0d 100644 --- a/test/txtfiles/small_panel_title_5_1_3.txt +++ b/test/txtfiles/small_panel_title_5_1_3.txt @@ -1,3 +1,3 @@ -╭─── aa ───╮ -│ │ +╭─── aa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_1.txt b/test/txtfiles/small_panel_title_5_2_1.txt index d78bc80e4..1fa70aa7a 100644 --- a/test/txtfiles/small_panel_title_5_2_1.txt +++ b/test/txtfiles/small_panel_title_5_2_1.txt @@ -1,3 +1,3 @@ -╭── aaaa ──╮ -│ │ +╭── aaaa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_2.txt b/test/txtfiles/small_panel_title_5_2_2.txt index d78bc80e4..1fa70aa7a 100644 --- a/test/txtfiles/small_panel_title_5_2_2.txt +++ b/test/txtfiles/small_panel_title_5_2_2.txt @@ -1,3 +1,3 @@ -╭── aaaa ──╮ -│ │ +╭── aaaa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_3.txt b/test/txtfiles/small_panel_title_5_2_3.txt index 0a549bef7..acf8d2d08 100644 --- a/test/txtfiles/small_panel_title_5_2_3.txt +++ b/test/txtfiles/small_panel_title_5_2_3.txt @@ -1,3 +1,3 @@ -╭─ aaaa ───╮ -│ │ +╭─ aaaa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_1.txt b/test/txtfiles/small_panel_title_5_3_1.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_3_1.txt +++ b/test/txtfiles/small_panel_title_5_3_1.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_2.txt b/test/txtfiles/small_panel_title_5_3_2.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_3_2.txt +++ b/test/txtfiles/small_panel_title_5_3_2.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_3.txt b/test/txtfiles/small_panel_title_5_3_3.txt index 4217353e6..9066433de 100644 --- a/test/txtfiles/small_panel_title_5_3_3.txt +++ b/test/txtfiles/small_panel_title_5_3_3.txt @@ -1,3 +1,3 @@ -╭─ a... ───╮ -│ │ +╭─ a... ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_1.txt b/test/txtfiles/small_panel_title_5_4_1.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_4_1.txt +++ b/test/txtfiles/small_panel_title_5_4_1.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_2.txt b/test/txtfiles/small_panel_title_5_4_2.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_4_2.txt +++ b/test/txtfiles/small_panel_title_5_4_2.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_3.txt b/test/txtfiles/small_panel_title_5_4_3.txt index 4217353e6..9066433de 100644 --- a/test/txtfiles/small_panel_title_5_4_3.txt +++ b/test/txtfiles/small_panel_title_5_4_3.txt @@ -1,3 +1,3 @@ -╭─ a... ───╮ -│ │ +╭─ a... ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_1.txt b/test/txtfiles/small_panel_title_6_1_1.txt index 042ae5b9d..ddb201dbb 100644 --- a/test/txtfiles/small_panel_title_6_1_1.txt +++ b/test/txtfiles/small_panel_title_6_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ───╮ -│ │ +╭──── aa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_2.txt b/test/txtfiles/small_panel_title_6_1_2.txt index 3a38d6dc8..71142edce 100644 --- a/test/txtfiles/small_panel_title_6_1_2.txt +++ b/test/txtfiles/small_panel_title_6_1_2.txt @@ -1,3 +1,3 @@ -╭─── aa ────╮ -│ │ +╭─── aa ────╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_3.txt b/test/txtfiles/small_panel_title_6_1_3.txt index 042ae5b9d..ddb201dbb 100644 --- a/test/txtfiles/small_panel_title_6_1_3.txt +++ b/test/txtfiles/small_panel_title_6_1_3.txt @@ -1,3 +1,3 @@ -╭──── aa ───╮ -│ │ +╭──── aa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_1.txt b/test/txtfiles/small_panel_title_6_2_1.txt index f055e4166..492a741fd 100644 --- a/test/txtfiles/small_panel_title_6_2_1.txt +++ b/test/txtfiles/small_panel_title_6_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ─╮ -│ │ +╭──── aaaa ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_2.txt b/test/txtfiles/small_panel_title_6_2_2.txt index a842ff4f9..dbc99e0f8 100644 --- a/test/txtfiles/small_panel_title_6_2_2.txt +++ b/test/txtfiles/small_panel_title_6_2_2.txt @@ -1,3 +1,3 @@ -╭── aaaa ───╮ -│ │ +╭── aaaa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_3.txt b/test/txtfiles/small_panel_title_6_2_3.txt index a842ff4f9..dbc99e0f8 100644 --- a/test/txtfiles/small_panel_title_6_2_3.txt +++ b/test/txtfiles/small_panel_title_6_2_3.txt @@ -1,3 +1,3 @@ -╭── aaaa ───╮ -│ │ +╭── aaaa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_1.txt b/test/txtfiles/small_panel_title_6_3_1.txt index 39836b217..7d5ae28ed 100644 --- a/test/txtfiles/small_panel_title_6_3_1.txt +++ b/test/txtfiles/small_panel_title_6_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ─╮ -│ │ +╭──── a... ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_2.txt b/test/txtfiles/small_panel_title_6_3_2.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_3_2.txt +++ b/test/txtfiles/small_panel_title_6_3_2.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_3.txt b/test/txtfiles/small_panel_title_6_3_3.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_3_3.txt +++ b/test/txtfiles/small_panel_title_6_3_3.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_1.txt b/test/txtfiles/small_panel_title_6_4_1.txt index 39836b217..7d5ae28ed 100644 --- a/test/txtfiles/small_panel_title_6_4_1.txt +++ b/test/txtfiles/small_panel_title_6_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ─╮ -│ │ +╭──── a... ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_2.txt b/test/txtfiles/small_panel_title_6_4_2.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_4_2.txt +++ b/test/txtfiles/small_panel_title_6_4_2.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_3.txt b/test/txtfiles/small_panel_title_6_4_3.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_4_3.txt +++ b/test/txtfiles/small_panel_title_6_4_3.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_1.txt b/test/txtfiles/small_panel_title_7_1_1.txt index a2c55e6ba..5c995fe76 100644 --- a/test/txtfiles/small_panel_title_7_1_1.txt +++ b/test/txtfiles/small_panel_title_7_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ────╮ -│ │ +╭──── aa ────╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_2.txt b/test/txtfiles/small_panel_title_7_1_2.txt index a2c55e6ba..5c995fe76 100644 --- a/test/txtfiles/small_panel_title_7_1_2.txt +++ b/test/txtfiles/small_panel_title_7_1_2.txt @@ -1,3 +1,3 @@ -╭──── aa ────╮ -│ │ +╭──── aa ────╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_3.txt b/test/txtfiles/small_panel_title_7_1_3.txt index d92d6d09c..504c9c608 100644 --- a/test/txtfiles/small_panel_title_7_1_3.txt +++ b/test/txtfiles/small_panel_title_7_1_3.txt @@ -1,3 +1,3 @@ -╭───── aa ───╮ -│ │ +╭───── aa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_1.txt b/test/txtfiles/small_panel_title_7_2_1.txt index 7fd599ba9..a40964834 100644 --- a/test/txtfiles/small_panel_title_7_2_1.txt +++ b/test/txtfiles/small_panel_title_7_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ──╮ -│ │ +╭──── aaaa ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_2.txt b/test/txtfiles/small_panel_title_7_2_2.txt index 1dd35c1a1..b2b7eef99 100644 --- a/test/txtfiles/small_panel_title_7_2_2.txt +++ b/test/txtfiles/small_panel_title_7_2_2.txt @@ -1,3 +1,3 @@ -╭─── aaaa ───╮ -│ │ +╭─── aaaa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_3.txt b/test/txtfiles/small_panel_title_7_2_3.txt index 1dd35c1a1..b2b7eef99 100644 --- a/test/txtfiles/small_panel_title_7_2_3.txt +++ b/test/txtfiles/small_panel_title_7_2_3.txt @@ -1,3 +1,3 @@ -╭─── aaaa ───╮ -│ │ +╭─── aaaa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_1.txt b/test/txtfiles/small_panel_title_7_3_1.txt index 55fd33ac6..c8e3df330 100644 --- a/test/txtfiles/small_panel_title_7_3_1.txt +++ b/test/txtfiles/small_panel_title_7_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ──╮ -│ │ +╭──── a... ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_2.txt b/test/txtfiles/small_panel_title_7_3_2.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_3_2.txt +++ b/test/txtfiles/small_panel_title_7_3_2.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_3.txt b/test/txtfiles/small_panel_title_7_3_3.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_3_3.txt +++ b/test/txtfiles/small_panel_title_7_3_3.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_1.txt b/test/txtfiles/small_panel_title_7_4_1.txt index 55fd33ac6..c8e3df330 100644 --- a/test/txtfiles/small_panel_title_7_4_1.txt +++ b/test/txtfiles/small_panel_title_7_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ──╮ -│ │ +╭──── a... ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_2.txt b/test/txtfiles/small_panel_title_7_4_2.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_4_2.txt +++ b/test/txtfiles/small_panel_title_7_4_2.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_3.txt b/test/txtfiles/small_panel_title_7_4_3.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_4_3.txt +++ b/test/txtfiles/small_panel_title_7_4_3.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_1.txt b/test/txtfiles/small_panel_title_8_1_1.txt index c3b3626bc..4328bbaf6 100644 --- a/test/txtfiles/small_panel_title_8_1_1.txt +++ b/test/txtfiles/small_panel_title_8_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ─────╮ -│ │ +╭──── aa ─────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_2.txt b/test/txtfiles/small_panel_title_8_1_2.txt index c3b3626bc..4328bbaf6 100644 --- a/test/txtfiles/small_panel_title_8_1_2.txt +++ b/test/txtfiles/small_panel_title_8_1_2.txt @@ -1,3 +1,3 @@ -╭──── aa ─────╮ -│ │ +╭──── aa ─────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_3.txt b/test/txtfiles/small_panel_title_8_1_3.txt index 2ab16d1e1..5ba4246f1 100644 --- a/test/txtfiles/small_panel_title_8_1_3.txt +++ b/test/txtfiles/small_panel_title_8_1_3.txt @@ -1,3 +1,3 @@ -╭────── aa ───╮ -│ │ +╭────── aa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_1.txt b/test/txtfiles/small_panel_title_8_2_1.txt index ffe2714b2..cc0c0b581 100644 --- a/test/txtfiles/small_panel_title_8_2_1.txt +++ b/test/txtfiles/small_panel_title_8_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ───╮ -│ │ +╭──── aaaa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_2.txt b/test/txtfiles/small_panel_title_8_2_2.txt index 7673c0be9..7b4e45dfc 100644 --- a/test/txtfiles/small_panel_title_8_2_2.txt +++ b/test/txtfiles/small_panel_title_8_2_2.txt @@ -1,3 +1,3 @@ -╭─── aaaa ────╮ -│ │ +╭─── aaaa ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_3.txt b/test/txtfiles/small_panel_title_8_2_3.txt index ffe2714b2..cc0c0b581 100644 --- a/test/txtfiles/small_panel_title_8_2_3.txt +++ b/test/txtfiles/small_panel_title_8_2_3.txt @@ -1,3 +1,3 @@ -╭──── aaaa ───╮ -│ │ +╭──── aaaa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_1.txt b/test/txtfiles/small_panel_title_8_3_1.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_3_1.txt +++ b/test/txtfiles/small_panel_title_8_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_2.txt b/test/txtfiles/small_panel_title_8_3_2.txt index e178dd43c..0bd5e9f8d 100644 --- a/test/txtfiles/small_panel_title_8_3_2.txt +++ b/test/txtfiles/small_panel_title_8_3_2.txt @@ -1,3 +1,3 @@ -╭─── a... ────╮ -│ │ +╭─── a... ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_3.txt b/test/txtfiles/small_panel_title_8_3_3.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_3_3.txt +++ b/test/txtfiles/small_panel_title_8_3_3.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_1.txt b/test/txtfiles/small_panel_title_8_4_1.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_4_1.txt +++ b/test/txtfiles/small_panel_title_8_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_2.txt b/test/txtfiles/small_panel_title_8_4_2.txt index e178dd43c..0bd5e9f8d 100644 --- a/test/txtfiles/small_panel_title_8_4_2.txt +++ b/test/txtfiles/small_panel_title_8_4_2.txt @@ -1,3 +1,3 @@ -╭─── a... ────╮ -│ │ +╭─── a... ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_3.txt b/test/txtfiles/small_panel_title_8_4_3.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_4_3.txt +++ b/test/txtfiles/small_panel_title_8_4_3.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/termshow_1.txt b/test/txtfiles/termshow_1.txt index ee08381c2..469636c96 100644 --- a/test/txtfiles/termshow_1.txt +++ b/test/txtfiles/termshow_1.txt @@ -1,8 +1,8 @@ ╭─────────────────╮ -│ │ -│   (1)   1   │ -│   (2)   2   │ -│   (3)   3   │ -│   │ -│ │ -╰──────── 3... ───╯ +│ │ +│   (1)   1   │ +│   (2)   2   │ +│   (3)   3   │ +│   │ +│ │ +╰──────── 3... ───╯ diff --git a/test/txtfiles/termshow_10.txt b/test/txtfiles/termshow_10.txt index 617834d03..babbd5667 100644 --- a/test/txtfiles/termshow_10.txt +++ b/test/txtfiles/termshow_10.txt @@ -1,13 +1,13 @@ -╭──── Matrix {Float64}  ────────────────╮ -│ │ -│   │ -│     (1)   (2)   (3)   (4)   (5)   │ -│   │ -│   (1)   0.0   0.0   0.0   0.0   0.0   │ -│   (2)   0.0   0.0   0.0   0.0   0.0   │ -│   (3)   0.0   0.0   0.0   0.0   0.0   │ -│   (4)   0.0   0.0   0.0   0.0   0.0   │ -│   (5)   0.0   0.0   0.0   0.0   0.0   │ -│   │ -│ │ -╰──────────────────────────── 5 × 5  ───╯ +╭──── Matrix {Float64}  ────────────────╮ +│ │ +│   │ +│     (1)   (2)   (3)   (4)   (5)   │ +│   │ +│   (1)   0.0   0.0   0.0   0.0   0.0   │ +│   (2)   0.0   0.0   0.0   0.0   0.0   │ +│   (3)   0.0   0.0   0.0   0.0   0.0   │ +│   (4)   0.0   0.0   0.0   0.0   0.0   │ +│   (5)   0.0   0.0   0.0   0.0   0.0   │ +│   │ +│ │ +╰──────────────────────────── 5 × 5  ───╯ diff --git a/test/txtfiles/termshow_11.txt b/test/txtfiles/termshow_11.txt index 5cd786124..e1a9a1e9a 100644 --- a/test/txtfiles/termshow_11.txt +++ b/test/txtfiles/termshow_11.txt @@ -1,347 +1,347 @@ -╭──── Array {Float64, 3}  ───────────────────────╮ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 1] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 2] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 3] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 4] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 5] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 6] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 7] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 8] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 9] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰───────────────────────────── [:, :, 10] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │ 90 frames omitted │ │ -│ ╰────────────────────────────────────────────╯ │ -│ │ -╰──────────────────────────── 100 × 100 × 100 ───╯ +╭──── Array {Float64, 3}  ───────────────────────╮ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 1] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 2] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 3] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 4] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 5] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 6] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 7] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 8] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 9] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰───────────────────────────── [:, :, 10] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │ 90 frames omitted │ │ +│ ╰────────────────────────────────────────────╯ │ +│ │ +╰──────────────────────────── 100 × 100 × 100 ───╯ diff --git a/test/txtfiles/termshow_12.txt b/test/txtfiles/termshow_12.txt deleted file mode 100644 index c99e33159..000000000 --- a/test/txtfiles/termshow_12.txt +++ /dev/null @@ -1,109 +0,0 @@ - ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Panel <: Term.Panels.AbstractPanel │ - │ │segments ::Vector │ - │ │ measure ::Term.Measures.Measure │ - │ │ - ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel  │ - └──────────────────────────────────────────────────────────────────┘ - -`Renderable` with a panel surrounding some content: - - ┌──────────────────────────────────────────────────────────────────┐ - │  ╭──────────╮  │ - │  │ my panel │  │ - │  ╰──────────╯  │ - └──────────────────────────────────────────────────────────────────┘ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -When constructing a Panel, several keyword arguments can be used to set its -appearance: - - • box::Symbol sets the `Box` type for the Panel's border - • style::String sets the box's style (e.g., color) - • title::Union sets the Panel's title - • title_style::Union sets the title's style - • title_justify::Symbol sets the location of the title - • subtitle::Union sets the Panel's subtitle - • subtitle_style::Union sets the subtitle's style - • subtitle_justify::Symbol sets the location of the subtitle - • justify::Symbol sets text's alignment (:left, :rigth, :center, :justify) - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(;   │ - │  fit::Bool = false,  │ - │  height::Int = 2,  │ - │  width::Int = 80,  │ - │  padding::Union{{Vector,Padding,NTuple}} = Padding(0,  │ - │ 0, 0, 0),  │ - │  kwargs...,   │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` with no content. - - Examples - - ┌──────────────────────────────────────────────────────────────────┐ - │ julia> Panel(height=5, width=10)  │ - │ ╭────────╮  │ - │ │ │  │ - │ │ │  │ - │ │ │  │ - │ ╰────────╯  │ - │   │ - │ julia> Panel(height=3, width=5)  │ - │ ╭───╮  │ - │ │ │  │ - │ ╰───╯  │ - └──────────────────────────────────────────────────────────────────┘ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(  │ - │  content::Union{{AbstractString,AbstractRenderable}};  │ - │  fit::Bool = false,  │ - │  padding::Union{{Nothing,Padding,NTuple}} = nothing,  │ - │  kwargs...,  │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` around an `AbstractRenderable` or `AbstractString`. - -This is the main Panel-creating function, it dispatches to other methods based -on the value of `fit` to either fith the `Panel` to its content or vice versa. - -`kwargs` can be used to set various aspects of the `Panel`'s appearance like -the presence and style of titles, box type etc... see render (@ref) below. - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(  │ - │  content::Union{{AbstractString,AbstractRenderable}},  │ - │  ::Val{{true}},  │ - │  padding::Padding;  │ - │  height::Union{{Nothing,Int}} = nothing,  │ - │  width::Union{{Nothing,Int}} = nothing,  │ - │  trim::Bool = true,  │ - │  kwargs...,  │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` fitting the content's width. - - ╭──── Warning ─────────────────────────────────────────────────────────╮ - │ If the content is larger than the console terminal's width, │ - │ it will │ - │ get trimmed │ - │ to avoid overflow, unless `trim=false` is given. │ - ╰──────────────────────────────────────────────────────────────────────╯ -28 lines omitted... \ No newline at end of file diff --git a/test/txtfiles/termshow_2.txt b/test/txtfiles/termshow_2.txt index a545e0a55..9512f7e3d 100644 --- a/test/txtfiles/termshow_2.txt +++ b/test/txtfiles/termshow_2.txt @@ -1,6 +1,7 @@ -╭──── Dict {Any, Any}  ──────────────────────────╮ -│ │ -│  {String} │ a => Dict(:z => "a") │  {Dict}  │ -│  {Symbol} │ x => [1, 2, 3] │ {Vector}  │ -│ │ -╰──────────────────────────────────── 2 items ───╯ +╭──── Dict {Any, Any}  ──────────────────────────╮ +│ │ +│   {String}  a => Dict(:z => "a")   {Dict}    │ +│   {Symbol}  x =>  [1, 2, 3]   {Vector}   │ +│   │ +│ │ +╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/termshow_3.txt b/test/txtfiles/termshow_3.txt index 1a2e7702c..be02676c5 100644 --- a/test/txtfiles/termshow_3.txt +++ b/test/txtfiles/termshow_3.txt @@ -1,15 +1,105 @@ -╭──── Dict {Int64, Int64}  ────────╮ -│ │ -│  {Int64} │ 5 => 5 │ {Int64}  │ -│  {Int64} │ 56 => 56 │ {Int64}  │ -│  {Int64} │ 35 => 35 │ {Int64}  │ -│  {Int64} │ 55 => 55 │ {Int64}  │ -│  {Int64} │ 60 => 60 │ {Int64}  │ -│  {Int64} │ 30 => 30 │ {Int64}  │ -│  {Int64} │ 32 => 32 │ {Int64}  │ -│  {Int64} │ 6 => 6 │ {Int64}  │ -│  {Int64} │ 67 => 67 │ {Int64}  │ -│  {Int64} │ 45 => 45 │ {Int64}  │ -│ ⋮ │ ⋮ ⋮ │ ⋮ │ -│ │ -╰──────────────────── 100 items ───╯ +╭──── Dict {Int64, Int64}  ──────────╮ +│ │ +│   {Int64}   5  =>  5   {Int64}   │ +│   {Int64}  56  => 56   {Int64}   │ +│   {Int64}  35  => 35   {Int64}   │ +│   {Int64}  55  => 55   {Int64}   │ +│   {Int64}  60  => 60   {Int64}   │ +│   {Int64}  30  => 30   {Int64}   │ +│   {Int64}  32  => 32   {Int64}   │ +│   {Int64}   6  =>  6   {Int64}   │ +│   {Int64}  67  => 67   {Int64}   │ +│   {Int64}  45  => 45   {Int64}   │ +│   {Int64}  73  => 73   {Int64}   │ +│   {Int64}  64  => 64   {Int64}   │ +│   {Int64}  90  => 90   {Int64}   │ +│   {Int64}   4  =>  4   {Int64}   │ +│   {Int64}  13  => 13   {Int64}   │ +│   {Int64}  54  => 54   {Int64}   │ +│   {Int64}  63  => 63   {Int64}   │ +│   {Int64}  86  => 86   {Int64}   │ +│   {Int64}  91  => 91   {Int64}   │ +│   {Int64}  62  => 62   {Int64}  [39m │ +│   {Int64}  58  => 58   {Int64}   │ +│   {Int64}  52  => 52   {Int64}   │ +│   {Int64}  12  => 12   {Int64}   │ +│   {Int64}  28  => 28   {Int64}   │ +│   {Int64}  75  => 75   {Int64}   │ +│   {Int64}  23  => 23   {Int64}   │ +│   {Int64}  92  => 92   {Int64}   │ +│   {Int64}  41  => 41   {Int64}   │ +│   {Int64}  43  => 43   {Int64}   │ +│   {Int64}  11  => 11   {Int64}   │ +│   {Int64}  36  => 36   {Int64}   │ +│   {Int64}  68  => 68   {Int64}   │ +│   {Int64}  69  => 69   {Int64}   │ +│   {Int64}  98  => 98   {Int64}   │ +│   {Int64}  82  => 82   {Int64}   │ +│   {Int64}  85  => 85   {Int64}   │ +│   {Int64}  39  => 39   {Int64}   │ +│   {Int64}  84  => 84   {Int64}   │ +│   {Int64}  77  => 77   {Int64}   │ +│   {Int64}   7  =>  7   {Int64}   │ +│   {Int64}  25  => 25   {Int64}   │ +│   {Int64}  95  => 95   {Int64}   │ +│   {Int64}  71  => 71   {Int64}   │ +│   {Int64}  66  => 66   {Int64}   │ +│   {Int64}  76  => 76   {Int64}   │ +│   {Int64}  34  => 34   {Int64}   │ +│   {Int64}  50  => 50   {Int64}   │ +│   {Int64}  59  => 59   {Int64}   │ +│   {Int64}  93  => 93   {Int64}   │ +│   {Int64}   2  =>  2   {Int64}   │ +│   {Int64}  10  => 10   {Int64}   │ +│   {Int64}  18  => 18   {Int64}   │ +│   {Int64}  26  => 26   {Int64}   │ +│   {Int64}  27  => 27   {Int64}   │ +│   {Int64}  42  => 42   {Int64}   │ +│   {Int64}  87  => 87   {Int64}   │ +│   {Int64}  100 => 100  {Int64}   │ +│   {Int64}  79  => 79   {Int64}   │ +│   {Int64}  16  => 16   {Int64}   │ +│   {Int64}  20  => 20   {Int64}   │ +│   {Int64}  81  => 81   {Int64}   │ +│   {Int64}  19  => 19   {Int64}   │ +│   {Int64}  49  => 49   {Int64}   │ +│   {Int64}  44  => 44   {Int64}   │ +│   {Int64}   9  =>  9   {Int64}   │ +│   {Int64}  31  => 31   {Int64}   │ +│   {Int64}  74  => 74   {Int64}   │ +│   {Int64}  61  => 61   {Int64}   │ +│   {Int64}  29  => 29   {Int64}   │ +│   {Int64}  94  => 94   {Int64}   │ +│   {Int64}  46  => 46   {Int64}   │ +│   {Int64}  57  => 57   {Int64}   │ +│   {Int64}  70  => 70   {Int64}   │ +│   {Int64}  21  => 21   {Int64}   │ +│   {Int64}  38  => 38   {Int64}   │ +│   {Int64}  88  => 88   {Int64}   │ +│   {Int64}  78  => 78   {Int64}   │ +│   {Int64}  72  => 72   {Int64}   │ +│   {Int64}  24  => 24   {Int64}   │ +│   {Int64}   8  =>  8   {Int64}   │ +│   {Int64}  17  => 17   {Int64}   │ +│   {Int64}  37  => 37   {Int64}   │ +│   {Int64}   1  =>  1   {Int64}   │ +│   {Int64}  53  => 53   {Int64}   │ +│   {Int64}  22  => 22   {Int64}   │ +│   {Int64}  47  => 47   {Int64}   │ +│   {Int64}  83  => 83   {Int64}   │ +│   {Int64}  99  => 99   {Int64}   │ +│   {Int64}  89  => 89   {Int64}   │ +│   {Int64}  14  => 14   {Int64}   │ +│   {Int64}   3  =>  3   {Int64}   │ +│   {Int64}  80  => 80   {Int64}   │ +│   {Int64}  96  => 96   {Int64}   │ +│   {Int64}  51  => 51   {Int64}   │ +│   {Int64}  33  => 33   {Int64}   │ +│   {Int64}  40  => 40   {Int64}   │ +│   {Int64}  48  => 48   {Int64}   │ +│   {Int64}  15  => 15   {Int64}   │ +│   {Int64}  65  => 65   {Int64}   │ +│   {Int64}  97  => 97   {Int64}   │ +│   │ +│ │ +╰────────────────────────────────────╯ diff --git a/test/txtfiles/termshow_4.txt b/test/txtfiles/termshow_4.txt index 294f4ed33..62c4d3b60 100644 --- a/test/txtfiles/termshow_4.txt +++ b/test/txtfiles/termshow_4.txt @@ -1,59 +1,59 @@ -╭──── Matrix {Float64}  ───────────────────╮ -│ │ -│   │ -│     (1)   (2)   (3)   (4)   (300)   │ -│   │ -│   (1)   0.0   0.0   0.0   0.0   ⋯   │ -│   (2)   0.0   0.0   0.0   0.0   ⋯   │ -│   (3)   0.0   0.0   0.0   0.0   ⋯   │ -│   (4)   0.0   0.0   0.0   0.0   ⋯   │ -│   (5)   0.0   0.0   0.0   0.0   ⋯   │ -│   (6)   0.0   0.0   0.0   0.0   ⋯   │ -│   (7)   0.0   0.0   0.0   0.0   ⋯   │ -│   (8)   0.0   0.0   0.0   0.0   ⋯   │ -│   (9)   0.0   0.0   0.0   0.0   ⋯   │ -│   (10)   0.0   0.0   0.0   0.0   ⋯   │ -│   (11)   0.0   0.0   0.0   0.0   ⋯   │ -│   (12)   0.0   0.0   0.0   0.0   ⋯   │ -│   (13)   0.0   0.0   0.0   0.0   ⋯   │ -│   (14)   0.0   0.0   0.0   0.0   ⋯   │ -│   (15)   0.0   0.0   0.0   0.0   ⋯   │ -│   (16)   0.0   0.0   0.0   0.0   ⋯   │ -│   (17)   0.0   0.0   0.0   0.0   ⋯   │ -│   (18)   0.0   0.0   0.0   0.0   ⋯   │ -│   (19)   0.0   0.0   0.0   0.0   ⋯   │ -│   (20)   0.0   0.0   0.0   0.0   ⋯   │ -│   (21)   0.0   0.0   0.0   0.0   ⋯   │ -│   (22)   0.0   0.0   0.0   0.0   ⋯   │ -│   (23)   0.0   0.0   0.0   0.0   ⋯   │ -│   (24)   0.0   0.0   0.0   0.0   ⋯   │ -│   (25)   0.0   0.0   0.0   0.0   ⋯   │ -│   (26)   0.0   0.0   0.0   0.0   ⋯   │ -│   (27)   0.0   0.0   0.0   0.0   ⋯   │ -│   (28)   0.0   0.0   0.0   0.0   ⋯   │ -│   (29)   0.0   0.0   0.0   0.0   ⋯   │ -│   (30)   0.0   0.0   0.0   0.0   ⋯   │ -│   (31)   0.0   0.0   0.0   0.0   ⋯   │ -│   (32)   0.0   0.0   0.0   0.0   ⋯   │ -│   (33)   0.0   0.0   0.0   0.0   ⋯   │ -│   (34)   0.0   0.0   0.0   0.0   ⋯   │ -│   (35)   0.0   0.0   0.0   0.0   ⋯   │ -│   (36)   0.0   0.0   0.0   0.0   ⋯   │ -│   (37)   0.0   0.0   0.0   0.0   ⋯   │ -│   (38)   0.0   0.0   0.0   0.0   ⋯   │ -│   (39)   0.0   0.0   0.0   0.0   ⋯   │ -│   (40)   0.0   0.0   0.0   0.0   ⋯   │ -│   (41)   0.0   0.0   0.0   0.0   ⋯   │ -│   (42)   0.0   0.0   0.0   0.0   ⋯   │ -│   (43)   0.0   0.0   0.0   0.0   ⋯   │ -│   (44)   0.0   0.0   0.0   0.0   ⋯   │ -│   (45)   0.0   0.0   0.0   0.0   ⋯   │ -│   (46)   0.0   0.0   0.0   0.0   ⋯   │ -│   (47)   0.0   0.0   0.0   0.0   ⋯   │ -│   (48)   0.0   0.0   0.0   0.0   ⋯   │ -│   (49)   0.0   0.0   0.0   0.0   ⋯   │ -│   (50)   0.0   0.0   0.0   0.0   ⋯   │ -│     ⋮   ⋮   ⋮   ⋮   ⋱   │ -│   │ -│ │ -╰─────────────────────────── 120 × 300  ───╯ +╭──── Matrix {Float64}  ───────────────────╮ +│ │ +│   │ +│     (1)   (2)   (3)   (4)   (300)   │ +│   │ +│   (1)   0.0   0.0   0.0   0.0   ⋯   │ +│   (2)   0.0   0.0   0.0   0.0   ⋯   │ +│   (3)   0.0   0.0   0.0   0.0   ⋯   │ +│   (4)   0.0   0.0   0.0   0.0   ⋯   │ +│   (5)   0.0   0.0   0.0   0.0   ⋯   │ +│   (6)   0.0   0.0   0.0   0.0   ⋯   │ +│   (7)   0.0   0.0   0.0   0.0   ⋯   │ +│   (8)   0.0   0.0   0.0   0.0   ⋯   │ +│   (9)   0.0   0.0   0.0   0.0   ⋯   │ +│   (10)   0.0   0.0   0.0   0.0   ⋯   │ +│   (11)   0.0   0.0   0.0   0.0   ⋯   │ +│   (12)   0.0   0.0   0.0   0.0   ⋯   │ +│   (13)   0.0   0.0   0.0   0.0   ⋯   │ +│   (14)   0.0   0.0   0.0   0.0   ⋯   │ +│   (15)   0.0   0.0   0.0   0.0   ⋯   │ +│   (16)   0.0   0.0   0.0   0.0   ⋯   │ +│   (17)   0.0   0.0   0.0   0.0   ⋯   │ +│   (18)   0.0   0.0   0.0   0.0   ⋯   │ +│   (19)   0.0   0.0   0.0   0.0   ⋯   │ +│   (20)   0.0   0.0   0.0   0.0   ⋯   │ +│   (21)   0.0   0.0   0.0   0.0   ⋯   │ +│   (22)   0.0   0.0   0.0   0.0   ⋯   │ +│   (23)   0.0   0.0   0.0   0.0   ⋯   │ +│   (24)   0.0   0.0   0.0   0.0   ⋯   │ +│   (25)   0.0   0.0   0.0   0.0   ⋯   │ +│   (26)   0.0   0.0   0.0   0.0   ⋯   │ +│   (27)   0.0   0.0   0.0   0.0   ⋯   │ +│   (28)   0.0   0.0   0.0   0.0   ⋯   │ +│   (29)   0.0   0.0   0.0   0.0   ⋯   │ +│   (30)   0.0   0.0   0.0   0.0   ⋯   │ +│   (31)   0.0   0.0   0.0   0.0   ⋯   │ +│   (32)   0.0   0.0   0.0   0.0   ⋯   │ +│   (33)   0.0   0.0   0.0   0.0   ⋯   │ +│   (34)   0.0   0.0   0.0   0.0   ⋯   │ +│   (35)   0.0   0.0   0.0   0.0   ⋯   │ +│   (36)   0.0   0.0   0.0   0.0   ⋯   │ +│   (37)   0.0   0.0   0.0   0.0   ⋯   │ +│   (38)   0.0   0.0   0.0   0.0   ⋯   │ +│   (39)   0.0   0.0   0.0   0.0   ⋯   │ +│   (40)   0.0   0.0   0.0   0.0   ⋯   │ +│   (41)   0.0   0.0   0.0   0.0   ⋯   │ +│   (42)   0.0   0.0   0.0   0.0   ⋯   │ +│   (43)   0.0   0.0   0.0   0.0   ⋯   │ +│   (44)   0.0   0.0   0.0   0.0   ⋯   │ +│   (45)   0.0   0.0   0.0   0.0   ⋯   │ +│   (46)   0.0   0.0   0.0   0.0   ⋯   │ +│   (47)   0.0   0.0   0.0   0.0   ⋯   │ +│   (48)   0.0   0.0   0.0   0.0   ⋯   │ +│   (49)   0.0   0.0   0.0   0.0   ⋯   │ +│   (50)   0.0   0.0   0.0   0.0   ⋯   │ +│     ⋮   ⋮   ⋮   ⋮   ⋱   │ +│   │ +│ │ +╰─────────────────────────── 120 × 300  ───╯ diff --git a/test/txtfiles/termshow_5.txt b/test/txtfiles/termshow_5.txt index 9775e8185..15bf4e420 100644 --- a/test/txtfiles/termshow_5.txt +++ b/test/txtfiles/termshow_5.txt @@ -1,56 +1,56 @@ ╭────────────────────╮ -│ │ -│   (1)   0.0   │ -│   (2)   0.0   │ -│   (3)   0.0   │ -│   (4)   0.0   │ -│   (5)   0.0   │ -│   (6)   0.0   │ -│   (7)   0.0   │ -│   (8)   0.0   │ -│   (9)   0.0   │ -│   (10)   0.0   │ -│   (11)   0.0   │ -│   (12)   0.0   │ -│   (13)   0.0   │ -│   (14)   0.0   │ -│   (15)   0.0   │ -│   (16)   0.0   │ -│   (17)   0.0   │ -│   (18)   0.0   │ -│   (19)   0.0   │ -│   (20)   0.0   │ -│   (21)   0.0   │ -│   (22)   0.0   │ -│   (23)   0.0   │ -│   (24)   0.0   │ -│   (25)   0.0   │ -│   (26)   0.0   │ -│   (27)   0.0   │ -│   (28)   0.0   │ -│   (29)   0.0   │ -│   (30)   0.0   │ -│   (31)   0.0   │ -│   (32)   0.0   │ -│   (33)   0.0   │ -│   (34)   0.0   │ -│   (35)   0.0   │ -│   (36)   0.0   │ -│   (37)   0.0   │ -│   (38)   0.0   │ -│   (39)   0.0   │ -│   (40)   0.0   │ -│   (41)   0.0   │ -│   (42)   0.0   │ -│   (43)   0.0   │ -│   (44)   0.0   │ -│   (45)   0.0   │ -│   (46)   0.0   │ -│   (47)   0.0   │ -│   (48)   0.0   │ -│   (49)   0.0   │ -│   (50)   0.0   │ -│     ⋮   │ -│   │ -│ │ -╰────── 200 items ───╯ +│ │ +│   (1)   0.0   │ +│   (2)   0.0   │ +│   (3)   0.0   │ +│   (4)   0.0   │ +│   (5)   0.0   │ +│   (6)   0.0   │ +│   (7)   0.0   │ +│   (8)   0.0   │ +│   (9)   0.0   │ +│   (10)   0.0   │ +│   (11)   0.0   │ +│   (12)   0.0   │ +│   (13)   0.0   │ +│   (14)   0.0   │ +│   (15)   0.0   │ +│   (16)   0.0   │ +│   (17)   0.0   │ +│   (18)   0.0   │ +│   (19)   0.0   │ +│   (20)   0.0   │ +│   (21)   0.0   │ +│   (22)   0.0   │ +│   (23)   0.0   │ +│   (24)   0.0   │ +│   (25)   0.0   │ +│   (26)   0.0   │ +│   (27)   0.0   │ +│   (28)   0.0   │ +│   (29)   0.0   │ +│   (30)   0.0   │ +│   (31)   0.0   │ +│   (32)   0.0   │ +│   (33)   0.0   │ +│   (34)   0.0   │ +│   (35)   0.0   │ +│   (36)   0.0   │ +│   (37)   0.0   │ +│   (38)   0.0   │ +│   (39)   0.0   │ +│   (40)   0.0   │ +│   (41)   0.0   │ +│   (42)   0.0   │ +│   (43)   0.0   │ +│   (44)   0.0   │ +│   (45)   0.0   │ +│   (46)   0.0   │ +│   (47)   0.0   │ +│   (48)   0.0   │ +│   (49)   0.0   │ +│   (50)   0.0   │ +│     ⋮   │ +│   │ +│ │ +╰────── 200 items ───╯ diff --git a/test/txtfiles/termshow_6.txt b/test/txtfiles/termshow_6.txt index 263354f9e..0d8d027ea 100644 --- a/test/txtfiles/termshow_6.txt +++ b/test/txtfiles/termshow_6.txt @@ -1,37 +1,37 @@ -╭──── Array {Float64, 3}  ────────╮ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 1] ───╯ │ -│ │ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 2] ───╯ │ -│ │ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 3] ───╯ │ -│ │ -│ │ -│ │ -╰─────────────────── 3 × 3 × 3 ───╯ +╭──── Array {Float64, 3}  ────────╮ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 1] ───╯ │ +│ │ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 2] ───╯ │ +│ │ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 3] ───╯ │ +│ │ +│ │ +│ │ +╰─────────────────── 3 × 3 × 3 ───╯ diff --git a/test/txtfiles/termshow_7.txt b/test/txtfiles/termshow_7.txt index 4781691dc..89a43b0b1 100644 --- a/test/txtfiles/termshow_7.txt +++ b/test/txtfiles/termshow_7.txt @@ -1,12 +1,8 @@ - ╭──── Function: clear ─────────────────────────────╮ - │ │ - │ (1)  clear() │ - │ (2)  clear(io::IO) │ - │ │ - ╰──────────────────────────────────── 2 methods ───╯ -━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━ - ┌─────────────────────────────────────┐ - │ clear(io::IO = stdout)  │ - └─────────────────────────────────────┘ - - Clear terminal from anything printed in the REPL. + ╭──── Function: fn ────────────────────────────────╮ + │ │ + │ (1)  fn(x::Int64) │ + │ (2)  fn(s::String) │ + │ │ + ╰──────────────────────────────────── 2 methods ───╯ +━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━ + test function diff --git a/test/txtfiles/termshow_8.txt b/test/txtfiles/termshow_8.txt index 47daba0a8..f5d465a86 100644 --- a/test/txtfiles/termshow_8.txt +++ b/test/txtfiles/termshow_8.txt @@ -1,6 +1,7 @@ -╭──────────────────────────────────────────╮ -│ x / y + √9 │ -│ ────────────────────────────────────── │ -│ head::Symbol│ call │ -│ args::Vector│ Any[:+, :(x / y), :(√9)] │ -╰───────────────────────────────── Expr ───╯ +╭───────────────────────────────────────────╮ +│ x / y + √9 │ +│ ─────────────────────────────────────── │ +│  head::Symbol  call   │ +│  args::Vector Any[:+, :(x / y), :(√9)]  │ +│   │ +╰────────────────────────────────── Expr ───╯ diff --git a/test/txtfiles/termshow_9.txt b/test/txtfiles/termshow_9.txt index 66139479b..a966c25e6 100644 --- a/test/txtfiles/termshow_9.txt +++ b/test/txtfiles/termshow_9.txt @@ -1,15 +1,15 @@ ╭────────────────────╮ -│ │ -│   (1)   0.0   │ -│   (2)   0.0   │ -│   (3)   0.0   │ -│   (4)   0.0   │ -│   (5)   0.0   │ -│   (6)   0.0   │ -│   (7)   0.0   │ -│   (8)   0.0   │ -│   (9)   0.0   │ -│   (10)   0.0   │ -│   │ -│ │ -╰─────── 10 items ───╯ +│ │ +│   (1)   0.0   │ +│   (2)   0.0   │ +│   (3)   0.0   │ +│   (4)   0.0   │ +│   (5)   0.0   │ +│   (6)   0.0   │ +│   (7)   0.0   │ +│   (8)   0.0   │ +│   (9)   0.0   │ +│   (10)   0.0   │ +│   │ +│ │ +╰─────── 10 items ───╯ diff --git a/test/txtfiles/termshow_panel.txt b/test/txtfiles/termshow_panel.txt deleted file mode 100644 index 4a791e214..000000000 --- a/test/txtfiles/termshow_panel.txt +++ /dev/null @@ -1,6 +0,0 @@ -╭────────────────────────────────╮ -│ width::Int64│ 10 │ -│ height::Int64│ 50 │ -│ mass::Float64│ 5000.0 │ -│ manufacturer::String│ NASA │ -╰───────────────────── Rocket ───╯ diff --git a/test/txtfiles/tree_1.txt b/test/txtfiles/tree_1.txt deleted file mode 100644 index fdd3dadda..000000000 --- a/test/txtfiles/tree_1.txt +++ /dev/null @@ -1,6 +0,0 @@ - tree -━━━━━━ - │  - └── nestedasdasdsadasdasdsadsadasdasdasdsadas... -  ├── n1: 1 -  └── n2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_1.txt b/test/txtfiles/tree_1_1_1.txt new file mode 100644 index 000000000..93dcdd555 --- /dev/null +++ b/test/txtfiles/tree_1_1_1.txt @@ -0,0 +1,8 @@ +tree_1_1_1 + └─ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsd +fd ⇒ Dict("n1" => 1, "n2" => 2) + + ├─ n1 ⇒ 1 + + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_10.txt b/test/txtfiles/tree_1_1_10.txt new file mode 100644 index 000000000..f5bf6e25f --- /dev/null +++ b/test/txtfiles/tree_1_1_10.txt @@ -0,0 +1,2 @@ +tree_1_1_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_11.txt b/test/txtfiles/tree_1_1_11.txt new file mode 100644 index 000000000..83afd1386 --- /dev/null +++ b/test/txtfiles/tree_1_1_11.txt @@ -0,0 +1,2 @@ +tree_1_1_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_12.txt b/test/txtfiles/tree_1_1_12.txt new file mode 100644 index 000000000..bfe0c9f96 --- /dev/null +++ b/test/txtfiles/tree_1_1_12.txt @@ -0,0 +1,7 @@ +tree_1_1_12 + ├─ 1 ⇒ print + └─ 2 ⇒ :((x, y)) + └─ 1 ⇒ (x, y) + ├─ 1 ⇒ x + └─ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_2.txt b/test/txtfiles/tree_1_1_2.txt new file mode 100644 index 000000000..77f2bff56 --- /dev/null +++ b/test/txtfiles/tree_1_1_2.txt @@ -0,0 +1,8 @@ +tree_1_1_2 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n1" => 1, "n2" => 2) + ├─ n1 ⇒ 1 + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_3.txt b/test/txtfiles/tree_1_1_3.txt new file mode 100644 index 000000000..f6ee913af --- /dev/null +++ b/test/txtfiles/tree_1_1_3.txt @@ -0,0 +1,10 @@ +tree_1_1_3 + ├─ leaf ⇒ 2 + ├─ nested ⇒ Dict("n1" => 1, "n2" => 2) + │ ├─ n1 ⇒ 1 + │ └─ n2 ⇒ 2 + ├─ canopy ⇒ test + ├─ leafme ⇒ v + ├─ ["a"] ⇒ test + └─ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_4.txt b/test/txtfiles/tree_1_1_4.txt new file mode 100644 index 000000000..f33e67e18 --- /dev/null +++ b/test/txtfiles/tree_1_1_4.txt @@ -0,0 +1,23 @@ +tree_1_1_4 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_5.txt b/test/txtfiles/tree_1_1_5.txt new file mode 100644 index 000000000..effe7a727 --- /dev/null +++ b/test/txtfiles/tree_1_1_5.txt @@ -0,0 +1,20 @@ +tree_1_1_5 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ├─ adict ⇒ Dict("x" => 2) + │ └─ x ⇒ 2 + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ├─ sodeep ⇒ Dict("a" => 4) + │ └─ a ⇒ 4 + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_6.txt b/test/txtfiles/tree_1_1_6.txt new file mode 100644 index 000000000..bcd581e54 --- /dev/null +++ b/test/txtfiles/tree_1_1_6.txt @@ -0,0 +1,8 @@ +tree_1_1_6 + ├─ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + │ ├─ 3 ⇒ 8 + │ └─ 1 ⇒ a + └─ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ├─ 3 ⇒ 8 + └─ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_7.txt b/test/txtfiles/tree_1_1_7.txt new file mode 100644 index 000000000..1b3f43f35 --- /dev/null +++ b/test/txtfiles/tree_1_1_7.txt @@ -0,0 +1,7 @@ +tree_1_1_7 + ├─ 2 ⇒ 1 + └─ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ├─ 4 ⇒ 2 + ├─ a ⇒ 2 + └─ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_8.txt b/test/txtfiles/tree_1_1_8.txt new file mode 100644 index 000000000..8c8a16179 --- /dev/null +++ b/test/txtfiles/tree_1_1_8.txt @@ -0,0 +1,8 @@ +tree_1_1_8 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ 2 + └─ 3 ⇒ [2, 3, 4] + ├─ 1 ⇒ 2 + ├─ 2 ⇒ 3 + └─ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_9.txt b/test/txtfiles/tree_1_1_9.txt new file mode 100644 index 000000000..40d610988 --- /dev/null +++ b/test/txtfiles/tree_1_1_9.txt @@ -0,0 +1,26 @@ +tree_1_1_9 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + │ ├─ 1 ⇒ 2 + │ ├─ 2 ⇒ [3, 4] + │ │ ├─ 1 ⇒ 3 + │ │ └─ 2 ⇒ 4 + │ └─ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaa + ├─ 3 ⇒ c + └─ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ├─ 2 ⇒ a + ├─ 1 ⇒ ok + ├─ a ⇒ 2 + └─ test ⇒ [1, 2] + ├─ 1 ⇒ 1 + └─ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_1.txt b/test/txtfiles/tree_1_2_1.txt new file mode 100644 index 000000000..13a36ceb8 --- /dev/null +++ b/test/txtfiles/tree_1_2_1.txt @@ -0,0 +1,8 @@ +tree_1_2_1 + ┗━━━ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsf +sdfd ⇒ Dict("n1" => 1, "n2" => 2) + + ┣━━━ n1 ⇒ 1 + + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_10.txt b/test/txtfiles/tree_1_2_10.txt new file mode 100644 index 000000000..a5f31393d --- /dev/null +++ b/test/txtfiles/tree_1_2_10.txt @@ -0,0 +1,2 @@ +tree_1_2_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_11.txt b/test/txtfiles/tree_1_2_11.txt new file mode 100644 index 000000000..ee47dd3fa --- /dev/null +++ b/test/txtfiles/tree_1_2_11.txt @@ -0,0 +1,2 @@ +tree_1_2_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_12.txt b/test/txtfiles/tree_1_2_12.txt new file mode 100644 index 000000000..37fcb5658 --- /dev/null +++ b/test/txtfiles/tree_1_2_12.txt @@ -0,0 +1,7 @@ +tree_1_2_12 + ┣━━━ 1 ⇒ print + ┗━━━ 2 ⇒ :((x, y)) + ┗━━━ 1 ⇒ (x, y) + ┣━━━ 1 ⇒ x + ┗━━━ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_2.txt b/test/txtfiles/tree_1_2_2.txt new file mode 100644 index 000000000..bf56c0341 --- /dev/null +++ b/test/txtfiles/tree_1_2_2.txt @@ -0,0 +1,8 @@ +tree_1_2_2 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┣━━━ n1 ⇒ 1 + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_3.txt b/test/txtfiles/tree_1_2_3.txt new file mode 100644 index 000000000..014756f6a --- /dev/null +++ b/test/txtfiles/tree_1_2_3.txt @@ -0,0 +1,10 @@ +tree_1_2_3 + ┣━━━ leaf ⇒ 2 + ┣━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┃ ┣━━━ n1 ⇒ 1 + ┃ ┗━━━ n2 ⇒ 2 + ┣━━━ canopy ⇒ test + ┣━━━ leafme ⇒ v + ┣━━━ ["a"] ⇒ test + ┗━━━ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_4.txt b/test/txtfiles/tree_1_2_4.txt new file mode 100644 index 000000000..a4909ef89 --- /dev/null +++ b/test/txtfiles/tree_1_2_4.txt @@ -0,0 +1,26 @@ +tree_1_2_4 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_5.txt b/test/txtfiles/tree_1_2_5.txt new file mode 100644 index 000000000..74f585aad --- /dev/null +++ b/test/txtfiles/tree_1_2_5.txt @@ -0,0 +1,20 @@ +tree_1_2_5 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ┣━━━ adict ⇒ Dict("x" => 2) + ┃ ┗━━━ x ⇒ 2 + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ┣━━━ sodeep ⇒ Dict("a" => 4) + ┃ ┗━━━ a ⇒ 4 + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_6.txt b/test/txtfiles/tree_1_2_6.txt new file mode 100644 index 000000000..8960b3f73 --- /dev/null +++ b/test/txtfiles/tree_1_2_6.txt @@ -0,0 +1,8 @@ +tree_1_2_6 + ┣━━━ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + ┃ ┣━━━ 3 ⇒ 8 + ┃ ┗━━━ 1 ⇒ a + ┗━━━ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ┣━━━ 3 ⇒ 8 + ┗━━━ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_7.txt b/test/txtfiles/tree_1_2_7.txt new file mode 100644 index 000000000..8da64001c --- /dev/null +++ b/test/txtfiles/tree_1_2_7.txt @@ -0,0 +1,7 @@ +tree_1_2_7 + ┣━━━ 2 ⇒ 1 + ┗━━━ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ┣━━━ 4 ⇒ 2 + ┣━━━ a ⇒ 2 + ┗━━━ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_8.txt b/test/txtfiles/tree_1_2_8.txt new file mode 100644 index 000000000..b39843cad --- /dev/null +++ b/test/txtfiles/tree_1_2_8.txt @@ -0,0 +1,8 @@ +tree_1_2_8 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ 2 + ┗━━━ 3 ⇒ [2, 3, 4] + ┣━━━ 1 ⇒ 2 + ┣━━━ 2 ⇒ 3 + ┗━━━ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_9.txt b/test/txtfiles/tree_1_2_9.txt new file mode 100644 index 000000000..73dbdd289 --- /dev/null +++ b/test/txtfiles/tree_1_2_9.txt @@ -0,0 +1,26 @@ +tree_1_2_9 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + ┃ ┣━━━ 1 ⇒ 2 + ┃ ┣━━━ 2 ⇒ [3, 4] + ┃ ┃ ┣━━━ 1 ⇒ 3 + ┃ ┃ ┗━━━ 2 ⇒ 4 + ┃ ┗━━━ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaa + ┣━━━ 3 ⇒ c + ┗━━━ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ┣━━━ 2 ⇒ a + ┣━━━ 1 ⇒ ok + ┣━━━ a ⇒ 2 + ┗━━━ test ⇒ [1, 2] + ┣━━━ 1 ⇒ 1 + ┗━━━ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_1.txt b/test/txtfiles/tree_1_3_1.txt new file mode 100644 index 000000000..52b2cb9c9 --- /dev/null +++ b/test/txtfiles/tree_1_3_1.txt @@ -0,0 +1,8 @@ +tree_1_3_1 + `---- nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfds +fsdfd => Dict("n1" => 1, "n2" => 2) + + +---- n1 => 1 + + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_10.txt b/test/txtfiles/tree_1_3_10.txt new file mode 100644 index 000000000..3f0f30fee --- /dev/null +++ b/test/txtfiles/tree_1_3_10.txt @@ -0,0 +1,2 @@ +tree_1_3_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_11.txt b/test/txtfiles/tree_1_3_11.txt new file mode 100644 index 000000000..3c2d36419 --- /dev/null +++ b/test/txtfiles/tree_1_3_11.txt @@ -0,0 +1,2 @@ +tree_1_3_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_12.txt b/test/txtfiles/tree_1_3_12.txt new file mode 100644 index 000000000..8a6107628 --- /dev/null +++ b/test/txtfiles/tree_1_3_12.txt @@ -0,0 +1,7 @@ +tree_1_3_12 + +---- 1 => print + `---- 2 => :((x, y)) + `---- 1 => (x, y) + +---- 1 => x + `---- 2 => y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_2.txt b/test/txtfiles/tree_1_3_2.txt new file mode 100644 index 000000000..a4e3f9040 --- /dev/null +++ b/test/txtfiles/tree_1_3_2.txt @@ -0,0 +1,8 @@ +tree_1_3_2 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n1" => 1, "n2" => 2) + +---- n1 => 1 + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_3.txt b/test/txtfiles/tree_1_3_3.txt new file mode 100644 index 000000000..6c6c3af93 --- /dev/null +++ b/test/txtfiles/tree_1_3_3.txt @@ -0,0 +1,10 @@ +tree_1_3_3 + +---- leaf => 2 + +---- nested => Dict("n1" => 1, "n2" => 2) + | +---- n1 => 1 + | `---- n2 => 2 + +---- canopy => test + +---- leafme => v + +---- ["a"] => test + `---- leaf2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_4.txt b/test/txtfiles/tree_1_3_4.txt new file mode 100644 index 000000000..ce22da3cb --- /dev/null +++ b/test/txtfiles/tree_1_3_4.txt @@ -0,0 +1,26 @@ +tree_1_3_4 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + +---- aleaf => unbeliefable + `---- leaflet => level 3level 3level 3level +3level 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_5.txt b/test/txtfiles/tree_1_3_5.txt new file mode 100644 index 000000000..c0de41189 --- /dev/null +++ b/test/txtfiles/tree_1_3_5.txt @@ -0,0 +1,20 @@ +tree_1_3_5 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + +---- adict => Dict("x" => 2) + | `---- x => 2 + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + +---- sodeep => Dict("a" => 4) + | `---- a => 4 + +---- aleaf => unbeliefable + `---- leaflet => level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_6.txt b/test/txtfiles/tree_1_3_6.txt new file mode 100644 index 000000000..f5e4b4ecc --- /dev/null +++ b/test/txtfiles/tree_1_3_6.txt @@ -0,0 +1,8 @@ +tree_1_3_6 + +---- 3 => OrderedDict(3 => 8, 1 => "a") + | +---- 3 => 8 + | `---- 1 => a + `---- 2 => OrderedDict(3 => 8, 1 => "a") + +---- 3 => 8 + `---- 1 => a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_7.txt b/test/txtfiles/tree_1_3_7.txt new file mode 100644 index 000000000..2bff133f2 --- /dev/null +++ b/test/txtfiles/tree_1_3_7.txt @@ -0,0 +1,7 @@ +tree_1_3_7 + +---- 2 => 1 + `---- 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1) + +---- 4 => 2 + +---- a => 2 + `---- b => 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_8.txt b/test/txtfiles/tree_1_3_8.txt new file mode 100644 index 000000000..5f1d16cb4 --- /dev/null +++ b/test/txtfiles/tree_1_3_8.txt @@ -0,0 +1,8 @@ +tree_1_3_8 + +---- 1 => 1 + +---- 2 => 2 + `---- 3 => [2, 3, 4] + +---- 1 => 2 + +---- 2 => 3 + `---- 3 => 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_9.txt b/test/txtfiles/tree_1_3_9.txt new file mode 100644 index 000000000..d078d9fbe --- /dev/null +++ b/test/txtfiles/tree_1_3_9.txt @@ -0,0 +1,26 @@ +tree_1_3_9 + +---- 1 => 1 + +---- 2 => Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + | +---- 1 => 2 + | +---- 2 => [3, 4] + | | +---- 1 => 3 + | | `---- 2 => 4 + | `---- 3 => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaa + +---- 3 => c + `---- 4 => OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + +---- 2 => a + +---- 1 => ok + +---- a => 2 + `---- test => [1, 2] + +---- 1 => 1 + `---- 2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2.txt b/test/txtfiles/tree_2.txt deleted file mode 100644 index d74e91bc5..000000000 --- a/test/txtfiles/tree_2.txt +++ /dev/null @@ -1,9 +0,0 @@ - tree -━━━━━━ - │  - ├── nested2 - │ ├── n1: a - │ └── n2: 2 - └── nested -  ├── n1: 1 -  └── n2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_1.txt b/test/txtfiles/tree_2_1_1.txt new file mode 100644 index 000000000..387e503f8 --- /dev/null +++ b/test/txtfiles/tree_2_1_1.txt @@ -0,0 +1,8 @@ +tree_2_1_1 + └─ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsd +fd ⇒ Dict("n1" => 1, "n2" => 2) + + ├─ n1 ⇒ 1 + + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_10.txt b/test/txtfiles/tree_2_1_10.txt new file mode 100644 index 000000000..ce609ca06 --- /dev/null +++ b/test/txtfiles/tree_2_1_10.txt @@ -0,0 +1,2 @@ +tree_2_1_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_11.txt b/test/txtfiles/tree_2_1_11.txt new file mode 100644 index 000000000..577ba2be9 --- /dev/null +++ b/test/txtfiles/tree_2_1_11.txt @@ -0,0 +1,2 @@ +tree_2_1_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_12.txt b/test/txtfiles/tree_2_1_12.txt new file mode 100644 index 000000000..5b6e8c91a --- /dev/null +++ b/test/txtfiles/tree_2_1_12.txt @@ -0,0 +1,7 @@ +tree_2_1_12 + ├─ 1 ⇒ print + └─ 2 ⇒ :((x, y)) + └─ 1 ⇒ (x, y) + ├─ 1 ⇒ x + └─ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_2.txt b/test/txtfiles/tree_2_1_2.txt new file mode 100644 index 000000000..487b51f45 --- /dev/null +++ b/test/txtfiles/tree_2_1_2.txt @@ -0,0 +1,8 @@ +tree_2_1_2 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n1" => 1, "n2" => 2) + ├─ n1 ⇒ 1 + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_3.txt b/test/txtfiles/tree_2_1_3.txt new file mode 100644 index 000000000..2834e0586 --- /dev/null +++ b/test/txtfiles/tree_2_1_3.txt @@ -0,0 +1,10 @@ +tree_2_1_3 + ├─ leaf ⇒ 2 + ├─ nested ⇒ Dict("n1" => 1, "n2" => 2) + │ ├─ n1 ⇒ 1 + │ └─ n2 ⇒ 2 + ├─ canopy ⇒ test + ├─ leafme ⇒ v + ├─ ["a"] ⇒ test + └─ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_4.txt b/test/txtfiles/tree_2_1_4.txt new file mode 100644 index 000000000..fa1a3c155 --- /dev/null +++ b/test/txtfiles/tree_2_1_4.txt @@ -0,0 +1,23 @@ +tree_2_1_4 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_5.txt b/test/txtfiles/tree_2_1_5.txt new file mode 100644 index 000000000..a908c3001 --- /dev/null +++ b/test/txtfiles/tree_2_1_5.txt @@ -0,0 +1,20 @@ +tree_2_1_5 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ├─ adict ⇒ Dict("x" => 2) + │ └─ x ⇒ 2 + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ├─ sodeep ⇒ Dict("a" => 4) + │ └─ a ⇒ 4 + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_6.txt b/test/txtfiles/tree_2_1_6.txt new file mode 100644 index 000000000..f53661481 --- /dev/null +++ b/test/txtfiles/tree_2_1_6.txt @@ -0,0 +1,8 @@ +tree_2_1_6 + ├─ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + │ ├─ 3 ⇒ 8 + │ └─ 1 ⇒ a + └─ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ├─ 3 ⇒ 8 + └─ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_7.txt b/test/txtfiles/tree_2_1_7.txt new file mode 100644 index 000000000..8a48eff58 --- /dev/null +++ b/test/txtfiles/tree_2_1_7.txt @@ -0,0 +1,7 @@ +tree_2_1_7 + ├─ 2 ⇒ 1 + └─ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ├─ 4 ⇒ 2 + ├─ a ⇒ 2 + └─ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_8.txt b/test/txtfiles/tree_2_1_8.txt new file mode 100644 index 000000000..ca3c49e91 --- /dev/null +++ b/test/txtfiles/tree_2_1_8.txt @@ -0,0 +1,8 @@ +tree_2_1_8 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ 2 + └─ 3 ⇒ [2, 3, 4] + ├─ 1 ⇒ 2 + ├─ 2 ⇒ 3 + └─ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_9.txt b/test/txtfiles/tree_2_1_9.txt new file mode 100644 index 000000000..cb38525ce --- /dev/null +++ b/test/txtfiles/tree_2_1_9.txt @@ -0,0 +1,26 @@ +tree_2_1_9 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + │ ├─ 1 ⇒ 2 + │ ├─ 2 ⇒ [3, 4] + │ │ ├─ 1 ⇒ 3 + │ │ └─ 2 ⇒ 4 + │ └─ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaa + ├─ 3 ⇒ c + └─ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ├─ 2 ⇒ a + ├─ 1 ⇒ ok + ├─ a ⇒ 2 + └─ test ⇒ [1, 2] + ├─ 1 ⇒ 1 + └─ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_1.txt b/test/txtfiles/tree_2_2_1.txt new file mode 100644 index 000000000..c4bdf7203 --- /dev/null +++ b/test/txtfiles/tree_2_2_1.txt @@ -0,0 +1,8 @@ +tree_2_2_1 + ┗━━━ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsf +sdfd ⇒ Dict("n1" => 1, "n2" => 2) + + ┣━━━ n1 ⇒ 1 + + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_10.txt b/test/txtfiles/tree_2_2_10.txt new file mode 100644 index 000000000..14879efe5 --- /dev/null +++ b/test/txtfiles/tree_2_2_10.txt @@ -0,0 +1,2 @@ +tree_2_2_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_11.txt b/test/txtfiles/tree_2_2_11.txt new file mode 100644 index 000000000..40b3c6da1 --- /dev/null +++ b/test/txtfiles/tree_2_2_11.txt @@ -0,0 +1,2 @@ +tree_2_2_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_12.txt b/test/txtfiles/tree_2_2_12.txt new file mode 100644 index 000000000..bd4e590e4 --- /dev/null +++ b/test/txtfiles/tree_2_2_12.txt @@ -0,0 +1,7 @@ +tree_2_2_12 + ┣━━━ 1 ⇒ print + ┗━━━ 2 ⇒ :((x, y)) + ┗━━━ 1 ⇒ (x, y) + ┣━━━ 1 ⇒ x + ┗━━━ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_2.txt b/test/txtfiles/tree_2_2_2.txt new file mode 100644 index 000000000..1a1f44634 --- /dev/null +++ b/test/txtfiles/tree_2_2_2.txt @@ -0,0 +1,8 @@ +tree_2_2_2 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┣━━━ n1 ⇒ 1 + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_3.txt b/test/txtfiles/tree_2_2_3.txt new file mode 100644 index 000000000..0a3a4acc4 --- /dev/null +++ b/test/txtfiles/tree_2_2_3.txt @@ -0,0 +1,10 @@ +tree_2_2_3 + ┣━━━ leaf ⇒ 2 + ┣━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┃ ┣━━━ n1 ⇒ 1 + ┃ ┗━━━ n2 ⇒ 2 + ┣━━━ canopy ⇒ test + ┣━━━ leafme ⇒ v + ┣━━━ ["a"] ⇒ test + ┗━━━ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_4.txt b/test/txtfiles/tree_2_2_4.txt new file mode 100644 index 000000000..cedf1f448 --- /dev/null +++ b/test/txtfiles/tree_2_2_4.txt @@ -0,0 +1,26 @@ +tree_2_2_4 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_5.txt b/test/txtfiles/tree_2_2_5.txt new file mode 100644 index 000000000..b1b5987f3 --- /dev/null +++ b/test/txtfiles/tree_2_2_5.txt @@ -0,0 +1,20 @@ +tree_2_2_5 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ┣━━━ adict ⇒ Dict("x" => 2) + ┃ ┗━━━ x ⇒ 2 + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ┣━━━ sodeep ⇒ Dict("a" => 4) + ┃ ┗━━━ a ⇒ 4 + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_6.txt b/test/txtfiles/tree_2_2_6.txt new file mode 100644 index 000000000..dbc3dda48 --- /dev/null +++ b/test/txtfiles/tree_2_2_6.txt @@ -0,0 +1,8 @@ +tree_2_2_6 + ┣━━━ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + ┃ ┣━━━ 3 ⇒ 8 + ┃ ┗━━━ 1 ⇒ a + ┗━━━ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ┣━━━ 3 ⇒ 8 + ┗━━━ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_7.txt b/test/txtfiles/tree_2_2_7.txt new file mode 100644 index 000000000..078b10205 --- /dev/null +++ b/test/txtfiles/tree_2_2_7.txt @@ -0,0 +1,7 @@ +tree_2_2_7 + ┣━━━ 2 ⇒ 1 + ┗━━━ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ┣━━━ 4 ⇒ 2 + ┣━━━ a ⇒ 2 + ┗━━━ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_8.txt b/test/txtfiles/tree_2_2_8.txt new file mode 100644 index 000000000..a90871991 --- /dev/null +++ b/test/txtfiles/tree_2_2_8.txt @@ -0,0 +1,8 @@ +tree_2_2_8 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ 2 + ┗━━━ 3 ⇒ [2, 3, 4] + ┣━━━ 1 ⇒ 2 + ┣━━━ 2 ⇒ 3 + ┗━━━ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_9.txt b/test/txtfiles/tree_2_2_9.txt new file mode 100644 index 000000000..7ce15be9b --- /dev/null +++ b/test/txtfiles/tree_2_2_9.txt @@ -0,0 +1,26 @@ +tree_2_2_9 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + ┃ ┣━━━ 1 ⇒ 2 + ┃ ┣━━━ 2 ⇒ [3, 4] + ┃ ┃ ┣━━━ 1 ⇒ 3 + ┃ ┃ ┗━━━ 2 ⇒ 4 + ┃ ┗━━━ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaa + ┣━━━ 3 ⇒ c + ┗━━━ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ┣━━━ 2 ⇒ a + ┣━━━ 1 ⇒ ok + ┣━━━ a ⇒ 2 + ┗━━━ test ⇒ [1, 2] + ┣━━━ 1 ⇒ 1 + ┗━━━ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_1.txt b/test/txtfiles/tree_2_3_1.txt new file mode 100644 index 000000000..894c2b3a9 --- /dev/null +++ b/test/txtfiles/tree_2_3_1.txt @@ -0,0 +1,8 @@ +tree_2_3_1 + `---- nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfds +fsdfd => Dict("n1" => 1, "n2" => 2) + + +---- n1 => 1 + + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_10.txt b/test/txtfiles/tree_2_3_10.txt new file mode 100644 index 000000000..60e5b1377 --- /dev/null +++ b/test/txtfiles/tree_2_3_10.txt @@ -0,0 +1,2 @@ +tree_2_3_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_11.txt b/test/txtfiles/tree_2_3_11.txt new file mode 100644 index 000000000..42059bfb1 --- /dev/null +++ b/test/txtfiles/tree_2_3_11.txt @@ -0,0 +1,2 @@ +tree_2_3_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_12.txt b/test/txtfiles/tree_2_3_12.txt new file mode 100644 index 000000000..fc7041198 --- /dev/null +++ b/test/txtfiles/tree_2_3_12.txt @@ -0,0 +1,7 @@ +tree_2_3_12 + +---- 1 => print + `---- 2 => :((x, y)) + `---- 1 => (x, y) + +---- 1 => x + `---- 2 => y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_2.txt b/test/txtfiles/tree_2_3_2.txt new file mode 100644 index 000000000..5a2a036c5 --- /dev/null +++ b/test/txtfiles/tree_2_3_2.txt @@ -0,0 +1,8 @@ +tree_2_3_2 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n1" => 1, "n2" => 2) + +---- n1 => 1 + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_3.txt b/test/txtfiles/tree_2_3_3.txt new file mode 100644 index 000000000..6a6039f99 --- /dev/null +++ b/test/txtfiles/tree_2_3_3.txt @@ -0,0 +1,10 @@ +tree_2_3_3 + +---- leaf => 2 + +---- nested => Dict("n1" => 1, "n2" => 2) + | +---- n1 => 1 + | `---- n2 => 2 + +---- canopy => test + +---- leafme => v + +---- ["a"] => test + `---- leaf2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_4.txt b/test/txtfiles/tree_2_3_4.txt new file mode 100644 index 000000000..74e1e656b --- /dev/null +++ b/test/txtfiles/tree_2_3_4.txt @@ -0,0 +1,26 @@ +tree_2_3_4 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + +---- aleaf => unbeliefable + `---- leaflet => level 3level 3level 3level +3level 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_5.txt b/test/txtfiles/tree_2_3_5.txt new file mode 100644 index 000000000..c60e8b576 --- /dev/null +++ b/test/txtfiles/tree_2_3_5.txt @@ -0,0 +1,20 @@ +tree_2_3_5 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + +---- adict => Dict("x" => 2) + | `---- x => 2 + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + +---- sodeep => Dict("a" => 4) + | `---- a => 4 + +---- aleaf => unbeliefable + `---- leaflet => level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_6.txt b/test/txtfiles/tree_2_3_6.txt new file mode 100644 index 000000000..cb119689f --- /dev/null +++ b/test/txtfiles/tree_2_3_6.txt @@ -0,0 +1,8 @@ +tree_2_3_6 + +---- 3 => OrderedDict(3 => 8, 1 => "a") + | +---- 3 => 8 + | `---- 1 => a + `---- 2 => OrderedDict(3 => 8, 1 => "a") + +---- 3 => 8 + `---- 1 => a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_7.txt b/test/txtfiles/tree_2_3_7.txt new file mode 100644 index 000000000..ba5ff5555 --- /dev/null +++ b/test/txtfiles/tree_2_3_7.txt @@ -0,0 +1,7 @@ +tree_2_3_7 + +---- 2 => 1 + `---- 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1) + +---- 4 => 2 + +---- a => 2 + `---- b => 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_8.txt b/test/txtfiles/tree_2_3_8.txt new file mode 100644 index 000000000..20a8be710 --- /dev/null +++ b/test/txtfiles/tree_2_3_8.txt @@ -0,0 +1,8 @@ +tree_2_3_8 + +---- 1 => 1 + +---- 2 => 2 + `---- 3 => [2, 3, 4] + +---- 1 => 2 + +---- 2 => 3 + `---- 3 => 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_9.txt b/test/txtfiles/tree_2_3_9.txt new file mode 100644 index 000000000..b30846e54 --- /dev/null +++ b/test/txtfiles/tree_2_3_9.txt @@ -0,0 +1,26 @@ +tree_2_3_9 + +---- 1 => 1 + +---- 2 => Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + | +---- 1 => 2 + | +---- 2 => [3, 4] + | | +---- 1 => 3 + | | `---- 2 => 4 + | `---- 3 => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaa + +---- 3 => c + `---- 4 => OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + +---- 2 => a + +---- 1 => ok + +---- a => 2 + `---- test => [1, 2] + +---- 1 => 1 + `---- 2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_3.txt b/test/txtfiles/tree_3.txt deleted file mode 100644 index 43ab9d2f5..000000000 --- a/test/txtfiles/tree_3.txt +++ /dev/null @@ -1,11 +0,0 @@ - tree -━━━━━━ - │  - ├── leaf: 2 - ├── nested - │ ├── n1: 1 - │ └── n2: 2 - ├── canopy: test - ├── leafme: v - ├── ["a"]: test - └── leaf2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_4.txt b/test/txtfiles/tree_4.txt deleted file mode 100644 index 704ff4329..000000000 --- a/test/txtfiles/tree_4.txt +++ /dev/null @@ -1,12 +0,0 @@ - tree -━━━━━━ - │  - ├── nested2 - │ ├── n1: a - │ └── n2: 2 - └── nested -  ├── n3: 3 -  ├── n2: Int64 -  └── deeper -   ├── aleaf: unbeliefable -   └── leaflet: level 3level 3level 3level 3level 3level... \ No newline at end of file diff --git a/test/txtfiles/tree_5.txt b/test/txtfiles/tree_5.txt deleted file mode 100644 index dfbfc8f30..000000000 --- a/test/txtfiles/tree_5.txt +++ /dev/null @@ -1,9 +0,0 @@ - tree -━━━━━━ - │  - ├── 3 - │ ├── 3: 8 - │ └── 1: a - └── 2 -  ├── 3: 8 -  └── 1: a \ No newline at end of file diff --git a/test/txtfiles/tree_6.txt b/test/txtfiles/tree_6.txt deleted file mode 100644 index ba3922eaf..000000000 --- a/test/txtfiles/tree_6.txt +++ /dev/null @@ -1,8 +0,0 @@ - tree -━━━━━━ - │  - ├── 2: 1 - └── 3 -  ├── 4: 2 -  ├── a: 2 -  └── b: 1 \ No newline at end of file diff --git a/test/txtfiles/tree_expr_1.txt b/test/txtfiles/tree_expr_1.txt index 9ce619a48..84f8ccbe2 100644 --- a/test/txtfiles/tree_expr_1.txt +++ b/test/txtfiles/tree_expr_1.txt @@ -1,11 +1,12 @@ - 2x+3y+2 -━━━━━━━━━ - │  - └── 2x+3y+2 (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  ├── 3y (call: *) -  │ ├── 3 -  │ └── y -  └── 2 \ No newline at end of file +2x + 3y + 2 + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + ├─ 3 ⇒ 3y + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 3 + │ └─ 3 ⇒ y + └─ 4 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_2.txt b/test/txtfiles/tree_expr_2.txt index 6d231718c..2d521351a 100644 --- a/test/txtfiles/tree_expr_2.txt +++ b/test/txtfiles/tree_expr_2.txt @@ -1,12 +1,13 @@ - 2x+3+2+2y -━━━━━━━━━━━ - │  - └── 2x+3+2+2y (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  ├── 3 -  ├── 2 -  └── 2y (call: *) -   ├── 2 -   └── y \ No newline at end of file +2x + 3 + 2 + 2y + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + ├─ 3 ⇒ 3 + ├─ 4 ⇒ 2 + └─ 5 ⇒ 2y + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_3.txt b/test/txtfiles/tree_expr_3.txt index 3fec0de41..877340da2 100644 --- a/test/txtfiles/tree_expr_3.txt +++ b/test/txtfiles/tree_expr_3.txt @@ -1,10 +1,11 @@ - 2*x^(3+y) -━━━━━━━━━━━ - │  - └── 2*x^(3+y) (call: *) -  ├── 2 -  └── x^(3+y) (call: ^) -   ├── x -   └── 3+y (call: +) -    ├── 3 -    └── y \ No newline at end of file +2 * x ^ (3 + y) + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ x ^ (3 + y) + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 3 + y + ├─ 1 ⇒ + + ├─ 2 ⇒ 3 + └─ 3 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_4.txt b/test/txtfiles/tree_expr_4.txt index 070710d0b..0d1e005d9 100644 --- a/test/txtfiles/tree_expr_4.txt +++ b/test/txtfiles/tree_expr_4.txt @@ -1,12 +1,14 @@ - (1+1)-2*x^2 -━━━━━━━━━━━━━ - │  - └── (1+1)-2*x^2 (call: -) -  ├── 1+1 (call: +) -  │ ├── 1 -  │ └── 1 -  └── 2*x^2 (call: *) -   ├── 2 -   └── x^2 (call: ^) -    ├── x -    └── 2 \ No newline at end of file +(1 + 1) - 2 * x ^ 2 + ├─ 1 ⇒ - + ├─ 2 ⇒ 1 + 1 + │ ├─ 1 ⇒ + + │ ├─ 2 ⇒ 1 + │ └─ 3 ⇒ 1 + └─ 3 ⇒ 2 * x ^ 2 + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ x ^ 2 + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_5.txt b/test/txtfiles/tree_expr_5.txt index 281a0760d..214d40014 100644 --- a/test/txtfiles/tree_expr_5.txt +++ b/test/txtfiles/tree_expr_5.txt @@ -1,6 +1,5 @@ - mod(22,6) -━━━━━━━━━━━ - │  - └── mod(22,6) (call: mod) -  ├── 22 -  └── 6 \ No newline at end of file +mod(22, 6) + ├─ 1 ⇒ mod + ├─ 2 ⇒ 22 + └─ 3 ⇒ 6 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_6.txt b/test/txtfiles/tree_expr_6.txt index 1d239c457..cb64da4e8 100644 --- a/test/txtfiles/tree_expr_6.txt +++ b/test/txtfiles/tree_expr_6.txt @@ -1,14 +1,17 @@ - 2*x^(3+y)+2z -━━━━━━━━━━━━━━ - │  - └── 2*x^(3+y)+2z (call: +) -  ├── 2*x^(3+y) (call: *) -  │ ├── 2 -  │ └── x^(3+y) (call: ^) -  │  ├── x -  │  └── 3+y (call: +) -  │   ├── 3 -  │   └── y -  └── 2z (call: *) -   ├── 2 -   └── z \ No newline at end of file +2 * x ^ (3 + y) + 2z + ├─ 1 ⇒ + + ├─ 2 ⇒ 2 * x ^ (3 + y) + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x ^ (3 + y) + │ ├─ 1 ⇒ ^ + │ ├─ 2 ⇒ x + │ └─ 3 ⇒ 3 + y + │ ├─ 1 ⇒ + + │ ├─ 2 ⇒ 3 + │ └─ 3 ⇒ y + └─ 3 ⇒ 2z + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ z + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_7.txt b/test/txtfiles/tree_expr_7.txt index cc3f1090d..c45be254c 100644 --- a/test/txtfiles/tree_expr_7.txt +++ b/test/txtfiles/tree_expr_7.txt @@ -1,15 +1,19 @@ - 2x+3*√(3*x^2) -━━━━━━━━━━━━━━━ - │  - └── 2x+3*√(3*x^2) (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  └── 3*√(3*x^2) (call: *) -   ├── 3 -   └── √(3*x^2) (call: √) -    └── 3*x^2 (call: *) -     ├── 3 -     └── x^2 (call: ^) -      ├── x -      └── 2 \ No newline at end of file +2x + 3 * √(3 * x ^ 2) + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + └─ 3 ⇒ 3 * √(3 * x ^ 2) + ├─ 1 ⇒ * + ├─ 2 ⇒ 3 + └─ 3 ⇒ √(3 * x ^ 2) + ├─ 1 ⇒ √ + └─ 2 ⇒ 3 * x ^ 2 + ├─ 1 ⇒ * + ├─ 2 ⇒ 3 + └─ 3 ⇒ x ^ 2 + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_8.txt b/test/txtfiles/tree_expr_8.txt index 68322890d..a10d7c687 100644 --- a/test/txtfiles/tree_expr_8.txt +++ b/test/txtfiles/tree_expr_8.txt @@ -1,6 +1,6 @@ - print(lstrip("test")) -━━━━━━━━━━━━━━━━━━━━━━━ - │  - └── print(lstrip("test")) (call: print) -  └── lstrip("test") (call: lstrip) -   └── test \ No newline at end of file +print(lstrip("test")) + ├─ 1 ⇒ print + └─ 2 ⇒ lstrip("test") + ├─ 1 ⇒ lstrip + └─ 2 ⇒ test + \ No newline at end of file diff --git a/test/txtfiles/trim_renderables_2.txt b/test/txtfiles/trim_renderables_2.txt index 9f9273d08..75bcaf648 100644 --- a/test/txtfiles/trim_renderables_2.txt +++ b/test/txtfiles/trim_renderables_2.txt @@ -1,10 +1,10 @@ ╭─────────────────────... -│ aa bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bb... +│ aa bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bb... ╰─────────────────────... \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt b/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt b/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt b/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt b/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt b/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt new file mode 100644 index 000000000..726637f8d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt b/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt new file mode 100644 index 000000000..94b3fdcca --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt new file mode 100644 index 000000000..c548fdeb8 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt new file mode 100644 index 000000000..94c6d8474 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt b/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt new file mode 100644 index 000000000..726637f8d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt b/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt new file mode 100644 index 000000000..94b3fdcca --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt new file mode 100644 index 000000000..c548fdeb8 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt new file mode 100644 index 000000000..94c6d8474 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt b/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt b/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt b/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt b/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt b/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt new file mode 100644 index 000000000..833377a0f --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt b/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt new file mode 100644 index 000000000..5653ec12d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt new file mode 100644 index 000000000..e06eedc14 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt new file mode 100644 index 000000000..a2195d3f7 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt b/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt new file mode 100644 index 000000000..833377a0f --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt b/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt new file mode 100644 index 000000000..5653ec12d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt new file mode 100644 index 000000000..e06eedc14 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt new file mode 100644 index 000000000..a2195d3f7 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_1.txt b/test/txtfiles/widget_gal_1_1_1.txt new file mode 100644 index 000000000..da0fcdae8 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_1.txt @@ -0,0 +1,20 @@ +╭───────────────────── Widget 1/2 ─────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_1_b.txt b/test/txtfiles/widget_gal_1_1_1_b.txt new file mode 100644 index 000000000..e94c2d834 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_1_b.txt @@ -0,0 +1,20 @@ +╭───────────────────── Widget 2/2 ─────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │   │ │ +│ ╰──────────────────────────── Lines: 1:12 of 14 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_2.txt b/test/txtfiles/widget_gal_1_1_2.txt new file mode 100644 index 000000000..743495298 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_2_b.txt b/test/txtfiles/widget_gal_1_1_2_b.txt new file mode 100644 index 000000000..830fd8fc5 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_2_b.txt @@ -0,0 +1,20 @@ +╭──────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│    │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰──────────────────────────────── Lines: 1:13 of 13 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_1.txt b/test/txtfiles/widget_gal_1_2_1.txt new file mode 100644 index 000000000..17f58e81c --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_1.txt @@ -0,0 +1,40 @@ +╭───────────────────── Widget 1/2 ─────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_1_b.txt b/test/txtfiles/widget_gal_1_2_1_b.txt new file mode 100644 index 000000000..a2bb49d0c --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_1_b.txt @@ -0,0 +1,40 @@ +╭───────────────────── Widget 2/2 ─────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aa   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰──────────────────────────── Lines: 1:14 of 14 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_2.txt b/test/txtfiles/widget_gal_1_2_2.txt new file mode 100644 index 000000000..743495298 --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_2_b.txt b/test/txtfiles/widget_gal_1_2_2_b.txt new file mode 100644 index 000000000..f9ec117af --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_2_b.txt @@ -0,0 +1,40 @@ +╭──────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│    │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰──────────────────────────────── Lines: 1:13 of 13 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_1.txt b/test/txtfiles/widget_gal_2_1_1.txt new file mode 100644 index 000000000..acc082672 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_1.txt @@ -0,0 +1,20 @@ +╭───────────────────────────────── Widget 1/2 ─────────────────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_1_b.txt b/test/txtfiles/widget_gal_2_1_1_b.txt new file mode 100644 index 000000000..266fea8d4 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_1_b.txt @@ -0,0 +1,20 @@ +╭───────────────────────────────── Widget 2/2 ─────────────────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_2.txt b/test/txtfiles/widget_gal_2_1_2.txt new file mode 100644 index 000000000..53c310376 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_2_b.txt b/test/txtfiles/widget_gal_2_1_2_b.txt new file mode 100644 index 000000000..95a899450 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_2_b.txt @@ -0,0 +1,20 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaa   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰────────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_1.txt b/test/txtfiles/widget_gal_2_2_1.txt new file mode 100644 index 000000000..6feca5394 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_1.txt @@ -0,0 +1,40 @@ +╭───────────────────────────────── Widget 1/2 ─────────────────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_1_b.txt b/test/txtfiles/widget_gal_2_2_1_b.txt new file mode 100644 index 000000000..e84dc9ea7 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_1_b.txt @@ -0,0 +1,40 @@ +╭───────────────────────────────── Widget 2/2 ─────────────────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_2.txt b/test/txtfiles/widget_gal_2_2_2.txt new file mode 100644 index 000000000..53c310376 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_2_b.txt b/test/txtfiles/widget_gal_2_2_2_b.txt new file mode 100644 index 000000000..f7fb42223 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_2_b.txt @@ -0,0 +1,40 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaa   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰────────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_inputbox.txt b/test/txtfiles/widget_inputbox.txt new file mode 100644 index 000000000..566e6c533 --- /dev/null +++ b/test/txtfiles/widget_inputbox.txt @@ -0,0 +1,5 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ a │ +│ c │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_1.txt b/test/txtfiles/widget_multiselectmenu_1_1.txt new file mode 100644 index 000000000..3825b0851 --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_1.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_1_b.txt b/test/txtfiles/widget_multiselectmenu_1_1_b.txt new file mode 100644 index 000000000..92d639dad --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_1_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_2.txt b/test/txtfiles/widget_multiselectmenu_1_2.txt new file mode 100644 index 000000000..49e1ab4ea --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_2.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_2_b.txt b/test/txtfiles/widget_multiselectmenu_1_2_b.txt new file mode 100644 index 000000000..e6069f01f --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_2_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_1.txt b/test/txtfiles/widget_multiselectmenu_2_1.txt new file mode 100644 index 000000000..3825b0851 --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_1.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_1_b.txt b/test/txtfiles/widget_multiselectmenu_2_1_b.txt new file mode 100644 index 000000000..92d639dad --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_1_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_2.txt b/test/txtfiles/widget_multiselectmenu_2_2.txt new file mode 100644 index 000000000..49e1ab4ea --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_2.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_2_b.txt b/test/txtfiles/widget_multiselectmenu_2_2_b.txt new file mode 100644 index 000000000..e6069f01f --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_2_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_1_1.txt b/test/txtfiles/widget_pager_1_1_1.txt new file mode 100644 index 000000000..e06559935 --- /dev/null +++ b/test/txtfiles/widget_pager_1_1_1.txt @@ -0,0 +1,20 @@ +╭──── test ──────────────────╮ +│ │ +│ voluptate velit esse   │ +│ cillum dolore eu fugiat   │ +│ nulla pariatur. Excepteu  │ +│ r sint occaecat cupidata  │ +│ t non proident, sunt   │ +│ in culpa qui officia   │ +│ deserun   │ +│ mollit anim id est   │ +│ laborum.Lorem ipsum   │ +│ dolor sit amet, consecte  │ +│ tur adipiscing elit,   │ +│ sed do eiusmod tempor   │ +│ incididunt ut labore │ │ +│ et dolore magna aliqua. │ │ +│ Ut enim ad minim veniam,│ │ +│ quis nostrud exercitati│ │ +│  ... content omitted ...  │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_1_2.txt b/test/txtfiles/widget_pager_1_1_2.txt new file mode 100644 index 000000000..92dc5e1fb --- /dev/null +++ b/test/txtfiles/widget_pager_1_1_2.txt @@ -0,0 +1,20 @@ +╭──── test ──────────────────╮ +│ │ +│ Excepteu  │   │ +│ │ r sint occaecat   │ +│ cupidata  │   │ +│ │ t non proident,   │ +│ sunt   │ │ │ +│ │ in culpa qui officia │ │ +│   │ │ │ +│ │ deserun │ │ +│   │ │ │ +│ │ mollit anim id │ │ +│ est   │   │ +│ │ laborum.Lorem ipsum   │ +│   │   │ +│ │ dolor sit amet,   │ +│ consecte  │   │ +│ │ tur adipiscing elit,   │ +│   │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_2_1.txt b/test/txtfiles/widget_pager_1_2_1.txt new file mode 100644 index 000000000..bfdc3ac46 --- /dev/null +++ b/test/txtfiles/widget_pager_1_2_1.txt @@ -0,0 +1,40 @@ +╭──── test ──────────────────╮ +│ │ +│ ╭──── test ─────────────  │ +│ ─────╮   │ +│ │   │ +│ │   │ +│ │ Excepteu  │   │ +│   │ │ │ +│ │ │ r sint occaecat │ │ +│   │ │ │ +│ │ cupidata  │ │ │ +│   │ │ │ +│ │ │ t non proident, │ │ +│   │   │ +│ │ sunt   │   │ +│ │ │   │ +│ │ │ in culpa qui   │ +│ officia │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ deserun   │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ mollit anim   │ +│ id │ │   │ +│ │ est   │   │ +│   │   │ +│ │ │ laborum.Lorem   │ +│ ipsum   │   │ +│ │   │   │ +│   │   │ +│ │ │ dolor sit amet,   │ +│   │   │ +│ │ consecte  │   │ +│   │   │ +│ │ │ tur adipiscing   │ +│ elit,   │   │ +│   │ +╰────── Lines: 1:36 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_2_2.txt b/test/txtfiles/widget_pager_1_2_2.txt new file mode 100644 index 000000000..2b21e70d7 --- /dev/null +++ b/test/txtfiles/widget_pager_1_2_2.txt @@ -0,0 +1,40 @@ +╭──── test ──────────────────╮ +│ │ +│   │   │ +│ │ │   │ +│   │   │ +│ │ │ Excepteu  │   │ +│   │   │ +│ │   │   │ +│ │ │ │ │ +│ │ │ │ r sint occaecat│ │ +│  │ │ │ │ +│ │   │ │ │ +│ │ │ │ │ +│ │ │ cupidata  │ │ │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ │ t non proident,  │ +│  │ │   │ +│ │   │   │ +│   │   │ +│ │ │ sunt   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ in culpa qui   │ +│   │   │ +│ │ officia │ │   │ +│   │   │ +│ │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ deserun   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │   │   │ +│   │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_1_1.txt b/test/txtfiles/widget_pager_2_1_1.txt new file mode 100644 index 000000000..ab9d9423d --- /dev/null +++ b/test/txtfiles/widget_pager_2_1_1.txt @@ -0,0 +1,20 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│ │ │ │ │ r sint occaecat│ │   │ +│ │  │ │ │ │   │ +│ │ │   │ │ │   │ +│ │ │ │ │ │   │ +│ │ │ │ cupidata  │ │ │ │ │ +│ │ │ │   │ │ │ +│ │ │   │   │ │ │ +│ │ │ │   │ │ │ +│ │ │ │ │ t non proident,  │ │ │ +│ │  │ │   │ │ │ +│ │ │   │   │   │ +│ │   │   │   │ +│ │ │ │ sunt   │   │   │ +│ │   │   │   │ +│ │ │ │ │   │   │ +│ │   │   │   │ +│   │ +╰─────────────────────────────────── Lines: 10:25 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_1_2.txt b/test/txtfiles/widget_pager_2_1_2.txt new file mode 100644 index 000000000..b4790c9aa --- /dev/null +++ b/test/txtfiles/widget_pager_2_1_2.txt @@ -0,0 +1,20 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│   │   │ +│ │ │ │ │ │ │   │ +│   │   │ +│ │ │ │ │ cupidata  │ │ │   │ +│ │ │ │ │ +│ │ │ │ │   │ │ │ +│ │ │ │ │ +│ │ │ │   │   │ │ │ +│ │ │ │ │ +│ │ │ │ │   │ │ │ +│ │ │   │ +│ │ │ │ │ │ t non proident,  │   │ +│ │ │   │ +│ │ │  │ │   │   │ +│ │ │   │ +│ │ │ │   │   │   │ +│   │ +╰─────────────────────────────────── Lines: 10:25 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_2_1.txt b/test/txtfiles/widget_pager_2_2_1.txt new file mode 100644 index 000000000..cea0f2884 --- /dev/null +++ b/test/txtfiles/widget_pager_2_2_1.txt @@ -0,0 +1,40 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│ ╭──── test ───────────────────────────────────────────  │ +│ ─────╮   │ +│ │   │ +│ │   │ +│ │   │   │ +│   │ │ │ +│ │ │ │ │ │ │ │ │ │ +│   │ │ │ +│ │   │ │ │ +│   │ │ │ +│ │ │ │ │ │ cupidata  │ │ │ │ │ +│   │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │ │   │   │ +│ │ │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │   │   │   │ +│ │ │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │ │   │   │ +│ │ │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │ │ t non proident,  │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │  │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │   │   │ +│   │   │ +│   │ +╰──────────────────────────────────── Lines: 1:36 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_2_2.txt b/test/txtfiles/widget_pager_2_2_2.txt new file mode 100644 index 000000000..8b2a03716 --- /dev/null +++ b/test/txtfiles/widget_pager_2_2_2.txt @@ -0,0 +1,40 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│   │   │ +│ │ │   │ +│   │   │ +│ │ │   │   │ +│   │   │ +│ │   │   │ +│ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ │ +│ │ │ │ │ +│ │   │ │ │ +│ │ │ │ │ +│ │ │   │ │ │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ │ │ │ │ cupidata  │ │ │   │ +│ │ │   │ +│ │   │   │ +│   │   │ +│ │ │ │ │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │   │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │ +│   │ +╰─────────────────────────────────── Lines: 10:45 of 80 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_placeholder.txt b/test/txtfiles/widget_placeholder.txt new file mode 100644 index 000000000..65c4887b8 --- /dev/null +++ b/test/txtfiles/widget_placeholder.txt @@ -0,0 +1,5 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_1.txt b/test/txtfiles/widget_simplemenu_1_1_1.txt new file mode 100644 index 000000000..992d93a3c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_1.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_1_b.txt b/test/txtfiles/widget_simplemenu_1_1_1_b.txt new file mode 100644 index 000000000..ecce5659c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_1_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_2.txt b/test/txtfiles/widget_simplemenu_1_1_2.txt new file mode 100644 index 000000000..de17b10ff --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_2.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_2_b.txt b/test/txtfiles/widget_simplemenu_1_1_2_b.txt new file mode 100644 index 000000000..1b084c4d3 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_2_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_1.txt b/test/txtfiles/widget_simplemenu_1_2_1.txt new file mode 100644 index 000000000..fd606be1c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_1.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_1_b.txt b/test/txtfiles/widget_simplemenu_1_2_1_b.txt new file mode 100644 index 000000000..e745283bc --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_1_b.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_2.txt b/test/txtfiles/widget_simplemenu_1_2_2.txt new file mode 100644 index 000000000..961eb332b --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_2.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_2_b.txt b/test/txtfiles/widget_simplemenu_1_2_2_b.txt new file mode 100644 index 000000000..5299d34e6 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_2_b.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_1.txt b/test/txtfiles/widget_simplemenu_2_1_1.txt new file mode 100644 index 000000000..992d93a3c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_1.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_1_b.txt b/test/txtfiles/widget_simplemenu_2_1_1_b.txt new file mode 100644 index 000000000..ecce5659c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_1_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_2.txt b/test/txtfiles/widget_simplemenu_2_1_2.txt new file mode 100644 index 000000000..de17b10ff --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_2.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_2_b.txt b/test/txtfiles/widget_simplemenu_2_1_2_b.txt new file mode 100644 index 000000000..1b084c4d3 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_2_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_1.txt b/test/txtfiles/widget_simplemenu_2_2_1.txt new file mode 100644 index 000000000..8c4778e35 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_1.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_1_b.txt b/test/txtfiles/widget_simplemenu_2_2_1_b.txt new file mode 100644 index 000000000..048376745 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_1_b.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_2.txt b/test/txtfiles/widget_simplemenu_2_2_2.txt new file mode 100644 index 000000000..4f73514cf --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_2.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_2_b.txt b/test/txtfiles/widget_simplemenu_2_2_2_b.txt new file mode 100644 index 000000000..0c9719c6b --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_2_b.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_text_1_1.txt b/test/txtfiles/widget_text_1_1.txt new file mode 100644 index 000000000..0849ba237 --- /dev/null +++ b/test/txtfiles/widget_text_1_1.txt @@ -0,0 +1,3 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ test │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_text_1_2.txt b/test/txtfiles/widget_text_1_2.txt new file mode 100644 index 000000000..220d31c46 --- /dev/null +++ b/test/txtfiles/widget_text_1_2.txt @@ -0,0 +1 @@ +│test \ No newline at end of file diff --git a/test/txtfiles/widget_text_2_1.txt b/test/txtfiles/widget_text_2_1.txt new file mode 100644 index 000000000..686224680 --- /dev/null +++ b/test/txtfiles/widget_text_2_1.txt @@ -0,0 +1,3 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ This is long testThis is long testThis is long testThis is long │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_text_2_2.txt b/test/txtfiles/widget_text_2_2.txt new file mode 100644 index 000000000..8b90b5792 --- /dev/null +++ b/test/txtfiles/widget_text_2_2.txt @@ -0,0 +1,7 @@ +│This is long testThis is long testThis is long testThis is long testTh +│is is long testThis is long testThis is long testThis is long testThis +│ is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long test \ No newline at end of file