From 6873a765628e609badbeb55cc3943a78ec22b4ab Mon Sep 17 00:00:00 2001 From: Hrvoje Varga Date: Sat, 31 Mar 2018 19:22:28 +0200 Subject: [PATCH] write initial version of presentation Signed-off-by: Hrvoje Varga --- .travis.yml | 30 +++ LICENSE | 1 + Makefile | 4 + README.md | 105 +++++++++ presentation/Makefile | 16 ++ presentation/about.tex | 77 +++++++ presentation/bibliography.tex | 6 + presentation/main.beamer.tex | 4 + presentation/main.bib | 211 ++++++++++++++++++ presentation/main.handout.tex | 6 + presentation/main.tex | 14 ++ presentation/openwrt_basics.tex | 147 ++++++++++++ presentation/openwrt_modules.tex | 18 ++ presentation/package_configuration.tex | 45 ++++ presentation/package_list.tex | 13 ++ presentation/preamble.tex | 43 ++++ presentation/resources/Dockerfile | 44 ++++ presentation/resources/menuconfig.png | Bin 0 -> 66543 bytes .../resources/openwrt-composition.pdf | Bin 0 -> 30717 bytes presentation/resources/openwrt-modules.pdf | Bin 0 -> 12334 bytes presentation/title.tex | 14 ++ 21 files changed, 798 insertions(+) create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 presentation/Makefile create mode 100644 presentation/about.tex create mode 100644 presentation/bibliography.tex create mode 100644 presentation/main.beamer.tex create mode 100644 presentation/main.bib create mode 100644 presentation/main.handout.tex create mode 100644 presentation/main.tex create mode 100644 presentation/openwrt_basics.tex create mode 100644 presentation/openwrt_modules.tex create mode 100644 presentation/package_configuration.tex create mode 100644 presentation/package_list.tex create mode 100644 presentation/preamble.tex create mode 100644 presentation/resources/Dockerfile create mode 100644 presentation/resources/menuconfig.png create mode 100644 presentation/resources/openwrt-composition.pdf create mode 100644 presentation/resources/openwrt-modules.pdf create mode 100644 presentation/title.tex diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c3406df --- /dev/null +++ b/.travis.yml @@ -0,0 +1,30 @@ +language: generic + +services: +- docker + +before_install: +- docker pull hvarga/latex-docker + +script: +- docker run --rm -v ${PWD}:/home/latex/work -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --user root --entrypoint make hvarga/latex-docker + +before_deploy: +- git tag "build-$TRAVIS_BUILD_NUMBER" + +deploy: + provider: releases + api_key: + secure: mLUzVIQpVAMybaHzUkjt33CC1HAnOxqCDYDmaW/0XHmOWHgNqxDqmotTDNZIFijxo/kS1dtDEaTdcUp4d4TML7AKdnk7USXwXYQFYWKTqmWo0cjd4lRIj7f2HVfthkxuhdjN8uSz7tLO8R4kM1iJwMF08ph8FMnjvelCNOxwPWQyYLUTVCgTsEfV7ApTJyMpbLZVeF2R4WlX0sofin+ggYN6++BBsXWR15pRjWxDls7BVkoRodtHR5Kf/QqFbHFXQ1WUqsgqEsrkXLE1klxG/a1Rio3hzByMElglA1tZUoq7L26Hz2lJ29PzugW3pwErsuz4N9MSiCDov3xa/hTY35V5uAItleTutp3qQlI4r+NGM6ydkpiRjR+ulxhljlmEYrg65nZZYIdrVTirsS92Duhis0R2rTp0fYXC6bmRF4fb0qVy3Ms+vBPIhogZkJfuyscp4SAqB8OcWqy0CY7w+KSGD89Bf0uBKE4BvrXwJ/sIVPvNLhFETQs24B6QEbiLnUkVnTVBRpoH3/zuqGnKkm3sOKOUHn/G45C1SMWpRgvEPBUPUMUwuqudA6+Zri9X5cyvXu3/37yTxbytu/gHUBV3faIeiF6tA+lO2xNEjiZ5eAuXZefIUXfmJR0LQ6O0ZKWp0uuOIM///RCIMPPAKMGggJrJBRaGfCW0dFUy5xk= + file: + - presentation/build/openwrt-application-development-beamer.pdf + - presentation/build/openwrt-application-development-handout.pdf + overwrite: true + skip_cleanup: true + on: + branch: master + tags: false + +branches: + except: + - /build-[0-9]/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1f089b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bdb2881 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +all: + (cd presentation; make) +clean: + (cd presentation; make clean) diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c8a94f --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +# OpenWrt - Application Development + +[![Build Status](https://travis-ci.org/hvarga/openwrt-application-development.svg?branch=master)](https://travis-ci.org/hvarga/openwrt-application-development) + +The goal of this project is to write a presentation which will help you to learn the basic knowledge about the OpenWrt and its ecosystem so that you can create your own custom application which will run on OpenWrt. + +Presentation itself is written using LaTeX. + +## How to Generate a PDF + +To be able to generate a PDF yourself you have to have quite a large collection of tools. It is highly recommended to use prepared Docker Image. This Docker Image contains everything you need to start working on the presentation. Alternative is to manually install the LaTeX system like TeX Live yourself which is out of scope of this documentation. Follow the sections below to configure your environment using prepared Docker Image. + +### Docker Image + +There is a Docker Image already prepared for you. You need to have a Docker installed before using prepared Docker Image. + +After the Docker is installed, execute following command to get the prepared Docker Image: + +```plain +docker pull hvarga/latex-docker +``` + +And that's it. You can proceed to chapter [Download the Source Materials](#download-the-source-materials). + +For more information about the prepared Docker Image, read the https://github.com/hvarga/latex-docker. + +### Download the Source Materials + +Second step is to download the source materials for the presentation. This can be accomplished using the Git to clone the repository. You need to have Git installed on your system. So, one more tool to install. + +Use your system package manager to install Git or go to http://git-scm.com/downloads and choose your operating system and follow directions. + +Now that you installed the Git, it is time to clone the repository. + +Open up your terminal and enter the following: + +```plain +git clone git@github.com:hvarga/openwrt-application-development.git +``` + +Git will do its magic and you will have the source materials. + +### Generate PDF + +Position yourself in the root folder of cloned repository and execute following command: + +```plain +docker run --rm -v ${PWD}:/home/latex/work -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --entrypoint make hvarga/latex-docker +``` + +You don't have Docker or this Docker Image? Follow [Docker Image](#docker-image) chapter. + +Above command will start the Docker Container out of the Docker Image that you pulled earlier in [Docker Image](#docker-image) chapter. Docker Container will execute `make` and `make` will call `latexmk` which will take care of generating the PDF document. PDF will be stored in the `build/openwrt-application-development.pdf`. Enjoy reading! + +## How to Contribute to the Presentation + +Since this presentation is under the Creative Commons license, everyone is free to share and adapt it. + +So, if you are willing to contribute by correcting grammar mistakes, making structural changes, alter the visual appearance for better readability, supplement some sections or chapters with additional information's that can help out a reader or even writing a new sections or chapters than by any means - contribute. + +### Learn LaTeX + +This presentation is written using the [LaTeX](http://latex-project.org/). So, if you want to contribute to the presentation than, obviously, you need to know LaTeX. Its homepage has a lot of good information's for reading. But if I have to single out just one good book to read, than I would recommend ["The (Not So) Short Introduction to LaTeX2e"](http://ctan.tug.org/tex-archive/info/lshort/english/lshort.pdf). If you don't have the time to invest in learning another technology or you are just too lazy than, please, at least read this recommended book. + +### Configure Environment + +Now to the fun part - in order to contribute, first, follow the [How to Generate a PDF](#generate-pdf) section of this document. Note that if you want to contribute to the presentation than you need to have the Git. Without it, you cannot send me your changes that you made to the presentation. + +Contributions to this presentation will be handled by the Git and the GitHub. So, [create an account](https://github.com/join) on the GitHub if you don't have one already. You will use Git to make versions of your changes and the GitHub [pull requests](https://help.github.com/articles/using-pull-requests) to send me your changes. + +Please, read a bit about the [Git](http://git-scm.com/doc) and the [GitHub](https://help.github.com/) itself before you start with your contributions. + +### Use LaTeX and Vector Drawing Editor + +Docker Image that you pulled earlier in [Docker Image](#docker-image) chapter, besides generating PDF, also comes with a LaTeX editor called [TeXstudio](https://www.texstudio.org/) and vector drawing editor called [Ipe](http://ipe.otfried.org/). + +#### TeXstudio + +To run TeXstudio, execute following command in the root folder of cloned repository: + +```plain +docker run --rm -v ${PWD}:/home/latex/work -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix hvarga/latex-docker --ini-file /home/latex/profile.txsprofile +``` + +If you are experiencing problems with running above command, please read the https://github.com/hvarga/latex-docker. + +After TeXstudio loads, you need to open the `main.tex` file. Presentation root is located in `/home/latex/work` and the `main.tex` is available at `/home/latex/work/presentation/main.tex`. + +`main.tex` is the root document of the project since it contains `\begin{document}` statement. + +#### Ipe + +To run Ipe, execute following command in the root folder of cloned repository: + +```plain +docker run --rm -v ${PWD}:/home/latex/work -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --entrypoint ipe hvarga/latex-docker +``` + +Ipe saves drawings in PDF files which can then be directly included by LaTeX. Ipe also allows you to reopen your existing PDF made by Ipe. Besides this, it has a nice features like object snapping, grouping and aligning. Basic geometry primitives like lines, splines, polygons, circles etc. + +Happy contributing! + +## License + +Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. diff --git a/presentation/Makefile b/presentation/Makefile new file mode 100644 index 0000000..6a2c474 --- /dev/null +++ b/presentation/Makefile @@ -0,0 +1,16 @@ +.PHONY: all pdf clean + +all: clean pdf + +pdf: + git log -1 --format=\\newcommand{\\commitid}{%H} > current_commit.tex + git log -1 --date=iso --format=\\newcommand{\\commitdate}{%ad} >> current_commit.tex + + latexmk -pdf -silent -time -pdflatex="pdflatex -interaction=nonstopmode -synctex=1" -use-make -aux-directory=build --output-directory=build main.beamer.tex + cp build/main.beamer.pdf build/openwrt-application-development-beamer.pdf + + latexmk -pdf -silent -time -pdflatex="pdflatex -interaction=nonstopmode -synctex=1" -use-make -aux-directory=build --output-directory=build main.handout.tex + cp build/main.handout.pdf build/openwrt-application-development-handout.pdf +clean: + rm -rf build + rm -f current_commit.tex diff --git a/presentation/about.tex b/presentation/about.tex new file mode 100644 index 0000000..acefa4f --- /dev/null +++ b/presentation/about.tex @@ -0,0 +1,77 @@ +\section*{About} + +\subsection*{License} +\begin{frame}{License} + \begin{center} + Presentation is written using \LaTeX. Source code is available at \href{https://github.com/hvarga/openwrt-application-development}{GitHub}. + \end{center} + \vfill + \begin{center} + \doclicenseImage + \\ + \doclicenseLongText + \end{center} +\end{frame} + + +\subsection*{Author} +\begin{frame}{Author} + \pause + \begin{itemize}[<+-|alert@+>] + \item Currently employed at \href{http://www.sartura.hr/}{Sartura} on developing tools and systems based on GNU/Linux distribution. + \item Day-to-day assignments include developing programmatic solutions, their integration, testing and documentation. + \item Oriented on a software development using C and Go programming languages. + \item Always open to the possibility of using new open source systems and tools. + \item Advocator of \textit{Open Source} philosophy. + \item Contributor to various open source projects like LLVM, GDB, OpenWrt, MUSL, Sysrepo... + \item \href{https://www.opensource-osijek.org}{Open Source Osijek} co-founder. + \end{itemize} +\end{frame} + +\subsection*{Contact} +\begin{frame}{Contact} + \begin{table} + \begin{tabular}{c l} + \huge \faGithub & \huge \href{https://github.com/hvarga}{hvarga} \\ + \huge \faLinkedin & \huge \href{https://linkedin.com/in/hvarga}{/in/hvarga} \\ + \huge \faEnvelope & \huge \href{mailto:hrvoje.varga@gmail.com}{hrvoje.varga@gmail.com} + \end{tabular} + \end{table} +\end{frame} + +\subsection*{Goal} +\begin{frame}{Goal} + \textbf{Cover the OpenWrt from the application development perspective}. + \pause + \begin{itemize}[<+-|alert@+>] + \item OpenWrt Basics. + \item OpenWrt Modules. + \item Custom Application. + \end{itemize} +\end{frame} + +\subsection*{Requirements} +\begin{frame}{Requirements} + \pause + \begin{itemize}[<+-|alert@+>] + \item Access to the Internet. + \item Basic understanding of a GNU/Linux operating system~\cite{starch-how_linux_works}~\cite{starch-linux_command_line}. + \item Basic understanding of the C programming language~\cite{prentice-c_programming_language}~\cite{wesley-c_primer_plus}~\cite{oreilly-understanding_and_using_c_pointers}. + \item Basic understanding of the GNU make system~\cite{oreilly-managing_projects_with_gnu_make}. + \item Basic understanding of Docker containerization system~\cite{turnbull-the_docker_book}. + \item Basic understanding of Git versioning control~\cite{torvalds-git}~\cite{chacon-pro_git}. + \item Your target device should already be supported by the OpenWrt. + \item Good sense of principles, patterns, designs and methods in software engineering. + \end{itemize} +\end{frame} + +\subsection*{Agenda} +\begin{withoutheadline} + \begin{frame}[allowframebreaks]{Agenda} + \textbf{Part I} + \tableofcontents[part=1, subsubsectionstyle=hide] + + \textbf{Part II} + \tableofcontents[part=2, subsubsectionstyle=hide] + \end{frame} +\end{withoutheadline} diff --git a/presentation/bibliography.tex b/presentation/bibliography.tex new file mode 100644 index 0000000..85c387d --- /dev/null +++ b/presentation/bibliography.tex @@ -0,0 +1,6 @@ +\section*{References} + +\subsection*{Bibliography} +\begin{frame}[allowframebreaks]{Bibliography} + \printbibliography[heading=none] +\end{frame} diff --git a/presentation/main.beamer.tex b/presentation/main.beamer.tex new file mode 100644 index 0000000..3ab411e --- /dev/null +++ b/presentation/main.beamer.tex @@ -0,0 +1,4 @@ +\documentclass[aspectratio=43]{beamer} +\usetheme{Luebeck} +\setbeamercolor{background canvas}{bg=lightgray} +\input{main} diff --git a/presentation/main.bib b/presentation/main.bib new file mode 100644 index 0000000..8968d2b --- /dev/null +++ b/presentation/main.bib @@ -0,0 +1,211 @@ +@online{wikipedia-linksys, + author = {Wikipedia}, + title = {Linksys WRT54G series}, + date = {2018}, + url = {https://en.wikipedia.org/wiki/Linksys_WRT54G_series} +} +@online{wifiplanet-story, + author = {Wi-Fi Planet}, + title = {The Open Source WRT54G Story}, + date = {2005}, + url = {http://www.wi-fiplanet.com/tutorials/article.php/3562391} +} +@online{linux-kconfig, + author = {Linux Developers}, + title = {Kconfig Language}, + date = {2018}, + url = {https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt} +} +@online{gnu-autotools, + author = {Free Software Foundation}, + title = {An Introduction to the Autotools}, + date = {2018}, + url = {https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html} +} +@online{kitware-cmake, + author = {Kitware}, + title = {CMake}, + date = {2018}, + url = {https://cmake.org/} +} +@online{scons, + author = {SCons Foundation}, + title = {SCons}, + date = {2018}, + url = {http://scons.org/} +} +@online{fsf-quilt, + author = {Free Software Foundation}, + title = {Quilt}, + date = {2018}, + url = {http://savannah.nongnu.org/projects/quilt/} +} +@online{buildroot, + author = {Peter Korsgaard}, + title = {Buildroot}, + date = {2018}, + url = {https://buildroot.org/} +} +@online{openwrt-devices, + author = {OpenWrt}, + title = {Table of Hardware}, + date = {2018}, + url = {https://openwrt.org/toh/start} +} +@online{openwrt-requirements, + author = {OpenWrt}, + title = {Supported Devices}, + date = {2018}, + url = {https://openwrt.org/supported_devices} +} +@online{openwrt-packages, + author = {OpenWrt}, + title = {Package Table}, + date = {2018}, + url = {https://openwrt.org/packages/table/start} +} +@online{debian-website, + author = {Debian Project (Software in the Public Interest)}, + title = {Debian}, + date = {2018}, + url = {https://www.debian.org/} +} +@book{starch-how_linux_works, + title = {How Linux Works}, + subtitle = {What Every Superuser Should Know}, + author = {Brian Ward}, + year = {2014}, + publisher = {No Starch Press}, + url = {https://nostarch.com/howlinuxworks2} +} +@book{starch-linux_command_line, + title = {The Linux Command Line}, + subtitle = {A Complete Introduction}, + author = {William E. Shotts Jr.}, + year = {2012}, + publisher = {No Starch Press}, + url = {https://nostarch.com/tlcl} +} +@book{prentice-c_programming_language, + title = {C Programming Language}, + author = {Brian W. Kernighan, Dennis M. Ritchie}, + year = {1988}, + publisher = {Prentice Hall}, + url = {https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628} +} +@book{wesley-c_primer_plus, + title = {C Primer Plus}, + author = {Stephen Prata}, + year = {2013}, + publisher = {Addison-Wesley Professional}, + url = {https://www.amazon.com/C-Primer-Plus-Developers-Library-ebook/dp/B00GWLPX76} +} +@book{oreilly-understanding_and_using_c_pointers, + title = {Understanding and Using C Pointers}, + subtitle = {Core Techniques for Memory Management}, + author = {Richard M Reese}, + year = {2013}, + publisher = {O'Reilly Media}, + url = {http://shop.oreilly.com/product/0636920028000.do} +} +@book{oreilly-managing_projects_with_gnu_make, + title = {Managing Projects with GNU Make}, + subtitle = {Use the Power of GNU Make for Building Anything}, + author = {Robert Mecklenburg}, + year = {2004}, + publisher = { O'Reilly Media}, + url = {http://shop.oreilly.com/product/9780596006105.do} +} +@book{turnbull-the_docker_book, + title = {The Docker Book}, + subtitle = {Containerization is the new virtualization}, + author = {James Turnbull}, + year = {2014}, + publisher = {James Turnbull}, + url = {https://www.dockerbook.com/} +} +@online{openwrt-ubus, + author = {OpenWrt}, + title = {ubus (OpenWrt micro bus architecture)}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/ubus} +} +@online{openwrt-ubox, + author = {OpenWrt}, + title = {ubox}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/ubox} +} +@online{openwrt-libubox, + author = {OpenWrt}, + title = {libubox}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/libubox} +} +@online{openwrt-uci, + author = {OpenWrt}, + title = {The UCI System}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/uci} +} +@online{openwrt-libuci, + author = {OpenWrt}, + title = {UCI (Unified Configuration Interface) - Technical Reference}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/uci?s[]=libuci} +} +@online{lutfi-ubus, + author = {L.M. Lutfi Sh.}, + title = {OpenWRT Modules: U-BUS}, + date = {2018}, + url = {http://technostuff.blogspot.hr/2017/03/openwrt-modules-u-bus.html} +} +@online{lutfi-ubox_ubus, + author = {L.M. Lutfi Sh.}, + title = {OpenWRT Modules (UBOX, UBUS, etc.)}, + date = {2018}, + url = {http://technostuff.blogspot.hr/2017/03/openwrt-modules-ubox-ubus-etc.html} +} +@online{openwrt-log, + author = {OpenWrt}, + title = {System log in OpenWrt}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/howto/log.essentials} +} +@online{openwrt-rpc_guide, + author = {OpenWrt}, + title = {RPC daemon}, + date = {2018}, + url = {https://openwrt.org/docs/guide-developer/rpcd} +} +@online{openwrt-rpc_techref, + author = {OpenWrt}, + title = {rpcd (OpenWrt ubus RPC backend server)}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/rpcd} +} +@online{openwrt-procd, + author = {OpenWrt}, + title = {procd (process management daemon) - Technical Reference}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/procd} +} +@online{torvalds-git, + author = {Linus Torvalds}, + title = {Git}, + date = {2018}, + url = {https://git-scm.com/} +} +@book{chacon-pro_git, + title = {Pro Git}, + author = {Scott Chacon, Ben Straub}, + year = {2014}, + publisher = {Apress}, + url = {https://git-scm.com/book} +} +@online{openwrt-opkg, + author = {OpenWrt}, + title = {OPKG Package Manager}, + date = {2018}, + url = {https://wiki.openwrt.org/doc/techref/opkg} +} diff --git a/presentation/main.handout.tex b/presentation/main.handout.tex new file mode 100644 index 0000000..24a942e --- /dev/null +++ b/presentation/main.handout.tex @@ -0,0 +1,6 @@ +\documentclass[aspectratio=43, handout]{beamer} +\usetheme{Luebeck} +\usecolortheme{seagull} +\usepackage{pgfpages} +\pgfpagesuselayout{4 on 1}[a4paper, border shrink=10mm, landscape] +\input{main} diff --git a/presentation/main.tex b/presentation/main.tex new file mode 100644 index 0000000..121f342 --- /dev/null +++ b/presentation/main.tex @@ -0,0 +1,14 @@ +\input{preamble} + +\begin{document} + \input{title.tex} + \input{about.tex} + + \part{OpenWrt Basics} + \input{openwrt_basics.tex} + + \part{OpenWrt Modules} + \input{openwrt_modules.tex} + + \input{bibliography.tex} +\end{document} diff --git a/presentation/openwrt_basics.tex b/presentation/openwrt_basics.tex new file mode 100644 index 0000000..f2e6c1e --- /dev/null +++ b/presentation/openwrt_basics.tex @@ -0,0 +1,147 @@ +\section{OpenWrt Overview} + +\subsection{Project Information} +\begin{frame}{Project Information} + \pause + \begin{itemize}[<+-|alert@+>] + \item OpenWrt is an open source meta-distibution and platform/framework for embedded devices. + \item Named after Linksys WRT54G and based on its firmware source code and the uClibc buildroot project~\cite{wikipedia-linksys}~\cite{wifiplanet-story}. + \item Today, OpenWrt supports over 1300 devices. + \item No formal legal entity behind the project, but supported by all major players. + \item Version 17.01.4 is the current stable release. + \end{itemize} +\end{frame} + +\subsection{Technical Information} +\begin{frame}{Technical Information} + \pause + \begin{itemize}[<+-|alert@+>] + \item Open source GNU/Linux distribution (\url{https://openwrt.org/}). + \item Small and modular design. + \item Relatively low hardware constraints. Minimum 4 MB flash and 32 MB RAM~\cite{openwrt-requirements}. + \item Supports over 1300 devices (ARM, MIPS, x86, PowerPC, AVR32, ARC)~\cite{openwrt-devices}. + \item Pre-assembled images at disposal (\url{https://downloads.openwrt.org/}). + \item Package management (opkg), process management (procd), RPC (ubusd), web interface (luci), unified configuration interface (uci), network interface (netifd). + \item Large number of available packages (> 3500)~\cite{openwrt-packages}. + \item Custom application without the need to re-build entire firmware. + \item OTA update (sysupgrade). + \end{itemize} +\end{frame} + +\subsection{Why OpenWrt?} +\begin{frame}{Why OpenWrt?} + \pause + \begin{itemize}[<+-|alert@+>] + \item \href{https://openwrt.org/reasons_to_use_lede}{Official} reasons to use OpenWrt. + \item Superior to the stock firmware of a router or embedded device. + \item \textbf{OpenWrt is a platform/framework for IoT projects.} + \end{itemize} +\end{frame} + +\section{OpenWrt Structure and Design} + +\subsection{Highlevel Overview} +\begin{frame}{Highlevel Overview} + \pause + \begin{itemize}[<+-|alert@+>] + \item OpenWrt = GNU/Linux + Network Applications + OpenWrt Modules. + \item OpenWrt doesn't include complete source code. + \item Composed of externaly referenced components. + \item Consists of toolchain, kernel, packages, patches and configuration files. + \item Package feed mechanism. + \end{itemize} +\end{frame} + +\begin{frame}{Highlevel Overview} + \fitframegraphics{openwrt-composition} +\end{frame} + +\subsection{Build System} +\begin{frame}{Build System} + \pause + \begin{itemize}[<+-|alert@+>] + \item Based on Buildroot~\cite{buildroot}. + \item Automates process of porting software to specific hardware. + \item Uses Kconfig~\cite{linux-kconfig} for configuration of features. + \item Provides integrated cross-compiler toolchain. + \item Provides abstraction for Autotools~\cite{gnu-autotools}, CMake~\cite{kitware-cmake}, SCons~\cite{scons}. + \item Provides patch management with Quilt~\cite{fsf-quilt}. + \item Provides download, patch, configure, compile and packaging workflow. + \end{itemize} +\end{frame} + +\section{Building and Running OpenWrt} + +\subsection{Preparing Host} +\begin{frame}{Preparing Host} + \pause + \begin{itemize}[<+-|alert@+>] + \item Build system works on Linux, BSD or macOS operating system. \textbf{Microsoft Windows is NOT supported.} + \item Recommendation is to use Linux distribution, specifically Debian~\cite{debian-website}. + \item \href{https://openwrt.org/docs/guide-developer/build-system/install-buildsystem}{Official} documentation describing OpenWrt build system requirements in details. + \item Personal recommendation is to use a \href{https://github.com/hvarga/openwrt-application-development/blob/master/presentation/resources/Dockerfile}{custom made} Docker Image which includes everything necessary for building OpenWrt. + \item Download OpenWrt project source code. + \begin{itemize} + \item \inlinecode{git clone https://git.openwrt.org/openwrt/openwrt.git} + \end{itemize} + \item Checkout latest stable version. + \begin{itemize} + \item \inlinecode{git checkout v17.01.4} + \end{itemize} + \end{itemize} +\end{frame} + +\subsection{Configuring Build System} +\begin{frame}{Configuring Build System} + \pause + \begin{itemize}[<+-|alert@+>] + \item Prepare package feed. + \begin{itemize} + \item \inlinecode{cp feeds.conf.default feeds.conf} + \end{itemize} + \item Update package index based on the information available in the feeds. + \begin{itemize} + \item \inlinecode{./scripts/feeds update -a} + \end{itemize} + \item Make all packages in feeds available in the configuration menu. + \begin{itemize} + \item \inlinecode{./scripts/feeds install -a} + \end{itemize} + \item Start the build system configuration interface and select target platform, packages to be compiled, packages to be included in the firmware file, kernel options, and much more. + \begin{itemize} + \item \inlinecode{make menuconfig} + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame}{Configuring Build System} + \fitframegraphics{menuconfig} +\end{frame} + +\begin{frame}{Configuring Build System} + Example of targets and its usage. + \pause + \begin{itemize}[<+-|alert@+>] + \item Dedicated hardware. Example, choose \inlinecode{Broadcom BCM27xx} for Target System and \inlinecode{BCM2710} for Subtarget to configure build system for Raspberry Pi 3. + \item Virtualized using QEMU. Example, choose \inlinecode{MIPS Malta CoreLV board (qemu)} for Target System to get a QEMU compatible image. + \item Containerized environment using Docker. Example, choose \inlinecode{x86} for Target System to get an image which can be imported into Docker. + \end{itemize} +\end{frame} + +\subsection{Building and Running Image} +\begin{frame}[fragile]{Building and Running Image} + \pause + \begin{itemize}[<+-|alert@+>] + \item It is assumed that you have choosen \inlinecode{MIPS Malta CoreLV board (qemu)} for Target System. + \item Build the final image. + \begin{itemize} + \item \inlinecode{make} + \end{itemize} + \item Images can be found under the \inlinecode{./bin/targets/} directory. For \inlinecode{MIPS Malta CoreLV board (qemu)}, images are stored in \inlinecode{.bin/targets/malta/le/}. + \item Run the image in QEMU. + \begin{itemize} + \item \inlinecode{cd ./bin/targets/malta/le} + \item \inlinecode{qemu-system-mipsel -kernel lede-malta-le-vmlinux-initramfs.elf -nographic} + \end{itemize} + \end{itemize} +\end{frame} \ No newline at end of file diff --git a/presentation/openwrt_modules.tex b/presentation/openwrt_modules.tex new file mode 100644 index 0000000..3879107 --- /dev/null +++ b/presentation/openwrt_modules.tex @@ -0,0 +1,18 @@ +\section{Modules Overview} + +\subsection{Core Modules} +\begin{frame}{Core Modules} + \pause + \begin{description}[<+-|alert@+>] + \item[ubus] Sofware communication bus which provides communication between various daemons and applications in OpenWrt~\cite{openwrt-ubus}~\cite{lutfi-ubus}~\cite{lutfi-ubox_ubus}~\cite{openwrt-rpc_guide}~\cite{openwrt-rpc_techref}. + \item[ubox] General purpose library which provides features like an event loop, binary blob message formatting and handling, linked list, and some JSON helpers~\cite{openwrt-ubox}~\cite{openwrt-libubox}~\cite{lutfi-ubox_ubus}~\cite{openwrt-log}. + \item[uci] Configuration interface aimed to centralize the configuration of OpenWrt~\cite{openwrt-uci}~\cite{openwrt-libuci}. + \item[procd] Process manager~\cite{openwrt-procd}. + \item[opkg] Package manager~\cite{openwrt-opkg}. + \end{description} +\end{frame} + +\subsection{Logical Structure} +\begin{frame}{Logical Structure} + \fitframegraphics{openwrt-modules} +\end{frame} diff --git a/presentation/package_configuration.tex b/presentation/package_configuration.tex new file mode 100644 index 0000000..a840d88 --- /dev/null +++ b/presentation/package_configuration.tex @@ -0,0 +1,45 @@ +\definecolor{dkgreen}{rgb}{0,0.6,0} +\definecolor{gray}{rgb}{0.5,0.5,0.5} +\definecolor{mauve}{rgb}{0.58,0,0.82} +\definecolor{lbcolor}{rgb}{0.9,0.9,0.9} + +\lstset{ + showstringspaces=false, + columns=flexible, + basicstyle={\small\ttfamily}, + numbers=left, + frame=shadowbox, + numberstyle=\small\ttfamily\color{black!60}, + keywordstyle=\color{blue}, + commentstyle=\color{dkgreen}, + stringstyle=\color{mauve}, + breaklines=true, + breakatwhitespace=true, + tabsize=4, + autogobble=true, + rulesepcolor=\color{blue} +} + +\hypersetup { + bookmarksopen=true, + bookmarksopenlevel=4, + colorlinks, + linkcolor=., + citecolor=blue +} +\setcounter{tocdepth}{4} + +\addbibresource{main.bib} + +\WarningFilter{biblatex}{Patching footnotes failed} + +\graphicspath{ {resources/} } + +\setbeamertemplate{frametitle continuation}{} + +\lstset{ + basicstyle=\ttfamily, + %columns=fullflexible, + breaklines=true, + postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space} +} diff --git a/presentation/package_list.tex b/presentation/package_list.tex new file mode 100644 index 0000000..df8c5bf --- /dev/null +++ b/presentation/package_list.tex @@ -0,0 +1,13 @@ +\usepackage{listings} +\usepackage{lstautogobble} +\usepackage{FiraSans} +\usepackage{FiraMono} +\usepackage[T1]{fontenc} +\usepackage[type={CC},modifier={by-sa},version={3.0},]{doclicense} +\usepackage[backend=biber, sorting=none]{biblatex} +\usepackage{silence} +\usepackage{graphicx} +\usepackage{fontawesome} +\usepackage[utf8]{inputenc} +\usepackage{listings} +\usepackage[most]{tcolorbox} diff --git a/presentation/preamble.tex b/presentation/preamble.tex new file mode 100644 index 0000000..19aa404 --- /dev/null +++ b/presentation/preamble.tex @@ -0,0 +1,43 @@ +\input{package_list} +\input{package_configuration} + +\title{OpenWrt} +\subtitle{Application Development} +\author{Hrvoje Varga} +\date{} + +\beamertemplatenavigationsymbolsempty +\setbeamertemplate{bibliography item}{\insertbiblabel} +\useoutertheme{infolines} + +\AtBeginPart +{ + \begin{frame}[plain] + \partpage + \end{frame} +} + +\AtBeginSection[] +{ + \begin{withoutheadline} + \begin{frame} + \frametitle{Outline} + \tableofcontents[currentsection,sectionstyle=show/shaded,subsectionstyle=show/show/hide,subsubsectionstyle=show/show/hide/hide] + \end{frame} + \end{withoutheadline} +} + +\makeatletter +\newenvironment{withoutheadline}{ + \setbeamertemplate{headline}[default] + \def\beamer@entrycode{\vspace*{-\headheight}} +}{} +\makeatother + +\newcommand{\fitframegraphics}[1] { + \centerline{\includegraphics[width=\textwidth, height=0.8\textheight, keepaspectratio]{#1}} +} + +\newcommand{\inlinecode}[1] { + \lstinline!#1! +} diff --git a/presentation/resources/Dockerfile b/presentation/resources/Dockerfile new file mode 100644 index 0000000..118f6c3 --- /dev/null +++ b/presentation/resources/Dockerfile @@ -0,0 +1,44 @@ +# Based on requirements [1], start from Debian 9.3. +# [1] https://openwrt.org/docs/guide-developer/build-system/install-buildsystem +FROM debian:9.3 + +LABEL maintainer="hrvoje.varga@gmail.com" +LABEL build="docker build -t hvarga/openwrt-builder ." +LABEL run="docker run -it --rm -v ${PWD}:/home/openwrt/work hvarga/openwrt-builder" + +# Install OpenWrt build dependancies listed in the official requirements [1]. +RUN apt-get update -q && DEBIAN_FRONTEND=noninteractive apt-get install -qy \ + build-essential \ + libncurses5-dev \ + gawk \ + git \ + subversion \ + libssl-dev \ + gettext \ + zlib1g-dev \ + unzip \ + wget \ + python \ + file + +# Install QEMU so that we can run OpenWrt image as a virtualized machine. +RUN DEBIAN_FRONTEND=noninteractive apt-get install -qy qemu + +# Install a text editor. +RUN DEBIAN_FRONTEND=noninteractive apt-get install -qy vim + +# Cached packages are not needed anymore and they just increase the image size. +# Remove cached packages. +RUN rm -rf /var/lib/apt/lists/* + +# Official requirements [1] state that we should do everything as normal user. +# root user or sudo must not be used. +# Add unprivileged user which will be used to build OpenWrt. +RUN useradd openwrt --create-home --uid 1000 + +# Switch to the unprivileged user and set default working directory. +USER openwrt +WORKDIR /home/openwrt/work + +# Configure BASH as an entrypoint. +ENTRYPOINT ["bash"] \ No newline at end of file diff --git a/presentation/resources/menuconfig.png b/presentation/resources/menuconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..7e055c71ca369e68d84a13ab2d6c21795b149dc3 GIT binary patch literal 66543 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 DxkWCS literal 0 HcmV?d00001 diff --git a/presentation/resources/openwrt-composition.pdf b/presentation/resources/openwrt-composition.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce16789e11f52d634993685abb594ac9bd379218 GIT binary patch literal 30717 zcmeFYV{m2By7wD)(s4SSq~jHJ(y?vZwr$(CZFOwhwr$(So8CTm?^EYgy&rDXt@~xJ zHEKL#&PQ|B`v2xwgi?G0&P>cX7fTfNJfQ^k(Oy9!L&WIX7O-IiN_}hpEKtn@M z|MwB?r}5t=0JPN1v;ay0V>3H_o6k=(Z99EFeO*gEeGU#NTRR(lZF4B6<#4&LOmdc} zlqz)6%GI-+>O<%?OAltUdU&oe=(LXgW25QRj{Q*t^a(PxN~FrF?cI` z^?3Y7U778oDjgTj?H5fGwioONuj9@W&KnyS^3paoQ}uaO?%dxn_KlG$opd`>PLD+Z zAWp4tD3L@ua&l_8*hsJE1BH#gYG67&{T+bPCV+q7vl%hlcOiowFZRr@2zEd|?bKbJ zKO!N5oLZ+G0jZ`ii&7xC=v@6E_hvu%s7U6`B&bkz9|C0v{DIs#2hY9h0EJ` zh6@TwJNGG$3#vEoF~=);{uj`Y4Kx=wQCd2Dwhb;Ed>0;qt&6~_9hzOLxpoSDY9EL; zwomf;#FuR!IlB#C>zcq5_!@AlLB~+IF1qL2A9NfL2VZ!B-6qEkP<)%IINf2QAP%># zoOrRYfM9?+0mV2LF2D;~a7;)9Vl7i>JiJV1a9n}|K)kptK^|1Nkc0?ePHG%K(63E5 z9ie#vKy*RFpl;k>z;rzn1lIs>so@!%s8AsFThh;nK(DtqJC>}&ROlE6Uq1XMFsa8A z#O{~%S}YuPakxoI9S{(5#DQvqS(?4DrBNptr$KoXO5+QNU(Br&lp50)OXFc7KT9C&zvCUmcNr#O`}K@NLs3(^}tI zdVK`RDk0E1p?F^>Oz_fk8RUw1efYU}ZTN|PF-FL|Gn|bOvjdN5 z9X<=dGM9P5vr9@om{ZA<552i9Sz2YQOaUpV?RG^c`CkVFux#UX(~QjMHz_WAXSKkgcCe2)s^P;NB(#zqu0LLG6Y4DJhDs|Q0E1@#)Lp5< zKAmQOAgx-(NLSN|UX&)flbI=7uAhp$SE07K@MJN~Zbeqkv_Rcfe&-gy;+Cyh!MBG^ zm*Q!x&G=wF_&qx}B{hEqpL;=jvoDC_LC>~cZOG;71>=dSP~P}J z;-16%W-WE#wox|Z^t^e@G%=B!JV9fnk>U(`zy{rhF@PsV2oF9Ki~UNUB_b+hzKo;Q zqn?|5N=(Jt+H*UJY>3vK-iHwg7Ef9BEvBKA9L>3$xeMDkZZQhqy>eTxnCn65CGdAP zs$i2nYepj9vzm$AuO>2U_lFuk>8X;|5LaqTl&-4G`qMd@l0pYXbn=0ahO)s9iw(}^ zQ-#~C!Wdt@DJK)d^cqpVkb*a}*Q7fYA>3GnE@5xz()e(^j6HJfSJ{<^JaA%> zzn)jpPUSE;GG1}+u4oW1Mp9pXTrnyoY$Kre^FeWyYUY)Pb+F4C(-r&b-V`b-f^>qIAIkXTjx>`L zpMm|Ws5eSJJjsNlG7;R1Il6dlBNpvKzgh0WU69p5xpmRp?~Do3b56S7o2O@()rEOq z%lFD^Z-`X5of+X`t>{f4Bhpv46dhg9T4~X89(Gh}W_7mD-|Jp_xm4!H%*~&n+;7Rpj)-!hB&ojp6s`~ntTkB5#RRxvekW)W&XL@2A+&#Stp?vOwck2s=)z$TwX6{);h zqQ_+&C;yEePU$pbK98GdP&?%sULiH?KUH~~46GWu2op|~f-vEKLFT6CQ=+HTC=ls* zZ!RtAiciY9)L*ps$VXeS|LglH8+v4$?A`JUm3#(=o&}`SQz{2CQ^&Xjr ziF)&C4HwPu#8i7$Gg1%5A=m1ge0^QCHujwMcG_#>GQ z28bFwa23WRSv|0He;`|SvBtEs6LPB}h=s2NksDA7MaG>#?`BfGs+f+Zw(JIb)>WuJ zr2o+0y;Rn#P<<85U-K9p@vWCGBZU28Q!c1wWUD8y+H8^j>a8}RB-SGjF@ktG{z@|L z8f$w2od-o@v1}l*W-ClnK0Z+y!x2ji@-u?Zus6du!*$3FCh1$ryIHrnZDNzH7_;kG zs6p@|bOXEkwFvYrnkFS2a>!y})A-Q!&}w=@sW~JihRq31sgjDtnw)*pq6Re|W{16N z$f5jEPHMMUq2|wWxA3IHI0L@xx*>c2g#<~HjIS*r6EsD!r!I!~jEn0Oz)TZFIBbV1 zo1C?G8v-%Lit}Mt>Auv>v>{yz8=v!dXtBtCcFv<9W)HToQF{%Hs0U^?_yX$Qq3`>E24UJ>AZ5!>XIJ2>c(>dJ6 zzWqMvk2#xL(kqQ!{RgwBj+qEP4BrrK{XE?dHI|f|9NWUtvvX+cy+BZuvF(roQ8~0C zVgLGtJLh_S!G&i(RiklDg_$bG(z%s~J2oR7!2E4gM9Bl#nV6)iSCYcg&uC^%(Ctin z>~$hc?b6UnA5%-cB`u6oj)$~6b0&&4GL-wgO~UUkSroF_W@7Bq-R#n54$zi2u+{4cESeWu)}|Yw%7}MIEqeK}ud4{^o~y&C)D_*omGNyP97* zm*SSCA=h2tW9G_Msm3bNM`U6J|1wN}pa52``c3#(8)HR%uI9ChN&gzKe5~wtgA55s z)X(21&vnM3H@6Gv*O5f+_2e$j?6~^O_W?Hwfd4&YbRW}hR|)$7@SE`(YsVPTNDhopp8w>#F5Cw?9Hcn#uIh) zDugxic30!z3CruG^0zvGQ$;wgq4X{E{;EL$pWi;^4HVNqWsaP)mHww-v9z$`)3?>N zF}AX^{3BpK#}eA+pELa8;wqy2q`cyCa?~_`Q8tFQ0J^_g@bFkV0aVGU0pv8abO3r9 zIsgMRy*hxB+g4ZK!VbVdO%0&r)wUASH#Ri-+wjjt{>+in(0rav*iPHbSeM(v&`kf2 zmXfv8H&*~Kd;>+t}LuDFJ|y`BUy{|7}1`%>bZOG}f~-vIYD}_rGNSv+Vy+(SNznr>6XBYl4`OEUpn8mg2Y>Yp9^^a#%fWI6+EoAgq3aQ?Tq~jzZLTNvQ>j1pMfn?wXrJ;EJL^ z^D!c@w^sx^=(aV8d3I0&@KMEGA$Q3D)mU{K^mTvD01faN!=uPL1}Wz7HR<#MaQOmq zJA#wEfJ>FQAt9Kex(s0a{R!+v!*EErUSF+sk~=)Tzo;Tfg@?h^8g_d#!=nJqP@piC z8aYSt74&KvJHd7Fsj#2LphyF2f5b?!bJwBcAC@~44+%0w@=26 zF?t4@6;qTsGsZ7T#50+!g_0V6^+-ndo%_v;vfJM~7B)64aC6zq-=-j#tQ-MoG641YOjR;(hGt=I9Q|a%SD^`MbImR24+IMCA zwsTpK;$Yj!lSmDQ>+X5{f%EuHymKpvQp`yKK4*q5NiX2b6$ji6VdK2^o zm-tB3p&RC9Txa_dTnO^g3-U}FnC{K(eT9E8)Hi!|lJYkBCZ9=(x@@hi&Vcp(w5GC? zhbsvV>u}P}*sEL+;#oid@VY`UPNr85c_^BPbsP$uyQC5<{@k*j)wHvagaIplX-**+ zHc19U*Dkb*l*4Pb&HvWn&w+Hkam${*=PCS}3BDB6xQf=$ANIkyN`~DHn~skVgS_SU zibbUZIq500wz(8-@5LMx^dMP*HICQciFvo`GIECI|S2l*TrnMCRUWNiugm3_QXOUJBTeF|M)H|^*tXX*}E6rklF1K<&$W5M#1 z4(8tN#HEG$@|`ARiw_de3=Pqq-I6a#&S(?!&G?VwhoS3D^l+ zMfTBmt&MviF@c|Je3M}=cbkhis36&4m;D6woOL^*pv-Z2slnlmZ#x)y|uCv z-Q;&(nG;KxDE<8ff?m;I=;+78qmdN!oXRe1cmu83RihSVR=uSLRQma2CBe1B5Ogkz zbFnby)Vsn(6}g%7U=WlZ*R_}A*fx7@HeTf7ImPe`P- zggW@T*UhWjXQI1`EydjT3XV0qE;YxpJJS;bqTq|>qUJ59qEj}ud3tD!}INq}OSxZYg!zOA3#5Z@ zbd%w7WHEcrrCyl~8C0c2PU&I~O1u3qoWOaHQtD)$S6UL6wU@C{#yi&29siESZ87PCQ^Q1KnMF3XEu<)LlCpFJ zQ$c9w5^#I*8hb*;gV^a-i|i&%L4PjZ);KMZS`pZJea&XjxQU2VZbR{GQ+H#cU^&oF zA9C$Vv6XJS4eMaLVDO}(WNI$l?;E&p>q)LMBwdydwIyrICaj3XtJd5gEm;n5P2;|2 zD>G+6c3)&rZ8!>Z*dP98ij4LkE6G;w9~AFtxL{jf*j2(&gvawFG}!*- zz9|#6mmaPd+isEP1V*yS7hLFzW38YX1&fBYtSYlh5x1UcuHIR~DC&d<8=<4yU<6z8 z>2{{8eJ=YM~*EOmAM=nD-UjLr?&6> z#ne(cw~AXO?drY07d7taw8|H#I21xIuU%SgcFN}+9g%Qe9>MND@F=U?$#8oL-cWM{ zv*3*7ilHbI6JT-cTroA|f zov`d&QE#4B48y3da5bb?s_VJrgNp7OiFxi&R`FB+aZTbCV9oX3EUKQ+83QuoxzOTj zEA*^0x2=oit{^xVBf$=_QZ+MC)yk@+>}E;SY}{MEzm>}hPVKFaDDim)y?6EM3wLG$T!WX=EMlsAu)UeA8uK5-VW>PWL2cr;~Y<^Tv7X*O>7&b9>JgEAK#GX`1dN z@vUIK_-c(tPc}(W|E3^yid{}3H@!EiM7$5&BQs~BjDs?>@qkhmK10RAY_W>`(keAz zHDc`GfmI?+^KG-g$Na&AI^-Fj-=@L4RzT0GJc=^&wuF138-aFFof^qK95 z!plk)(Tj$ghxMq|Z*j*lF<^U|(5KD3!d6ShQ=0fg>YK-gWr1zB`|n*s@l6Jp);i{L zlw)g0g*>l2Gd4O&(RS90L*f?Jld<-K7C9oK_vSvFH!3)&tX14$@#VkqoR7eXXAcdT47Dzs$I1H?skyF-ut;|HmC znX}09Y-nK&R&zuX89>~1E*R>@+P!;`3(I;g31s0a zN>rs??$Hd*>V~`KrP}eaX5-TY6A)1ACge2W`_i?1pcR9^z*Ao2_u$(p?ojg>;=a?4 ztk*PREE(*Zg4xS$CMgrRhaT-SRFS<`yx@=yiSCoK*NsheT-W^8I13yC!MKWHNFJ{y zd*nB$*Qx3&@B}4qC+YkT+J)|)+U2i`?~fY$&p<+)PmEvXuRwz7Q?;0B{~M2>|HC6_ z0Q7Y9pFD#3|C&cIehS_HhDQj05{W-F!j{sG(*9q0#9zeNze-~IzXhmDPfJZf3;6$! zf62f<*#*OYYJh*y`~Su+{vU1dU)zQHPe1)vcJcXk{$JR|rw;xbyP*D4nSZU+zia{c zClX)=eBzG3+WmJ-;BRP+`rp{v{{~*rFi_A@(E}JM80cvJuh_*u9sTe8{7*vv?^FQr zKeG#HS$17n=zp>cQE*#!QCm=6|0uew)+Ya^jO^(AzrqVc4Q^xMs=u=froXa_bo1{X z|Ka}sJFxpN9Oj>~{7=M)=HJlQ|0e0QR1^%f%>VBvotf%?0!IJ)qHC~_Pxg>2| z%PmDj)vIxd1M`&_^6*tB7L26>As%oK_ZMDQVQf8#6I{nUI1i!6Bt}onYE+zra}>@jTzL7m&+^iX~N1Y2@4X60b&_6&TD)g z(2|He=3Ng28^ru$_w-8h*P(xDdO8-^(&Fmss*<;ZL@7dHJQXNyC+w*itP}*ZcUCz7 zx)X;SG|t;0t3y?nKOfjg#W(%k#)yk7ea%Y>VY5#QngL>owau?_QPnHUD{&4O-6jMG z86xUUQ?IWBa@4DX5u&qe`0B#WQ}81i((J>KYH}4*=K!eo0cb@Pn5?TF;1yDfS5nhL zOABOVc?E%JbOPoa4ABhIRnJv}+MSsX3Ouc20<eHKYa zxk9FIi3?m+1G>b@n*A=FN$>-T#&gLLzPXFn0!trZgh2Q-q% zz{Q~@Iyr(WpvGZ`jn2YMK%ynwc{?7Yx6SOoNKYQ0Fm;7$=v>{<_9mLuh>W|UcJ=6!j zxwQ>?33UnL_Rbngg7E5y{1Fsa)8GdL_D*uIpZG3cd9neO_2J6)1Lz}N6zw`k6~XJB zlZH|6K%3Fi+3J-u^lc*QgERaidhdhe=A%q#xo`enlJiZ|?;{e&2%`S(G4(1(74;wy zP0FWL%;)Vx#-7U)w*1>5$f?dlhX%9Z<_KBPlIqgCD}I;6w3cI(Kgr_K>a(QztN#46 z?zmakJwQGP=`k`DytBJ&{GGEsaf{~T(#DmkP3T$@^-$m8-If2Bt8Gvp4sZWZ4>S-@ zHW$3yJu0E~^(9a%lSaW5$nN{^AYil7dxV2TgicXM4j@s;?{|^-$eW;*z#mj^{*S$ac z-XFl4$IqAWk1|PToSUNh4jCWbG9#feWkzOSI|a{GVgpl)$4_0@lSa%lji-h7&& zQG9r(Q6{s$`+e9$?o&t|j)>nLq_w6^c3fsIU_F2|N z>M4(-ZpNpXDR_f3+L7SCEb_a*AHS^K!pqc@D(fbw8%?MbieiIOgfgSPzeBm&h0Ke(aSCT>b(ItXOwQhTezJm+ zjxHPFG(8AG^ht7q@-v%(IH(@Rc#RU*Nschq1Fd1x#f4$P%0l#`2jYi;^ZXQLWHe5$ zAPEO=>u>SRCT7%@`Uy?AphTb#U$GWW=ttU?OX{DSNssg;qvuOPDsf?|6DjO=NlavR z1V^Jt5J6(gYx=q~!%^StoCZ4s(f}OodCNJv`CGmW5yg)}A?M(tBulI7>EkD(01kEe z9V?6+IjGvCuB;yp)IVSl$wf`w4ei-B+_&G8X^S(vE37V#_61}Pv{R|10Ry@LYg`t( z??=BmG|(^wOu%f}G!@ogrGk0tHp$})UmZiCrixIGbQh`fC)-jfVq?-=p~*-{3sPEg zA7Ed)1rZ@@o;7*AJ;Gs!SO^e@6&n$&*<8#s#NrwWSnRT$CC(TMu>)6!r+bLX*Uj=TYeqXgD;^Dt*=YFzXabHc z{mifGZ6SKA(px*ob_$1Z63S`5`KT>=zZolxjx^@G5*-Bs&En7I*O6jN8~l%TAUOky zzZ-0w(U?_)D;n7=yne+~glHW^Z_i*~7Jg_~XD26olSy6WZe>ek=|v_g+awLdiJ2e@ zsTd-v&#|k>2|?_7rZAwV5OGNQikYLD{xtr3|Hl01dAWFI#(Dg#kLWLFQ;G?$(4Ge- z>!x|1@H9wRpm$zthD=`-RXWBN=2ElcQ_P3t&@SrcR1H;08I}EU)NuvSgQ27Bt-QU} z!eto5labjVfts*zqJBadCKFG&(08{PNE0s;Ditf2My*ba;m*?=oq!}A%d(=G_w8I_ zQIOt^e5M$C=kW$h1M-*_=$ehhe8bDIHA&PMLJC1M@(C49KWf8_Km^SDBod>%ldbf5OeO0#f_&+T2CDB{Zv+P(rh7N9` ze{GLhrXlU5w{Yk&PVc>M+ww;xAMQ(XT8ANWI1pwYqUzzcbEvo!h=!5EcX`QQrNl^l zy#ThzJAwJKx*^fJqdYb!TZfd2r8hjU@#9_%Yy2(EB0>^d#AsN*G}t>O|2RbCrM}pt zsMEj6ZV zcA6+*ViI>be?7WgA*)AjF^&5-(s=i9l!~If0gBx6L&)T2%$D2$!XEvo3aU19DsBHl zc)`s_yXPKJ_{6bM`t;4QKqS-2_BsQClFTkcbDmoE9+iTTiiSs1ash!gM=6ztXBapvd&m>kgkbiZ}ZNjo`1obMgwUv?&R`OCwY=9(~9e#PT z1Cj9%_*Q%5!aSf=P1vA`i@y%W@2AP5Mo5A$&z+$<4LQe|122}(X)%mnBxRSt;e3Ap zbGs{2MRR!&qR*5{Lm0^mmk5UxMLIn7#_6)1axUY<`4kU|M%qtyU#l^I3!tuK8HrY6 z^-ytw!q?RcoN!>fvMj%^_`VJ;(~mL9bF_0zgcGKI&~ti+DrH^HxOpAHvEyCc^I>9h zsOi?Mxhtq5IxCE89Vd5cY8rl}@?@;yi@|BMmB4k{hTunm|8Y7rA5}#ux==2O^}QV| zwz-flV*n?;0UK$h;=_QB>p2TJeg|aap3GAIeX@4o; zFS7Q?c)4YZ<;gyz&FM?6uF3R^9edA-AFR1sk@z(s`2#f7u6iK+SttpBMfFHaAPkgN zKrdvL6?8s~d0_In0lMd8clJ!ifuwUHZI{%U^HopY8%mPwGQVKdK`|`~-E(R7^^TbY z<(4(P$0OgTiSlyt4bPBkx4-M7^8NHa&=<4dC>4T76MHT?|6NCan*(%vJ`Oo-GqEKO z6C~0g?Bkf+^o|t#+iCq=aO#V@C-wE*{l-a7r&^TjG+b4(&}s(N9+L*%=?y}RhT-Lr za6cROqql)~yi*xD$hb_c*L?16wp%_VVZFDn^ux)XVh`NTymYAg(oTA2=s0if=HnaD z{x-Yqy+%eY!!XAN=!O{??aFslhg-n z>C|WMam9T~P%kFjg--HJ1VauR=mG@$7nOHdNpzV!s9NhA2O?jE?o5^7tWVWLJBks3 z9af~)oRQjD%m!q)dpvY%FxhND_OgVY6Cb@!$Z4-igRi;*!96bGFKCdGITa*fH|R%l zvX>t$0V%ctW%A9jClUDD2DVZ`kmWn(TJ(fxtzC`F#|@I3}lX7gWPQcB;2j#iWwBn);R_^(s(aYo#%D?ZzTnj7mKx% z6W`eNm!tEWrB~mBc_+3_2wzZ(c1lwMA}DT6wOfUu+Wrs^Kbcwt zV1JSJ%Xx8aYd9^X%q;*F+PHtB(s0jv8v7CK?XGBZV77IO%&88dur$-!PFQxy5hd8~ zIBHqdLX8B*v>Qf{UPnyW6%f8iLt}fLck<)=YBJDq&|E?ulr0iXHb*z|Wn*buBGF81 zBWYwJY>)3A<@AbCXM<&La@wU!p~2Tqv$i(gaXXKUduewj39IwI7Zu`*ck*aYZ7YHF z-Ip(<-q{P4MI*;Gz#2cOoz=Gp$GDLc6_rkTsWcn5FlRZa_>?nR&o6)3Y~$Tgt2V## zDvzC5R!}UOe(^)2^4f)L1%eSLcSKozmh`;yd zDi%>)ad7D#tR4=6$kUNcY=8wDO3WLxU%s1wSA0aB>C`aW-1;&M6_1q9)oXU^O6tn?1~VNGqsWBnwtF%@^?J3=zkuw76Wva$m%e5-<9Mnodb(N3 z@=qR5RSBo;Q?*mJ3}$Z&N{JXfzBU}?EKI?DxrgW^%c(w)b9`7u33L8tIW!h03zlu_ zVHPGwnVq3MP6SQHVlc9f8aTwd4wDrx!o7R(oWOFK<+oj6A8S3D-rBf2l2!#r0Xavj zZmI)Dj($YV&#FP_%>a< z7C8(Y{k^0>Ih|u(E!Gk};j5zG{lYR*j#;mYj>R45u#(JcYsye_PYo;#%&m@4kef}I z1gbfNMr=a_$J<3#kFYX-9PZTGq%{Y0e8%e97C)h0oY$ehe?Sc z*G0wxCfo4cq4ql={4D(SU|yyW-$0HZK+PV6LJWq>pFCvu!&0A2B|?8n7b6liGKa0? z?etA3pV+Lrxe7YU(>)c>H+CY*8u`56CT^&sMv5Jr01!SfVwpA@uS|7pkiLiN{ald| z7ont~vWyQVl~dhgeP2M(TVxXL&1);|{B{y)s$f=hPR=YpEX(;~Sj)suQA!|TH3uSM zU4$v+e!Cm>9R|en!JoQeVl^l~t+*s22EWJy2zu?%sQbM4pf9@uCpmyQvc%6_;Y_jy zE4*#~R) z&f2mtf7kb`AWy~PWr|=RJSc)G?4cGkrll84zGK!|1eMK;ovcVD?`y5Cj{W)#}hjrx;8(*~4KgJ*^yW&{Mm zc5_xlMgf6WLsXfz6nI>ERge%T1TYdVl@i+nUtaUE4{Em8P^P47ymfH$DoN zA&#b`?0V#$GX+8}T9T*GC zJ^1u!y9M3LPBjYY<3%;Al%oi?%+b~%x5#r2Xe_IB$7{so;3qH$z5Mnu#o2WEt+f_I zS6&E15+M$1*Yz)oE7C7TL8WLY7ik+LB5(=MA_2@-&T>PuJ%am{0ADR7zpmGt;S!vV znCXlshVL4(m!a?teT&_2RpnV-+~tEmFHiQ>y49qS(S7Ln`WNr~MTAr-FZ>v1zTZyS$|7N zGDqu%W5Ujq!xkd;O?(K?gJAM{b)ZNcLwv%7|T+$8+l3R>p~AhL>O+N z|Ly9Joi{TGvp|A~1`L|(o=AZ!i=aCl9j`{; zss>)^qXM%{JIb|E{A?~^Z(_7V{V&o&i7R!P(@;Ki-&)3$qcyDD&r?G0-}Bbbg-Cqt z6+|2r!Qx_Oc`JXMoG8Ssl!@?M-lxHevnd`se77e<;dtX8J4&8&=t~vgi=xOmPewMwIrg%+wYK8X9N&#NRJw*= zTO^RRyL|HRYD9yCxQGuDdt;TP`B6CUn~cRLf*Z<2kdYQl`nwb%&vv7REcx z$jm?Es8eLw5;g!>^niOIyVu@u&r zizqino8i>6-Gho9#I_RI(K{VKE;LC@B#n5|N4@wR4<)*~V523xzG7=-Xy@Qyu$D6i zf-u4g*v_$Efbbla8|jvUhZ>6h>M`gdXIp|_UfMkH;BSPO zUe#!BxdD+ei7AoAbMW2)S?N5QN~tb}A;w&8b0p`>zdu7S0Ky^RpDjcb?1(nA-(93- z!(<(jK`mr)ta(U75?3$RnYaKf9^xWYq_yx{wbQQ^&m8z;E{YS0Z!Zo6l~#%zY1D;d zpE`FNsmHQTI?q^p5g_I7;q8?R0R_Oaj(U6x(Dk*#WJ_n?ODC3x!xC7wUrBq)=aLrN zec_p7Wz|2m7Hc{0^_|tvJ z9!%7aN&(RC!Talk?_Soc!$?VH;U8(GVbkP4)3ODUZ{~pmd!)F?J1#-drV#84roopG z!ZC*uW$>;ub1+L8Vh^^n9-gLW)@d#+AOen2<3y=q5j^m&*FGo0C_b;|x#MPVy$zS9aHw;O*d3 zc zpgb0ruG8V5m4uuK)0Czl&m|>2niu3u$hNZ(BJC?hQ+73q z>{_ZA7)jX0ZX+zXIJHBB`!?p&A^i1xcvbm0_er9?SVoEB>&dtufq#e9q9LOHw<%d( z#khd}SJ;I`WA70oX?fBC;Q}nsC4zlG-*mwJ(q&p>k$d=ed$QW$(uCWSm!(@5&0DZ~ zNLA`*Q*%Y%^4ISi_rp-^YqPw^-f{mU{POvLMFHcrRR;3nt7vZZRkW< z1NdHxzb|QNQli2)g)05(YW21+s@S|V@8l}4WJM#R>PXhuQ2R2M;pt{z6$0-jL<-Pv z`Pd5+W<{zy6Ql%JG3K`J{Hn27L^WV>Y;Za;^fivn?MK-vW?ue;wy)f<4T?V^kvPMh z{O9k^7wr<84s(lG4@Ld+;~!kUB|DidNIX{D53w^X0!vg421S}cx;QEdH+O(8=}5Wd zuGQVC#`1~{#)T;&SQU|tP~U=Bj!g!WmC1lE6q%YhdHx$d!L`c3tw{?FM34L(hajfd zgH~Y#?=hm#0z*=j31Lp3`iQ0wQd?TR{ba|DmimC?ju-~iI>k#NB}5tQpd1MbYPK#8 z`A=f?yZBUObhyeAtuqnc@$BS0VoQYBMt*d);x-RDhPFNVarKKO?d$#y)72q7PRhkD zXHj0unovo;;ZM*MkL3xK?vXZB%*8lPndn!Fw(uZe%9%1$Wo#;3q%Z6gicnICf+g)<^ggROv{?SO~3- zG*UiaNJ+aRFdnh9LX_NvixW7TwaNBZ-_8Yl5=(FEQL1CDBk6%Lu$NXC_q=1|Z@Gx5gL5s|(_DQb^eY9w zYo=%7{aqt{xX|dpuOlR=LOrmL-9aS`=?AI^J)i{oio6 z_bfpRLo1GLTn1&?y-3K$cR4ov5%1XUdPEPEy0fE8Ok*Y{0VMM~oCblfSI>8Rm6ORr zPWl8M4B!+A(BxlohmF3W8~d|LkOsZ99UM8g_}N7!*K&;DP!nUAWA{RjP^BKF-b-Qj zKAF55GBs8bz754!{^mY7YPvn~BTmlvQLi7L9wCRya?{d;G`>`TwpRxa@w*N5iJHL! z4hbvbDe~0nht0uiB$sW0lvMTna6j&yF|wYZh!e-E6!MysT(aRf z+wfJa$H(+|5D5-W_?<}o+72w3hck6XgvJ#2?SO_%!bvVuK%_GQw!72Ek?%37@=B5A zF%*8wh5Vw7cn(|NtXq;F|1ClthP*Ctq-LO)YE5$hMd&IRCjq7Zq?9_LasxGG9r7>c zfFf&A{onzumPpe-}p={5GHVMuDj<**SZ#Z9F+1x7q5w%7ozp zBy9p^Q#YTi+tFJ6VPLoNWCrK)B&4IKO<%ew&?^vxq2?`V%8jaD>ZQH3e>v-4QalPL zL{`OTJYgiRVMgD30c!a|u3HOGLqr9$0gMI}SJ5`!`5Rf*|;D^vM@2U9H!AErEEXX?6aU7?yncjLp zHB70vv?C6SbtK@yxX5vVGv0|_SKLS7MLJw1n4Mx*fJ1rpkly2!twUY5*EBu}$g#6=Kl{kr(GKQ0Uo73@>3``V8&6>m0y z9k>z`I1;6jA3e)ie5-3o>74n%ZEd$}+0R;W`)BL#O)l zGHl0VhCKQXGFN6@tCPT8My`@7ql4_g3j*ZhyctF^#8jiUV)HXN??IT4U`EoO=B@bv zwY4g$h*uw%6W~`wg1!JcSc3AY~d0G z1|uWQIL!ziIOArh8X)b#?9P+O>E0_mvKIR6#4Oi2C5_O5h?Pd!5{fhpafoV7k1Y zO6yG0%=@~_;;KP%Nxdp-Ib)taN;DSlmJpH8AE`$its1`6chCEN?t_~(mu)g>V-|Dk z;L+=^tkq>1y2t2E!X#MFZSdNfyPSTTay72am3JH&O}_H9X0S|1Cw5lrCf^d5<%S9k z)6ERgmg+{1Sf?f5H`5XFFNCs^o1*JPM+&W2i@q*F7&t8-PSnv_lv!8e&1EThZUnjc zmTd8AAsp4sgme5ijQ156K9dr|mo%$SW6SvAAa^o~RTr>UUa-*W> zl}(zU&6v2EH=(cI$Fa&M5921&Z+xk6n#^s>Zbg`4~8Dn&qS&9 zsfdnNjY(g}i|P0XvmuzlhrJ3xmsI8+7U_a&`f=CC6;+GP#0EZ!^aiQJX&APzML!8D zt2KJl66a!DWjUSJ6jiZ#p;253weet#x-v1SRl~-iVAfE(K6RR~+Whrf-z%~zJWq1H ztqsnCtDI!Q?$D4eLQYrR6ZWzz#Gg2|;n}|t%u~^&9dps6!}Yy<8twWW`U9tO%jh8HmzinKiwcmvu)R0za6;fq#OvB#F>!;{Dl)bV zI}(LKQEts7R%KLwQ2?x`+(<21!JzMo!NmO%CYBsvJ1!)D63_hU0B~S~?-0l?W3I zs0&L)%pjOepS8#8y$70Zw8lBZ>nLuo>d>7tpXkWih^V4JPE0{!DRt}k${~~50$0Bx zS}MH~h+;VTTnzmql>jBhLPGis*~GdYCgjOaThkSMH?S_{o?bI&Fs3ODb(f&s9vA{L zw254@-}Cv5Gki%>CE^RF5_#sNLZqzzuKwORB|@vLDd^lA5tO+Y0 zOu24Yy5S+!3HGGk2DG@*w1wwn`piU~WKH!Ewp=FgtZ`Q^LSpLeRT`>;PWW`BQm!-{ zr?||L{pX8wF219uxZ7XQex5;oEg-CBtw=gs7vF>1$i=*Mj?sOSPT|A|qU($F-3laS z#h16qh3DIp^z!^%>l_A;UWrL)?VOaihZi2wl<^%bw5_`*Ioq4#-@v0l_n2JyB!9Wh z(TjJPJg+~^01x(HX}8-&LdHc|4eo6$XjJq)Ty-;`5+NCq4-~U#nI-EOJggLJV%Oml zI3pggK0gp}S>aU-5$Z#Q-8<8TcA|_V?#gNR$VZbE9A=$0&1N8_yAkyS(%YGAdrSoM1DT@QefljL21s;gH41;c6p*ws`(<)-S-nztaF~~EG?6swpktfkf zC3$47-dwql7jll=7PS4d_ReqklzD%is)!-bW^vF7+OXWe`H@X_I^ zyjO49#d8Ul9l{!~pX@#%gCOG_X+3mofZ5NkhP{oG_!32?VLi-b!At+L|2xzA$_a%2 z()!EnXJbw6=f%aGRW}tw7|?bfwhz4+aa>-bqb^}zG*6S@V~(1ru#fu?AojfdBvY(w zeNHQ$XGlh;nKAZZfB^3*S%vXR>Sl6bR5GLf)yia*Lw5GEs+B}Sc&z29dUpacTJy}l z_an}_pvkHY;$2x~^eJ*G z-dwXjF~>bZlNrqVu}}nGm}00uW@<&lHEVs`HP^$i9pN!(eSNZ^Y>pb6b~}_3JDu&l zby|sV0z~Aa8GeyH@en5dfaO!hcryCVsOuh`V)up8q$9aXGJOwUvXMSgw9;E&i$%PV zt9V`<817!F(E%$Jyx@7`KAXKxzRk!ZGfpK&3q;sD2e}ziorPS;AuRr)@u`fC#uoigW=&4sAz*?l3yKUJj@m)h){du8*Lvr*G~=0&Q0NAeTlxh%_m>)zVn92y<>C8`Hx6KuR@3{I4T zUG5?eNf%_BL)%7<*YX#2idKwQhEBj%O2@U-ofwZQ+ycWh2>J9}cy42p?$J98Z4$%5 z8wp{bQ1rya^F~Ahj*o8=78kd77Kczrf9;71s#nak9U?d}=Z_({rzeU)3kycnh-luj zNGR}LJUFw~r6EETdLQOy`L3-JxZlb4#E9<_tvkyZ2d4!%>A7nLWgZ>eH?-r~H1EyO?VR#HN0J|pvZqs48! z;^ve#A%Ai_UNnpNZ^oD3p{ahk!#~x<-$GLXR4~FQmu>NiTb zu&V@G7^CcdB>*H=KL*Din8JTY3Hz+{Um1~*Xb4mo0l?d!0EX)y@FD$D(Z4kyp;3RT z0}U}HX|5lb!as~hqGv?7WjORRxlf%sis6DG&LU6^A#D=)<{2mB?MRQ{P1n=XMd^1;Se+u@!#+E7}%e-_+PdFlBO<~Og(IW;5a3AJ9@9%$D{t5IdP~}-?hZ8P zy=~N7j`^n~rx`@1#V6{h-~DcTTXt=)m>o;mZ}w{fTZS*nKK2jF|#|qlkZKgOPvB2BXjr4Ca4e5`_8l z;r}lWMlRl1eM=7;HB$vk@6_+}AI;siR~I;PX@A=zf0|y9pozV+wF%Hc0lGhcRZ~4@hv={HU5-09F=o1POlI*^$ChoogF-<8r}&p0+#nAH z3fqN+gK@6dZ-C&qvVN?50I(pcLXmi;0U4SBNC+Oi79r?2y83Cf|EstCr~!>F1N41PDmZT5JaN}rV8$sjZ|G&PhK1vO?t?Cm-C~n)fG{zQHr^TA#=^kGrmW@ zT9J$2+)N@L%c=SJCBE<8x*$K%<*%M*bZO)@(F-XfPl?nm*n?i#C~;$N(aRrADfj%k z*}rU}AG)IA?uAW?8JFR!qKUreV@xZbAq64X(By)c7l}_2OMsk+Bm^2udI=c6rY2@5 zu7F++i#uqzIn>XW>-OiU8)`2TeR@i)@ILc!q&U`9@pF2wkH*pBG4sU-1MagYF69QD zRU0dHGc7?xotBreO_n3++`6#cp+ak4+!noNbL^##!pX_ehYupXtnZwXX-+%;vf?AB z?;Cqb(pzF7y3dk*SQ-#UhUd-`lkrr#$_79i10P8tI6ddFg!YqY9 zol4 z$rkw}@e&*CDdAQI*Mo(`!wtlli?e>7n{yo16{oh-Mo0771~%n9j#}{2P6e0_=Lknq zI^>Fzw^AkFXYn;LQ#ILA>KQvIbG=*BEOD!MU*Z7c!DvkTxAB2 zLx;cO3Z4CvyO9VRYU~36EqpmKv(mJH7A2{*3w#R^l^uC7LEGi%yF)ZmngRz%%M2SUy;^SHqE-hAX=MB!@zw@rvnJyn~&Jq$2&J zN-t55@80w{T)#=EP80XMNDTV`iZ)Cv^@t3gAlqmV(3$Iy(h?cWiJrQPu$<(ET2Ha{%~1a8p1WkB$QZ z47h>c_L1P75ZR7g2n_#`2L;}V7VOA{!2ko(xBO`Ejyts@$AEX{_&fUmAMnl`bN2uS z-kIm9?^YCNER`+HZA^9;eu0vpU?GeU7>$GjhDX}P$$3YP6o$Z&xQHzp@VtPKArQHQ zz<>)23n2l!1>}@;x$xIAs+zdqXsLJV{L47|>+E6I5GyzX3jA*QP-uWi=+B1S4t*u3 zi5BX*bsZ!TQG!^|+*d9JX3|J-&0_-c$!O_h!V^6-CW_CaW2};&d~iCewZx%rKNLNH zooAV}T%4VI@1f%=o>Sv5$|G}YdN}D;dh&Zly~7HIQ;i)Tj=I@!vfX<5vH$Ib^~k|{ z(Ni5C=C4l0=p92_>FYOHnco!byMAGzQ;mxyw!|*EPO0@hMyUlg$}L>7UU}w7rTuDc zRaZ$M(-E1iDG>;LTIaSK?2D#D zyX8qG;VhlQi)-(fgdm4b8V<7f>$#)-;ss|*J&vL-^?N?^m!-Ep0(vV@u0q#k!QwDJ zzUUD}A0n`-NpLFb*to-L4IS_k z?5~sKZ(j1wt?)+M%xgu>Up8ZNp2VmgB6*+S2klE$|9}|dc~&FSNo~{Ct#q`u>(LgZ zC$KV^%X7=hwf|5_qWh^t_CPzY$cAnEqG}Uu_V$SB>u-Xm4YsNyLSEa|y-gWMy4o^& zlKUlQ@~ozHXbHF5o?OaYHL0v?c(KJGlxmt4!YSBB+mGQWt<%q5sE3!09b7!zl@Cr; zZR?D5Uz*lhENffVN%vbkc8l(*`I_Wh;jLsoQwXet@%DsH7Z@Y}=3jL9SEW$i!uD?X&!*cal z$28A_u!v7IX|KY2z}A&1AkzaiWR!Z7dRXMW5Oenz#38ZNrdr&$8&qojiJ@N?ib(Lg zNk1i<>uqIM=vb$)e3IRMkKtm6vt@g^Gn7;FU8#FX;YV2 zWt6R#cI15dqpZ(Lwp!ca3&Sh#+`-H(sF(;n<%$SDTE>99Hnf;;oPt+YOpuGrS`RL8i`g4{Yhi~UD;^zK&}m%8@^GjZg+gU8(m*jf%jzs_#?7SK+nBz#+&2lDsaGl(YEI&1$8iFC7s-Up6>C<=-OM8-nz5e z{4t=*Tk{o(Ygc5WKhgv(3`a?YNSKsLqQbRpTKp_ThMtRPguHq)HvCz?fb-mPxZty* zV>L@{R1KW|UTcSJTRJFNp9kJPBdja-81-b0RKShU((4+%XeH9&O(fJ8Z&Xf* zf1H6Q&@OmEKUwZ+f8L=@0yeS=<`i4JdOjT)DpS)oTVXZSN!uhv_L0%^N*(^ zyb`IeMkc*vF()dND3)eEYSe2{cEGZE=|<^?v$Qu$iiXKAytcZ#aF+hmQHPA+k`a+* ziQF%bsJ8R%pK)U~-}T{58PG+%mq@BS)_YGmDkOmJ?G4*{PU$c@e@yqa=MD(JSk6&W zYeGycay;L{-IJI{W)dvKWX7eq$a^Q7kIa>O^dTRFv(w^QZzt1h<5B^sR-sVF9;~u$ zItOcTi+%y=Ww=X`+4Dhg^(yQ6R-PDlU+SkP+M5i(w@DR<)f8pb!AA(R<2wEMRIVl5 zCou!L4VX#QI8I-731nAW^R&8|(;uxcHN>m|I?0#86Ddg&T@^%znPuu)7r=_5SS^Rw zN3gKS8$G9)@f*c1y*(tUcZAG%HmgJLG^3wJzvoE;m1mD3*b#$*7D*#~A^w=z5BJ@b zDve!5-5MInl8y&7KC?1N*ugLC zrO4}r_%CXlsU%tS^`(0bt7P?;9v*6QeTHTzhK@xWPaoKb3cvNF{-Y`@8`;w|yp8CW z^5m209DJ6Xd7n$6oU(ZZPV;ZO86{_BSZ`%oXInI!53>@venkCDi-HT2nlmk^nRe~5 zsZxSv6qDr{hhydt4kl;vMcfFYhh|m#u2EL6|D3VeAdh%MmM&0Hlzm)?rqzxF3 zj|RcYelJ*7O0LaVdFBHPvn<@XUE|yjmn63? zi`#S|FA^t-$dx{}EU=nA@#gMrGjNV-PRlEa!&b|&&L{cFR8E|hG6rcHAsUS*CyE^s zn5gemmbU8+$nv+eyIE!GW>waY-A+Gl!3CL((S3a=jE0CQ>oa~dtwWEg|NDqgu{Dsd zL%qC?zL_dv3P0hkz=z8p{XTr6X){*}W$?85QoD3$>Pqy*FOk!^HyQPgzA!W+BW13C zZc+SnaO^7qwyE30iPGVDUk@TK(ZR~y^Eye@)s^XO?fwcQ3FI~;fBy9;BQBmv!0%RO zihzy5B1b}fD{~v!=U|d2psbRqTvYMgZ`Y7Kq`7hoSt8jd{4aV(!z+C~PP4{vJh67q zA(z*j2CoCQccDP)_-4`NItSwIzDpJNTK!)5$tC%blM%ns$e@&W9eTsvuL{v^AvxBo zm~shyUGGyN#n-kvrqs@>qRgz6Gy*YN2Tt%CyM;bj_7iz6>>4zv8x;3u{lgs zheVf6bxTcTEDA+%!vmCEt~!64Fwp3v;FloQyX4`jsdtGfMjk|ujdyDuH~Ap&B5|l( z^DV`i+95q`tGtxioeeKU`oV1@g7;~c`&w8`^S2ksJK(fKwbEOb$1*Ab5@vs95(%#bwif9d#zDxfb+F@R>74w6_k9F)vJ-$ zUei0?+oHT4zRkbiEBRe)$;!eN=apOpX23w-R0IzPJ3~0=K zvc1=ZA`m$5YbW22>mr139@8F~FdFbo_Q)_eZ*8v(y{|kZ9J5a*EF`pFCM*nS`;X$e@@21%;0W~o_Cvyi_LYakt;)2g zJfQjZ=M#qQ(+3g*FoNzmR|vkp{exY8vZ$AtYy{{i&gm4iC+=jc~3oa(W+D|SZ zQBjbfhK&ah6#?Sf>P}7Gth0W1#y literal 0 HcmV?d00001 diff --git a/presentation/resources/openwrt-modules.pdf b/presentation/resources/openwrt-modules.pdf new file mode 100644 index 0000000000000000000000000000000000000000..342fd8349155ff6eec6c5853f57028ddfa04bc72 GIT binary patch literal 12334 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