From d470299cc1fe76a412abad6611ee468cc1038f21 Mon Sep 17 00:00:00 2001 From: Christian Melendez Date: Thu, 12 Nov 2020 00:51:36 +0100 Subject: [PATCH] First version of the "Getting started with Go" module --- get-started-with-go/7-summary.yml | 32 +-- .../includes/0-introduction.md | 17 +- get-started-with-go/includes/1-what-is-go.md | 23 ++- get-started-with-go/includes/2-install-go.md | 186 +++++++++++++++++- .../includes/3-explore-playground.md | 13 +- .../includes/4-install-vs-code.md | 72 ++++++- get-started-with-go/includes/5-hello-world.md | 107 +++++++++- .../includes/6-knowledge-check.md | 10 +- get-started-with-go/includes/7-summary.md | 5 +- get-started-with-go/media/go-playground.jpg | Bin 0 -> 27190 bytes 10 files changed, 430 insertions(+), 35 deletions(-) create mode 100644 get-started-with-go/media/go-playground.jpg diff --git a/get-started-with-go/7-summary.yml b/get-started-with-go/7-summary.yml index ad4623c..523494e 100644 --- a/get-started-with-go/7-summary.yml +++ b/get-started-with-go/7-summary.yml @@ -18,39 +18,25 @@ quiz: - content: " What’s the single command for executing and compiling Go apps?" choices: - content: "go build" - isCorrect: true - explanation: "Explanation1" - - content: "go run" isCorrect: false - explanation: "Explanation2" + explanation: "go build compiles the the program and generates the binary executable, but doesn't run the program" + - content: "go run" + isCorrect: true + explanation: "go run compiles and runs the program, but doesn't generate the binary executable" - content: "go install" isCorrect: false - explanation: "Explanation3" + explanation: "go install compiles, generates the binary, and moves it to the $GOBIN directory (doesn't run the program)" - content: "go compile" isCorrect: false - explanation: "Explanation4" + explanation: "go compile is an invalid command" - content: "Where should you place your project files in your workstation?" choices: - content: "Anywhere I want" isCorrect: false - explanation: "Explanation1" + explanation: "Althoug this is true, we haven't covered how to do it yet" - content: "At the root file system" isCorrect: false - explanation: "Explanation2" + explanation: "Partially true, but we haven't covered how to create projects outside of the $GOPATH yet" - content: "At the workspace directory" isCorrect: true - explanation: "Explanation3" - - content: "Do Go projects share the same workspace?" - choices: - - content: "Yes, you need to create all projects in the same workspace directory ($GOPATH)" - isCorrect: true - explanation: "Explanation1" - - content: "No, you can create a different workspace per project" - isCorrect: false - explanation: "Explanation2" - - content: "No, you can create a workspace per project as long as you have properly $GOPATH" - isCorrect: false - explanation: "Explanation3" - - content: "Answer4" - isCorrect: false - explanation: "Explanation4" + explanation: "At the moment, this is the only option we've explored, then it's the correct answer" diff --git a/get-started-with-go/includes/0-introduction.md b/get-started-with-go/includes/0-introduction.md index 75e0831..e172050 100644 --- a/get-started-with-go/includes/0-introduction.md +++ b/get-started-with-go/includes/0-introduction.md @@ -1,13 +1,20 @@ # Introduction -< Introductory Content > +In this module, you’ll start taking your first steps with Go. First, you’ll begin by learning a little bit about Go’s history and the main features of this programming language. Then, you’ll be installing and configuring Go on your workstation. Additionally, you’ll explore another way you can play with Go without having to install anything on your workstation. You’ll also learn how Go requires you to organize your code so that you don’t have any problems building them when you need to develop complex applications. + +At the end of the module, you’ll create your first “Hello World!” application in Go, and you’ll be ready to continue learning more about how to build applications using Go. ## Learning Objectives -In this module, you will begin to discover: +In this module, you will: -- +* Install and configure Go in your local workstation +* Install and configure VS Code and the Go extension +* Explore the Go Playground +* Create your first Go application -## Prerequisites -- \ No newline at end of file +## Prerequisites +* Programming basics in general +* Knowledge with at least one programming language +* Download / Install Software from the Internet diff --git a/get-started-with-go/includes/1-what-is-go.md b/get-started-with-go/includes/1-what-is-go.md index 808aedc..9764aa2 100644 --- a/get-started-with-go/includes/1-what-is-go.md +++ b/get-started-with-go/includes/1-what-is-go.md @@ -1,3 +1,24 @@ # What is Go +Go is a programming language developed at Google, announced in 2009 as an open-source project by Robert Griesemer, Rob Pike, and Ken Thompson. Since then, Go has been used for developing other very known technologies like Docker, Kubernetes, Terraform, and others. But Go, it’s a general-purpose language too. The goals of the language were to be expressive, efficient, and effective when writing reliable and robust code. -< Unit Text > \ No newline at end of file +According to the [TIOBE index](https://www.tiobe.com/tiobe-index/), in 2009 and [2016 Go was the programming language of the year](https://insights.dice.com/2017/01/10/go-tiobe-programming-language-2016/). And although it reached its tipping point that year, Go has [maintained a sustained rating over the years](https://www.tiobe.com/tiobe-index/go/). + +Go has many similarities with C inheriting many aspects of the C’s syntax, control-flow statements, basic data types, pointers, and others. However, Go it’s more than an up to date version of C. It borrows and adapts ideas from other programming languages, and removes any unnecessary features that could bring complexity to the language. For instance, some portions of the object oriented programming paradigm are not implemented as fully in Go, and you’ll learn why in some of the upcoming modules. + +Go is very idiomatic in very different topics like source code formats, not allowing unused code, not requiring an IDE, preferring to use standard libraries than frameworks, and offering a different approach for concurrent programming and error handling. + +Go runs on Unix systems like Linux and macOS, and Windows is supported as well. + +## Go Principles + +To understand why some things in Go are they way they are, it’s worth to understand what are the principles behind this programming language: + +* Go strives to keep things small and simple, or do more in only a few lines of code +* Concurrency is a first citizen, functions can run as lightweight threads +* Compilation and execution is fast, the aim is to be as fast as C +* Requires casting to be explicit, otherwise it throws a compilation error +* Unused code is not a warning, but an error (won’t compile) +* There’s an official formatting that helps to maintain consistency across projects +* Go is not a good friend of frameworks as it prefers the usage of standard libraries +* Guarantee backwards compatibility +* Go’s license is completely open source diff --git a/get-started-with-go/includes/2-install-go.md b/get-started-with-go/includes/2-install-go.md index 5601a33..55c8414 100644 --- a/get-started-with-go/includes/2-install-go.md +++ b/get-started-with-go/includes/2-install-go.md @@ -1,3 +1,187 @@ # Exercise - Install Go +Before you start creating applications with Go, you need to set up your development environment. -< Unit Text > \ No newline at end of file +In case you don’t want to install Go locally, you can use the [Go Playground](https://play.golang.org/) which is a web service that can run applications written in Go in a browser. This is a great option when you want to quickly and easily run code examples. However, we do recommend setting up your local environment when building applications that require a more complex code organization. + + +::: zone pivot="macos" +## Install Go on macOS +To install Go on macOS, you can do it using Homebrew, or download the Go installer from the downloads page at [https://golang.org/dl/](https://golang.org/dl/). Here you can find both approaches, choose only one. + +### Install Go using Homebrew +The simplest way to install Go is using Homebrew. + +Open a terminal prompt, and run the following commands to install the latest version of Go: + +``` +brew update +brew install go +``` + +Homebrew installs Go at `/usr/local/go`, and the path `/usr/local/go/bin` should now be part of the **$PATH** environment variable. You might need to restart your terminal prompt to confirm that Go is installed correctly. + +To confirm that Go is installed by running the following command: + +``` +go version +``` + +### Install Go using the Go Installer + +Alternatively, you can follow these steps to install the latest version of Go. + +**Step 1: Download the Go installer** + +Head over to the [Go download page](https://golang.org/dl/). In the “Feature downloads” section, click on the “Apple macOS” option to download the Go installer. + +You might see a window prompting you to allow downloading files from golang.org; select “Allow” to start downloading the Go installer. + +**Step 2: Run the Go installer** + +Once you have the Go installer locally, you can start with the installation. Double click on the .pkg file, and follow the instructions to install Go. + +By default, the .pgk file installs go at `/usr/local/go`, and the path `/usr/local/go/bin` should now be part of the **$PATH** environment variable. + +**Step 3: Confirm that Go is installed correctly** + +Once the installation finishes, open a new terminal prompt and run the following command: + +``` +go version +``` + +You should see the details of the Go version installed on your workstation. + +::: zone-end + +::: zone pivot="linux" +## Install Go on Linux + +To install Go on Linux, you need to download the Go installer from the downloads page at [https://golang.org/dl/](https://golang.org/dl/). If, for some reason, you have Go already installed and want to install the latest version, remove the existing installation before proceeding. + +**Step 1: Download the Go installer** + +Head over to the [Go download page](https://golang.org/dl/). In the “Feature downloads” section, click on the “Linux” option to download the Go installer. You might see a window prompting you to allow downloading files from golang.org; select “Allow” to start downloading the Go installer. + +Alternatively, you can download the installer using the following command (you might need to change the version number if 1.15.4 it’s not the [latest version](https://golang.org/doc/devel/release.html) at the time you’re following this guide): + + +``` +wget https://golang.org/dl/go1.15.4.linux-amd64.tar.gz +``` + +**Step 2: Extract the Go installer** +Once you have the Go installer locally, you can start setting up Go in your workstation. + +Extract the installer at `/usr/local/go `and run the following command as root or through sudo: + +``` +tar -C /usr/local -xzf go1.15.4.linux-amd64.tar.gz +``` + +You need to add the path `/usr/local/go/bin` to the **$PATH** environment variable. You can either add the following command to your $HOME/.profile or /etc/profile (so Go is system-wide available): + +``` +export PATH=$PATH:/usr/local/go/bin +``` + +You need to log out and log in again to update the **$PATH** environment variable. Alternatively, you can run the following command to force the update: + +``` +source $HOME/.profile +``` + +**Step 3: Confirm that Go is installed correctly** +Once you have the Go distribution configured, confirm that Go works by running the following command: + +``` +go version +``` + +You should see the details of the Go version installed on your workstation. + +::: zone-end + +::: zone pivot="windows" +## Install Go on Windows +To install Go on Windows, you need to download the Go installer from the downloads page at [https://golang.org/dl/](https://golang.org/dl/). + +**Step 1: Download the Go installer** + +Head over to the [Go download page](https://golang.org/dl/). In the “Feature downloads” section, click on the “Microsoft Windows” option to download the Go installer. + +You might see a window prompting you to allow downloading files from golang.org; select “Allow” to start downloading the Go installer. + +**Step 2: Run the MSI Go installer** + +Once you have the Go installer locally, you can start with the installation. Double click on the .msi file, and follow the instructions to install Go. + +By default, the .pgk file installs go at `C:\Go`, and the path `C:\Go\bin` should now be part of the **$PATH** environment variable. + +**Step 3: Confirm that Go is installed correctly** +Once you have the Go distribution configured, confirm that Go works. + +Open a new command prompt window (cmd) or Powershell, and run the following command: + +``` +go version +``` + +You should see the details of the Go version installed on your workstation. + +::: zone-end + +## How To Organize Your Code Projects +Please read this section carefully before you continue. + +Go differs from other programming languages regarding how to organize project files. First, Go works under the concept of workspaces, which is nothing but a location where your application source code lives. In Go, all projects share the same workspace. However, since version 1.11 Go started to change this approach. You don’t have to worry about that yet, we’ll cover this part in the next module. So, typically, the Go’s workspace is located at $HOME/go, but you can set up a different location for all your projects if needed. + +To define a different workspace location, set a value to the **$GOPATH** environment variable. Make sure you have a value for this environment variable to avoid having problems in the future when you create complex projects. + +In macOS or Linux, you can configure your workspace by adding the following command to your `~/.profile`: + +``` +export GOPATH=$HOME/go +``` + +Then run the following command to update your environment variables: + +``` +source ~/.profile +``` + +In Windows, create a folder like `C:\Projects\Go `where you’ll create all Go projects`.` Open a PowerShell prompt, and run the following command: + +``` +[Environment]::SetEnvironmentVariable("GOPATH", "C:\Projects\Go", "User") +``` + +You can get the workspace’s location in Go by printing the value of the **$GOPATH** environment variable for future references. Or, getting the environment variables that matters to Go running the following command + +``` +go env +``` + +In your Go’s workspace, you’ll find the following folders + +* **bin** which contains executables from applications +* **src** which includes all applications source code that lives in your workstation +* **pkg** which contains compiled versions of the available libraries; the compiler can link against these libraries without recompiling them + +For instance, this is how it can look like the folder structure tree in a workstation: + +``` +bin/ + hello + coolapp +pkg/ + github.com/gorilla/ + mux.a +src/ + github.com/golang/example/ + .git/ + hello/ + hello.go +``` + +We’ll go back to talk about this topic in the next module, and what you need to do if you need or want to have your project outside of the **$GOPATH**. Additionally, you can go deeper into this topic by [visiting the official documentation site](https://golang.org/doc/gopath_code.html). diff --git a/get-started-with-go/includes/3-explore-playground.md b/get-started-with-go/includes/3-explore-playground.md index 157b6b5..2cb2526 100644 --- a/get-started-with-go/includes/3-explore-playground.md +++ b/get-started-with-go/includes/3-explore-playground.md @@ -1,3 +1,14 @@ # Exercise - Set up your development environment +We mentioned early in this module that if you don’t want to install Go on your local workstation yet, you can use the [Go Playground](https://play.golang.org/), a website that compiles and runs Go code inside a sandbox environment. Typically, this is the tool you use for sharing code snippets with other developers when sharing a solution in forums. -< Unit Text > \ No newline at end of file +However, the Go Playground comes with a few limitations that might impact your learning journey, like: + +* Keyboard inputs are not supported +* Random numbers are deterministic +* Time is constant. You get the same value every time. + +![alt_text](../media/go-playground.jpg "The Go Playground") + +Head over to the Go Playground, and click on the “Run” button. + +Feel free to continue using this site for learning purposes, but we highly recommend installing Go locally and using an IDE to improve your development productivity. \ No newline at end of file diff --git a/get-started-with-go/includes/4-install-vs-code.md b/get-started-with-go/includes/4-install-vs-code.md index 157b6b5..f221e2c 100644 --- a/get-started-with-go/includes/4-install-vs-code.md +++ b/get-started-with-go/includes/4-install-vs-code.md @@ -1,3 +1,73 @@ # Exercise - Set up your development environment +You can use any text editor to write Go applications, but when you use an IDE like Visual Studio Code (VS Code), you write code faster. Without an IDE, you’d have to write every line from scratch, which at the beginning could help to get familiar with the syntax, but in the long-term, you might need more time to write an application. Therefore, we recommend using an IDE. For instance, you could start using VS Code, which is free and open-source, which has an extension for Go to help you write code faster. + +When you have VS Code and the Go extension, you get the following benefits: + +* Format applications following Go standards +* Add package references as soon as you add a new line and save your code. +* Remove package references that your application is not using anymore. +* Debug your applications by allowing you to set breakpoints and use watchers at runtime +* Provides suggested completions for code and package references +* Hover information to get more details about the code referencing its documentation +* Provides signature help like listing the parameters a function has +* Navigate the project’s code easily when you have multiple files +* Support for testing like generating test skeletons for functions + +Below are the instructions to install Visual Studio Code on your workstation. + +## Install Visual Studio Code on macOS + +**Step 1: Download Visual Studio Code** +Head over to the Visual Studio Code page and click on the “Mac” box to download the app. Wait a few seconds. You’ll see a prompt to save the file locally. + +**Step 2: Move the app to the Applications folder** +Locate the file you’ve just downloaded and open Finder. Drag and drop the Visual Studio Code file to the Applications folder in Finder. + +**Step 3: Start the app from the Applications folder** +To start the Visual Studio Code app, double-click on the icon from the Applications folder. + +**Important!** +You might see a warning that Visual Studio Code can't be opened because Apple can't check it for malicious software. If that happens, select OK to dismiss the message. Then right-click Visual Studio Code in the Applications folder and choose the Open menu. If you choose this option, Visual Studio Code should open without any further issues. + +## Install Visual Studio Code on Linux + +**Step 1: Download the Visual Studio Code installer** +Head over to the Visual Studio Code page and click on the “.deb” or “.rpm” option (depending on if your Linux distribution uses deb-based or rpm-based package managers) from the “Linux” box to download the app. Wait a few seconds. You’ll see a prompt to save the file locally. + +**Step 2: Start the Visual Studio Code installer** +Locate the file you’ve just downloaded, and open it by double-clicking the file. Follow the instructions to install the app on your workstation. + +**Step 3: Start Visual Studio Code** +When the installation process is complete, open Visual Studio Code to confirm that it’s working. + +--------------- + +Alternatively, you can install Visual Studio Code [using a package manager like APT or YUM](https://code.visualstudio.com/docs/setup/linux). + +## Install Visual Studio Code on Windows + +**Step 1: Download the Visual Studio Code installer** +Head over to the Visual Studio Code page and click on the “Windows” box to download the app. Wait a few seconds. You’ll see a prompt to save the file locally. + +**Step 2: Start the Visual Studio Code installer** +Locate the file you’ve just downloaded, and open it by double-clicking the file. Follow the instructions to install the app on your workstation. + +**Step 3: Start Visual Studio Code** +When the installation process is complete, open Visual Studio Code to confirm that it’s working. + +## Install the Go extension for Visual Studio Code +The Go extension for VS Code will help you write Go apps more efficiently because you’ll enjoy all of the features we mentioned early regarding why it’s a good idea to use an IDE for developing Go apps. + +Open VS Code, in case you haven’t done it already. + +**Step 1: Open the Extensions view** +In VS Code, go to “View” and select “Extensions” from the menu bar, or select the “Extensions” icon from the left side of the screen. + +**Step 2: Search for the Go extension** +Enter “Go” in the search box at the top of the Extensions view. + +Select the extension published by the “Go Team at Google” (usually the first one in the list). You’ll see the details of the extension on the right side of the screen. + +**Step 3: Install the Go extensions** +Below the extension’s description, you’ll see an **Install** button; click on it to install the extension in your workstation. When the installation is complete, the button’s text will change to **Uninstall**, meaning that you’ve successfully installed the Go extension. -< Unit Text > \ No newline at end of file diff --git a/get-started-with-go/includes/5-hello-world.md b/get-started-with-go/includes/5-hello-world.md index 3a11a21..c268b17 100644 --- a/get-started-with-go/includes/5-hello-world.md +++ b/get-started-with-go/includes/5-hello-world.md @@ -1,3 +1,108 @@ # Exercise - Hello World +In this section, you’ll write your first Go program that prints a message to the screen. Although this is the typical example to get started in a programming language, you’ll also learn more about the Go CLI, like building and running an application written in Go. -< Unit Text > \ No newline at end of file +## Step 1: Head over to the Go workspace and launch VS Code +First, to make sure you’re working in your Go workspace, open a terminal prompt, and run the following command to open your workspace directory: + +``` +cd $GOPATH/src +``` + +Once there, you can start VS Code from your terminal and start editing the current directory files. However, you need to register the VS Code CLI in your **$PATH** environment variable. To do so, follow these steps: + +* Launch VS Code +* Open the **Command Palette** under the **View** top menu and type 'shell command' to find the **Shell Command: Install 'code' command in PATH** command. +* Restart the terminal for the new **$PATH** value to take effect. You'll be able to type 'code .' in any folder to start editing files in that folder. +* Close VS Code. + +Now, run the following command to open VS Code in the current directory: + +``` +code . +``` + +## Step 2: Create a new folder and create a Go file for the project +Once you’re in VS Code, create a new directory named “helloworld,” and within it, create a new file named “main.go” that will contain the app code. Your folder structure tree should look like this: + +``` +src/ + helloworld/ + main.go +``` + +Open the main.go file, and type the following code: + +``` +package main + +import "fmt" + +func main() { + fmt.Println("Hello World!") +} +``` + +Now save the file. Don’t worry about your code format (e.g., tabs vs. spaces) as VS Code will format the code automatically every time you save the file. + +## Step 3: Execute your program +It’s time to run your program. To do so, open a new terminal prompt in your workstation, or you can have one as well in VS Code by going to the **Terminal** menu and then click on **New Terminal**. Make sure you change the directory to the one for your app code. In this case, it should be **$GOPATH/src/helloworld**. In the terminal, run the following command: + +``` +go run main.go +``` + +You should see the following output: + +``` +Hello World! +``` + +The **go run** command does two things. First, it starts by compiling the app, and if everything is fine, then execute the app. You can generate an executable by only running the following command: + +``` +go build main.go +``` + +When the previous command finishes, it generates an executable app that you can run any time without further processing. Now your project should look like this: + +``` +src/ + helloworld/ + main + main.go +``` + +The name of the file without extension (.exe if you’re on Windows) is the executable file you can use to run your program. When you’re developing, you will use the **go run** command. But when you’re building the binaries for your application, you’d use the **go build** command and deploy the binary executable to a proper environment. + +## What did you just write in Go? +Now that you’ve created your first Go app and made sure it compiles and runs, let’s examine line by line the code you’ve just written. + +Let’s start with the following one: + +``` +package main +``` + +This is how we define in Go that the application we’re creating is an executable program (a file we can run). This hello world app is part of the main package. A package is a set of common source code files. Every executable app has this first line, even if the project or file has a different name. We’ll go deeper into this topic in the next module, but for now, just make note that every executable program should be part of the main package. + +**Challenge:** To confirm what you’ve just read, change the package’s name in the first line, and try to run the program. What happened? Did you see the “Hello World!” output or any binary executable? + +Now let’s talk about the following line: + +``` +import "fmt" +``` + +The import statement gives access to your program for other code located in a different package. In this case, **fmt** is a standard library package, and you can [see its documentation at the Go official documentation site](https://golang.org/pkg/fmt/). You need this import because you’re using a function from this package to print a message to the screen later in the program. You can include as many imports as you want or need in your program. However, Go is very idiomatic in this regard, and if you’re importing a package, but you’re not using it, the app won’t compile. If you’re using VS Code, those imports that your program doesn’t use are removed automatically when you save the file you’re editing. + +**Challenge:** To confirm what you’ve just read, include another import like **math** or **io**. What happened? Did VS Code remove the import when you saved the file? Try editing the file without VS Code, and try to run the app. What’s the output you see now? + +Let’s talk about the following block: + +``` +func main() { + fmt.Println("Hello World!") +} +``` + +The **func** statement is a reserved word to declare a function. But for now, let’s talk about why this function is called **main**. The main function is the starting point of your program. Therefore, you can only have one main function across the package main (the one you defined in the first line). In this function, you called the **Println** function from the **fmt** package and sent a text that you wanted to see on the screen. There’s more we can talk about functions, but we’ll cover this topic in the next module. \ No newline at end of file diff --git a/get-started-with-go/includes/6-knowledge-check.md b/get-started-with-go/includes/6-knowledge-check.md index ec2bbc8..fc1c8c5 100644 --- a/get-started-with-go/includes/6-knowledge-check.md +++ b/get-started-with-go/includes/6-knowledge-check.md @@ -1,3 +1,11 @@ # Knowledge check +1. What’s the single command for executing and compiling Go apps? +* go build +* go run +* go install +* go compile -< Unit Text > \ No newline at end of file +2. Where should you place your project files in your workstation? +* Anywhere I want +* At the root file system +* At the workspace directory diff --git a/get-started-with-go/includes/7-summary.md b/get-started-with-go/includes/7-summary.md index 2c0e1dd..b093939 100644 --- a/get-started-with-go/includes/7-summary.md +++ b/get-started-with-go/includes/7-summary.md @@ -1,3 +1,6 @@ # Summary +Our goal in this module was to guide you through taking your first steps with Go, have a working environment where you can create more projects in Go, and use VS Code to write programs rapidly following the Go standards. Although you wrote the typical **Hello World** program, you learned how to compile and run programs written in Go. -< Text to go above the knowledge check > \ No newline at end of file +To avoid having problems in the future, you need to keep in mind that all projects in Go share the same workspace on your computer. A recommended practice is that you create all of your projects within the **$GOPATH/src** directory. However, there are times when you need to create projects at a different location. We’ll talk about how you can have your project’s code at a different location in the upcoming module. + +Lastly, you learned the difference between using **go build** and **go run**. The **go build** command one compiles the program, and if there are no errors, it generates a binary executable file that you can run without using Go. You’ll typically use this command when generating the application binaries you’ll use to deploy the application to a different environment. And the **go run** command compiles and executes the application without generating a binary. You’ll use this command when developing and testing your application locally. \ No newline at end of file diff --git a/get-started-with-go/media/go-playground.jpg b/get-started-with-go/media/go-playground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fd09260d2a533d89b493a2019aebb47f6f29c94 GIT binary patch literal 27190 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 Bj&%S4 literal 0 HcmV?d00001