Cách dùng gif scm window

Cài đặt git

  • Với windows:

Nếu bạn dùng Windows thì có thể tải file .exe cài đặt Git tại địa chỉ http://git-scm.com/download/win. Khi cài bạn có thể để nguyên tùy chọn mặc định mà không cần tùy chỉnh gì thêm nếu bạn chưa hiểu về nó.

Sau khi cài đặt Git vào Windows, bạn sẽ cần mở ứng dụng Git Bash lên để bắt đầu sử dụng các dòng lệnh của Git.

  • Với Ubuntu $ sudo apt-get install git
  • Với Mac, bạn có thể sử dụng file installer tải tại địa chỉ http://git-scm.com/download/mac để cài đặt.

Thiết lập chứng thực cá nhân

Sau khi cài Git xong, việc đầu tiên bạn nên làm là khai báo tên và địa chỉ email vào trong file cấu hình của Git trên máy. Để làm điều này bạn sẽ cần sử dụng hai lệnh sau đây để thiết lập tên và email.

$ git config --global user.name "nguyenngocbinh"

$ git config --global user.email ""

Sau khi thiết lập xong, bạn có thể kiểm tra thông tin chứng thực trên user của bạn bằng cách xem tập tin ~/.gitconfig (nhắc lại rằng dấu ~ nghĩa là thư mục gốc của user).

$ cat ~/.gitconfig

Hoặc bạn cũng có thể dùng lệnh git config –list để ghi danh sách các thiết lập hiện tại mà bạn đã làm.

Như vậy là bạn đã xong bước ban đầu đó là cài đặt Git và thiết lập tên và email của mình vào Git để bắt đầu làm việc. Ở phần sau, mình sẽ hướng dẫn cách bạn tạo ra một local repository (kho chứa trên máy cá nhân) để xem Git hoạt động thế nào.

Cách tạo mộ repository

Repository (kho chứa) nghĩa là nơi mà bạn sẽ lưu trữ mã nguồn và một người khác có thể sao chép (clone) lại mã nguồn đó nhằm làm việc. Repository có hai loại là Local Repository (Kho chứa trên máy cá nhân) và Remote Repository (Kho chứa trên một máy chủ từ xa).

Trong bài này, mình sẽ hướng dẫn bạn cách tạo local repository và remote repository (sử dụng Github) và làm việc với nó.

Tạo local repository

Trước hết, để tạo một repository thì bạn cần truy cập vào thư mục của mã nguồn với lệnh cd, sau đó sử dụng lệnh git init để khởi tạo repository trong thư mục đó. Ở ví dụ này, mình sẽ tạo ra một thư mục mới để chứa code sau này và khởi tạo repository cho nó, mình sẽ dùng lệnh git init tên_folder để nó tự khởi tạo thư mục.

$ git init git_example

Ở đoạn trên, nó hiển thị dòng thông báo mình đã khởi tạo một kho Git trống tại đường dẫn như trên. Lưu ý rằng thư mục ẩn .git/ là nơi nó sẽ chứa các thiết lập về Git cũng như lưu lại toàn bộ thông tin về kho chứa, bạn không cần đụng chạm gì vào thư mục .git/ này.

Nếu kho chứa của bạn đã có sẵn mã nguồn thì bạn cần phải đưa các tập tin về trạng thái Tracked nhằm có thể làm việc được với Git. Để làm việc này, bạn sẽ cần sử dụng lệnh git add tên_file, có thể sử dụng dấu * để gom toàn bộ. Sau đó có thể sử dụng lệnh git status để xem danh sách các tập tin đã được tracked.

$ git add readme.txt
$ git status

Và sau khi tập tin đã được đưa vào trạng thái tracked và nếu một tập tin đã tracked thì nó phải được đưa vào lại Staging Area (giải thích ở bài sau) cũng bằng lệnh git add thì bạn mới có thể tiến hành ủy thác (commit) nhằm lưu lại bản chụp các thay đổi. Lệnh commit sẽ có cấu trúc git commit -m “Lời nhắn”, lúc này tất cả các tập đang trong trạng thái tracked (file mới) hoặc một tập tin đã được tracked nhưng có một sự thay đổi mới thì sẽ được commit.

$ git commit -m "First Commit"

Bây giờ thì bạn đã hoàn thành việc commit lần đầu tiên các tập tin mà bạn đã đưa vào kho, mình sẽ nói kỹ hơn về việc commit ở các bài sau. Tóm lại là tới đây bạn đã có một kho chứa mã nguồn Git trên máy của bạn.

Tạo repository trên Github và làm việc

Trước tiên bạn cần đăng nhập vào Github, sau đó ấn vào dấu + trên menu và chọn New repository.

Bạn sẽ cần đặt tên cho kho chứa của bạn. Bạn có thể chọn loại kho chứa là Public (ai cũng có thể clone) và Private (chỉ có những người được cấp quyền mới có thể clone).

Khi tạo xong nó sẽ dẫn bạn tới trang hướng dẫn làm việc với kho chứa vừa tạo. Và kho chứa của bạn bây giờ sẽ có địa chỉ là https://github.com/$user-name/$repository, ví dụ https://github.com/nguyenngocbinh/test.

Việc của bạn bây giờ là hãy clone cái kho chứa này về máy của mình bằng lệnh git clone địa_chỉ.

$ git clone https://github.com/nguyenngocbinh/test

Bây giờ hãy truy cập vào thư mục working tree (thư mục vừa clone repository về) và thử tạo ra một file tên là README.md, sau đó dùng lệnh git add để đưa file này vào Staging Area.

$ cd test
$ echo "# Huong dan Git co ban" > README.md
$ git add README.md
$ git commit -m "First commit on Github"

Tuy nhiên sau khi commit xong, tập tin đã được commit sẽ vẫn không thể xuất hiện trong kho chứa trên Github mà bạn phải làm thêm một việc nữa đó là dùng lệnh git push để đẩy các tập tin đã được commit lên Github. Lưu ý rằng bạn sẽ cần nhập tài khoản và mật khẩu Github.

origin nghĩa là tên remote (xem ở bài sau) và master là tên branch, hai cái này mình sẽ giải thích kỹ hơn ở bài riêng của nó.

Trong bài tạo repository cho Git mình có nhắc qua về cụm từ Staging Area và một tính năng là commit (ủy thác), vậy hai cái này là gì thì mình sẽ giải thích kỹ hơn trong bài này để bạn biết cách sử dụng cho đúng.

Staging Area là gì?

Staging Area nghĩa là một khu vực mà nó sẽ được chuẩn bị cho quá trình commit. Trước hết, bạn cần phải hiểu rằng trong các hệ thống quản lý phiên bản (Version Control System) thì các dữ liệu sẽ được lưu trữ ở hai nơi, một là thư mục bạn đang làm việc trên máy tính (working tree, mình không nhắc lại nữa đâu) và một là kho chứa mã nguồn (repository) sau khi bạn đã thực hiện thay đổi (ví dụ như kho chứa trên Github).

Nhưng với Git thì nó có thêm một lựa chọn nữa đó là có thêm một khu vực trung gian gọi là Staging Area và đây chính là một lợi thế lớn của Git. Staging Area nghĩa là khu vực sẽ lưu trữ những thay đổi của bạn trên tập tin để nó có thể được commit, vì muốn commit tập tin nào thì tập tin đó phải nằm trong Staging Area. Một tập tin khi nằm trong Staging Area sẽ có trạng thái là Stagged (xem thêm ở dưới).

Và để đưa một tập tin vào Staging Area thì bạn sẽ cần phải sử dụng lệnh git add tên_file mà mình đã có ví dụ ở phần trước.

Commit là gì và nó hoạt động ra sao?

Hiểu đơn giản hơn, commit nghĩa là một hành động để Git lưu lại một bản chụp (snapshot) của các sự thay đổi trong thư mục làm việc, và các tập tin và thư mục được thay đổi đã phải nằm trong Staging Area. Mỗi lần commit nó sẽ được lưu lại lịch sử chỉnh sửa của mã nguồn kèm theo tên và địa chỉ email của người commit. Ngoài ra trong Git bạn cũng có thể khôi phục lại tập tin trong lịch sử commit của nó để chia cho một phân nhánh (branch) khác, đây là mấu chốt của việc bạn sẽ dễ dàng khôi phục lại các thay đổi trước đó mà mình có giới thiệu qua ở phần giới thiệu serie này.

Và tất nhiên, lệnh commit trong Git sẽ là git commit -m “Lời nhắn”.

Và nếu bạn muốn đưa tập tin lên repository thì bạn phải commit nó trước rồi sau đó lệnh git push origin master sẽ có nhiệm vụ đưa toàn bộ các tập tin đã được commit lên repository.

Điều kiện gì để commit một tập tin?

Nếu bạn muốn commit một tập tin đó, bạn sẽ cần phải đưa tập tin đó vào trạng thái tracked bằng lệnh git add tên_file. Trong git có hai loại trạng thái chính đó là Tracked và Untracked, cụ thể:

Tracked – Là tập tin đã được đánh dấu theo dõi trong Git để bạn làm việc với nó. Và trạng thái Tracked nó sẽ có thêm các trạng thái phụ khác là Unmodified (chưa chỉnh sửa gì), Modified (đã chỉnh sửa) và Staged (đã sẵn sàng để commit). Untracked – Là tập tin còn lại mà bạn sẽ không muốn làm việc với nó trong Git.

Nhưng bạn phải nên biết rằng nếu tập tin đó đã được Tracked nhưng đang rơi vào trạng thái (Modified) thì nó vẫn sẽ không thể commit được mà bạn phải đưa nó về Staged cũng bằng lệnh git add.

Bỏ qua Staging Are để commit

Như mình có nói ở trên là một tập tin sau khi được thay đổi hay tạo mới thì nó phải được thêm vào Staging Area với lệnh git add. Tuy nhiên, bạn có thể đưa một tập tin đã được Tracked để commit mà không cần đưa nó vào Staging Area với tham số -a trong lệnh git commit. Ví dụ: git commit -a -m “Skipped Staging Are to commit”.

Tìm hiểu thêm về trạng thái

Untracked

Nếu bạn tạo ra hoặc thêm vào một tập tin mới vào trong thư mục làm việc của bạn thì nó sẽ ở trạng thái Untracked. Bây giờ mình thử tạo ra một tập tin mới tên là faq.html, sau đó dùng lệnh git status để xem trạng thái của Git trong thư mục làm việc.

$ touch faq.html
$ git status

Note: Lệnh touch là tạo ra một tập tin rỗng.

Bây giờ bạn sẽ thấy nó đã liệt kê ra tên tập tin đang ở trạng thái Untracked. Để đưa nó về Tracked bạn sẽ sử dụng lệnh git add và xem lại trạng thái của nó.

Bây giờ bạn thấy, tập tin faq.html của mình đã được đưa về trạng thái Staged và nó có thể được commit. Tại sao? Vì bạn phải biết rằng nếu một tập tin ở trạng thái Untracked mà được đưa về Tracked thì nó sẽ nằm ở trạng thái Staged luôn, trừ khi bạn thay đổi nội dung tập tin này thì nó sẽ đưa về trạng thái Modified và nó không thể commit trừ khi bạn gõ lệnh git add cho nó.

Tracked

Một khi một tập tin đã được đưa về Tracked thì nó sẽ có thể thay đổi giữa 3 trạng thái khác nhau là Modified, Unmodified và Staged.

Trước hết bây giờ mình đã có một tập tin mới đã được đưa về Staged với lệnh git add như ví dụ trên. Bây giờ mình tiến hành thay đổi nội dung của tập tin faq.html này và xem kết quả của lệnh git status.

$ git status

Bạn có thấy sự kỳ lạ ở tập tin faq.html không? Đó là nó được hiển thị ở hai trạng thái Staged (có thể commit) và Modified (không thể commit) hay còn gọi là Unstaged. Sở dĩ có sự kỳ lạ đó ở đây là bởi vì trước đó bạn đã tạo ra tập tin faq.html và đưa về Tracked thì nó cũng đã được đưa về Staged để có thể commit. Tuy nhiên sau đó bạn lại chỉnh sửa nội dung của nó nên nó đã có một phiên bản khác nằm ở trạng thái Modified (không thể commit). Nếu bây giờ bạn gõ lệnh git commit để ủy thác nó thì bản chụp của tập tin faq.html ở lần cuối cùng bạn gõ lệnh git add sẽ được commit lên chứ nó không chứa các nội dung mà bạn vừa thêm vào. Và để nó có thể commit tập tin faq.html đã được chỉnh sửa thì bạn phải gõ lại lệnh git add faq.html lần nữa.

Chuyển tập tin từ Untracked về Tracked

Trong Git, bạn có thể đưa một tập tin từ Tracked về Untracked với lệnh rm tên_file. Lệnh rm sẽ giúp bạn đưa tập tin về trạng thái Untracked nhưng không xóa hẳn trong ổ cứng.

$ rm faq.html
$ git status

Còn nếu bạn muốn xóa nó luôn thì dùng lệnh git rm -f tên_file và nhớ cẩn thận khi dùng lệnh này.

Sơ lược remote respository và origin

Quay trở lại bài tạo repository, mình có hướng dẫn bạn cách tạo một repository trên dịch vụ Github và Clone nó về máy. Như vậy, cái Github là một máy chủ repository từ xa nên mình sẽ gọi nó là Remote Repository, nghĩa là repository này không nằm trên máy tính của bạn.

Và ở phần đó, bạn có thấy mình kêu các bạn gửi dữ liệu lên repository bằng cách dùng lệnh git push origin master sau khi commit không? Cái master là tên branch mà mình sẽ không nói ở bài này, nhưng cái origin trong đoạn đó chính là tên remote repository. Mặc định khi clone một repository thì nó tự đặt tên là origin.

Để kiểm tra tên remote, bạn có thể gõ lệnh git remote -v.

Trong đó bạn có thể thấy cái repository mình đã clone đều được đặt tên là origin, và mỗi repository bạn có hai đều có hai hành động là fetch (lấy dữ liệu về từ server) và push (gửi dữ liệu lên server).

Nhìn lại đoạn lệnh git push origin master ở trên, điều đó có nghĩa là bạn gửi tất cả các thay đổi trên mã nguồn ở máy bạn lên remote tên là origin với branch master.

Đổi tên remote

Nếu bạn không thích tên origin thì có thể đổi tên nó lại nó bằng tên khác cho dễ quản lý nếu như bạn có nhiều remote trong một dự án với lệnh git remote rename tên_cũ tên_mới. Ví dụ mình cần đổi từ origin sang binh thì sẽ đổi như sau:

$ git remote rename origin binh
$ git remote -v

Bây giờ khi commit hay push bạn có thể gõ git push thach master để gửi mã nguồn lên remote repository này.

Thêm một remote

Trường hợp bạn cần thêm một cái remote để lấy dữ liệu khi cần thì có thể sử dụng lệnh git remote add tên_remote URL. Ví dụ mình cần remote một repository và đặt tên nó là inuit thì sẽ viết như sau:

$ git remote add snippet https://github.com/nguyenngocbinh/rsnippet
$ git remote -v

Sau đó nếu bạn muốn lấy dữ liệu từ cái snippet kia về thì chỉ cần sử dụng lệnh git fetch snippet

Lưu ý là lệnh git fetch nó chỉ lấy về và lưu vào database của Git trên máy chứ không được gộp vào repository của bạn. Để gộp vào bạn có thể gõ thêm lệnh git merge snippet, trong đó snippet là tên remote.

Còn nếu bạn muốn nó lấy về trực tiếp mà không cần gộp thì sử dụng lệnh git pull tên_remote, tuy nhiên mình khuyến khích bạn nên gộp vào branch khi cần và nhớ cẩn thận trong việc gộp, tốt nhất nên tạo thư mục mới trong thư mục làm việc của bạn rồi vào đó mà lấy về.

Sự khác nhau giữa clone, fetch và pull

Có thể bây giờ bạn đã biết được 3 lệnh để lấy dữ liệu về từ repository đó là git clone, git fetch và git pull. Nhưng cả ba loại đều là lấy dữ liệu, thế sự khác nhau của nó là gì?

git clone

Lệnh này sẽ sao chép toàn bộ dữ liệu trên repository và sao chép luôn các thiết lập về repository, tức là nó sẽ tự động tạo một master branch trên máy tính của bạn. Lệnh này chỉ nên sử dụng khi bạn cần tạo mới một Git mới trên máy tính với toàn bộ dữ liệu và thiết lập của một remote repository.

git pull

Lệnh này sẽ tự động lấy toàn bộ dữ liệu từ remote repository và gộp vào cái branch hiện tại bạn đang làm việc.

git fetch

Lệnh này sẽ lấy toàn bộ dữ liệu từ remote repository nhưng sẽ cho phép bạn gộp thủ công vào một branch nào đó trên thư mục Git ở máy tính.

Tạm thời bạn nên hiểu thế, ở bài branch bạn sẽ hiểu sâu hơn.

Các loại giao thức của Remote Repository

Chúng ta không chỉ kết nối với một remote repository qua giao thức HTTP hay HTTPS mà còn có thể chọn nhiều giao thức khác, dưới đây là một vài giao thức remote repository.

Local Repository

Giao thức này nghĩa là bạn kết nối tới một repository nào đó trên chính máy tính của bạn và URL của giao thức sẽ có dạng /path/repository/.

SSH Repository

Giao thức này thường được dùng trên các nhu cầu tạo một server repository riêng và kết nối thông qua giao thức SSH. Đường dẫn của giao thức này sẽ có dạng là user@server:/path/repository.git. Ở phần cuối serie mình sẽ hướng dẫn bạn cách tạo một repository server riêng và nó là lựa chọn rất tốt nếu bạn làm việc nhóm mà không cần phụ thuộc vào các dịch vụ như Github hay Assembla.

LS0tDQp0aXRsZTogIkjGsOG7m25nIGThuqtuIGdpdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h2bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0UpDQpgYGANCg0KDQojIEPDoGkgxJHhurd0IGdpdA0KDQotIFbhu5tpIHdpbmRvd3M6DQoNCk7hur91IGLhuqFuIGTDuW5nIFdpbmRvd3MgdGjDrCBjw7MgdGjhu4MgdOG6o2kgZmlsZSAuZXhlIGPDoGkgxJHhurd0IEdpdCB04bqhaSDEkeG7i2EgY2jhu4kgYGh0dHA6Ly9naXQtc2NtLmNvbS9kb3dubG9hZC93aW5gLiBLaGkgY8OgaSBi4bqhbiBjw7MgdGjhu4MgxJHhu4Mgbmd1ecOqbiB0w7l5IGNo4buNbiBt4bq3YyDEkeG7i25oIG3DoCBraMO0bmcgY+G6p24gdMO5eSBjaOG7iW5oIGfDrCB0aMOqbSBu4bq/dSBi4bqhbiBjaMawYSBoaeG7g3UgduG7gSBuw7MuDQoNClNhdSBraGkgY8OgaSDEkeG6t3QgR2l0IHbDoG8gV2luZG93cywgYuG6oW4gc+G6vSBj4bqnbiBt4bufIOG7qW5nIGThu6VuZyBHaXQgQmFzaCBsw6puIMSR4buDIGLhuq90IMSR4bqndSBz4butIGThu6VuZyBjw6FjIGTDsm5nIGzhu4duaCBj4bunYSBHaXQuDQoNCi0gVuG7m2kgVWJ1bnR1IGAkIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGdpdGANCi0gVuG7m2kgTWFjLCBi4bqhbiBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgZmlsZSBpbnN0YWxsZXIgdOG6o2kgdOG6oWkgxJHhu4thIGNo4buJIGBodHRwOi8vZ2l0LXNjbS5jb20vZG93bmxvYWQvbWFjYCDEkeG7gyBjw6BpIMSR4bq3dC4NCg0KIyBUaGnhur90IGzhuq1wIGNo4bupbmcgdGjhu7FjIGPDoSBuaMOibg0KDQpTYXUga2hpIGPDoGkgR2l0IHhvbmcsIHZp4buHYyDEkeG6p3UgdGnDqm4gYuG6oW4gbsOqbiBsw6BtIGzDoCBraGFpIGLDoW8gdMOqbiB2w6AgxJHhu4thIGNo4buJIGVtYWlsIHbDoG8gdHJvbmcgZmlsZSBj4bqldSBow6xuaCBj4bunYSBHaXQgdHLDqm4gbcOheS4gxJDhu4MgbMOgbSDEkWnhu4F1IG7DoHkgYuG6oW4gc+G6vSBj4bqnbiBz4butIGThu6VuZyBoYWkgbOG7h25oIHNhdSDEkcOieSDEkeG7gyB0aGnhur90IGzhuq1wIHTDqm4gdsOgIGVtYWlsLg0KDQpgJCBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAibmd1eWVubmdvY2JpbmgiYA0KDQpgJCBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIm5ndXllbm5nb2NiaW5obmV1QGdtYWlsLmNvbSJgDQoNClNhdSBraGkgdGhp4bq/dCBs4bqtcCB4b25nLCBi4bqhbiBjw7MgdGjhu4Mga2nhu4NtIHRyYSB0aMO0bmcgdGluIGNo4bupbmcgdGjhu7FjIHRyw6puIHVzZXIgY+G7p2EgYuG6oW4gYuG6sW5nIGPDoWNoIHhlbSB04bqtcCB0aW4gfi8uZ2l0Y29uZmlnIChuaOG6r2MgbOG6oWkgcuG6sW5nIGThuqV1IH4gbmdoxKlhIGzDoCB0aMawIG3hu6VjIGfhu5FjIGPhu6dhIHVzZXIpLg0KDQpgJCBjYXQgfi8uZ2l0Y29uZmlnYA0KDQpIb+G6t2MgYuG6oW4gY8WpbmcgY8OzIHRo4buDIGTDuW5nIGzhu4duaCBnaXQgY29uZmlnIC0tbGlzdCDEkeG7gyBnaGkgZGFuaCBzw6FjaCBjw6FjIHRoaeG6v3QgbOG6rXAgaGnhu4duIHThuqFpIG3DoCBi4bqhbiDEkcOjIGzDoG0uDQoNCk5oxrAgduG6rXkgbMOgIGLhuqFuIMSRw6MgeG9uZyBixrDhu5tjIGJhbiDEkeG6p3UgxJHDsyBsw6AgY8OgaSDEkeG6t3QgR2l0IHbDoCB0aGnhur90IGzhuq1wIHTDqm4gdsOgIGVtYWlsIGPhu6dhIG3DrG5oIHbDoG8gR2l0IMSR4buDIGLhuq90IMSR4bqndSBsw6BtIHZp4buHYy4g4bueIHBo4bqnbiBzYXUsIG3DrG5oIHPhur0gaMaw4bubbmcgZOG6q24gY8OhY2ggYuG6oW4gdOG6oW8gcmEgbeG7mXQgbG9jYWwgcmVwb3NpdG9yeSAoa2hvIGNo4bupYSB0csOqbiBtw6F5IGPDoSBuaMOibikgxJHhu4MgeGVtIEdpdCBob+G6oXQgxJHhu5luZyB0aOG6vyBuw6BvLg0KDQojIEPDoWNoIHThuqFvIG3hu5kgcmVwb3NpdG9yeQ0KDQoqKlJlcG9zaXRvcnkqKiAoa2hvIGNo4bupYSkgbmdoxKlhIGzDoCBuxqFpIG3DoCBi4bqhbiBz4bq9IGzGsHUgdHLhu68gbcOjIG5ndeG7k24gdsOgIG3hu5l0IG5nxrDhu51pIGtow6FjIGPDsyB0aOG7gyBzYW8gY2jDqXAgKGNsb25lKSBs4bqhaSBtw6Mgbmd14buTbiDEkcOzIG5o4bqxbSBsw6BtIHZp4buHYy4gUmVwb3NpdG9yeSBjw7MgaGFpIGxv4bqhaSBsw6AgTG9jYWwgUmVwb3NpdG9yeSAoS2hvIGNo4bupYSB0csOqbiBtw6F5IGPDoSBuaMOibikgdsOgIFJlbW90ZSBSZXBvc2l0b3J5IChLaG8gY2jhu6lhIHRyw6puIG3hu5l0IG3DoXkgY2jhu6cgdOG7qyB4YSkuDQoNClRyb25nIGLDoGkgbsOgeSwgbcOsbmggc+G6vSBoxrDhu5tuZyBk4bqrbiBi4bqhbiBjw6FjaCB04bqhbyBsb2NhbCByZXBvc2l0b3J5IHbDoCByZW1vdGUgcmVwb3NpdG9yeSAoc+G7rSBk4bulbmcgR2l0aHViKSB2w6AgbMOgbSB2aeG7h2MgduG7m2kgbsOzLg0KDQojIyBU4bqhbyBsb2NhbCByZXBvc2l0b3J5DQoNClRyxrDhu5tjIGjhur90LCDEkeG7gyB04bqhbyBt4buZdCByZXBvc2l0b3J5IHRow6wgYuG6oW4gY+G6p24gdHJ1eSBj4bqtcCB2w6BvIHRoxrAgbeG7pWMgY+G7p2EgbcOjIG5ndeG7k24gduG7m2kgbOG7h25oIGNkLCBzYXUgxJHDsyBz4butIGThu6VuZyBs4buHbmggZ2l0IGluaXQgxJHhu4Mga2jhu59pIHThuqFvIHJlcG9zaXRvcnkgdHJvbmcgdGjGsCBt4bulYyDEkcOzLiDhu54gdsOtIGThu6UgbsOgeSwgbcOsbmggc+G6vSB04bqhbyByYSBt4buZdCB0aMawIG3hu6VjIG3hu5tpIMSR4buDIGNo4bupYSBjb2RlIHNhdSBuw6B5IHbDoCBraOG7n2kgdOG6oW8gcmVwb3NpdG9yeSBjaG8gbsOzLCBtw6xuaCBz4bq9IGTDuW5nIGzhu4duaCBnaXQgaW5pdCB0w6puX2ZvbGRlciDEkeG7gyBuw7MgdOG7sSBraOG7n2kgdOG6oW8gdGjGsCBt4bulYy4NCg0KYCQgZ2l0IGluaXQgZ2l0X2V4YW1wbGVgDQoNCuG7niDEkW/huqFuIHRyw6puLCBuw7MgaGnhu4NuIHRo4buLIGTDsm5nIHRow7RuZyBiw6FvIG3DrG5oIMSRw6Mga2jhu59pIHThuqFvIG3hu5l0IGtobyBHaXQgdHLhu5FuZyB04bqhaSDEkcaw4budbmcgZOG6q24gbmjGsCB0csOqbi4gTMawdSDDvSBy4bqxbmcgdGjGsCBt4bulYyDhuqluIC5naXQvIGzDoCBuxqFpIG7DsyBz4bq9IGNo4bupYSBjw6FjIHRoaeG6v3QgbOG6rXAgduG7gSBHaXQgY8WpbmcgbmjGsCBsxrB1IGzhuqFpIHRvw6BuIGLhu5kgdGjDtG5nIHRpbiB24buBIGtobyBjaOG7qWEsIGLhuqFuIGtow7RuZyBj4bqnbiDEkeG7pW5nIGNo4bqhbSBnw6wgdsOgbyB0aMawIG3hu6VjIC5naXQvIG7DoHkuDQoNCk7hur91IGtobyBjaOG7qWEgY+G7p2EgYuG6oW4gxJHDoyBjw7Mgc+G6tW4gbcOjIG5ndeG7k24gdGjDrCBi4bqhbiBj4bqnbiBwaOG6o2kgxJHGsGEgY8OhYyB04bqtcCB0aW4gduG7gSB0cuG6oW5nIHRow6FpIFRyYWNrZWQgbmjhurFtIGPDsyB0aOG7gyBsw6BtIHZp4buHYyDEkcaw4bujYyB24bubaSBHaXQuIMSQ4buDIGzDoG0gdmnhu4djIG7DoHksIGLhuqFuIHPhur0gY+G6p24gc+G7rSBk4bulbmcgbOG7h25oIGdpdCBhZGQgdMOqbl9maWxlLCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgZOG6pXUgKiDEkeG7gyBnb20gdG/DoG4gYuG7mS4gU2F1IMSRw7MgY8OzIHRo4buDIHPhu60gZOG7pW5nIGzhu4duaCBnaXQgc3RhdHVzIMSR4buDIHhlbSBkYW5oIHPDoWNoIGPDoWMgdOG6rXAgdGluIMSRw6MgxJHGsOG7o2MgdHJhY2tlZC4NCg0KYGBge3IsIGV2YWw9RkFMU0V9DQokIGdpdCBhZGQgcmVhZG1lLnR4dA0KJCBnaXQgc3RhdHVzDQpgYGANCg0KVsOgIHNhdSBraGkgdOG6rXAgdGluIMSRw6MgxJHGsOG7o2MgxJHGsGEgdsOgbyB0cuG6oW5nIHRow6FpIHRyYWNrZWQgdsOgIG7hur91IG3hu5l0IHThuq1wIHRpbiDEkcOjIHRyYWNrZWQgdGjDrCBuw7MgcGjhuqNpIMSRxrDhu6NjIMSRxrBhIHbDoG8gbOG6oWkgU3RhZ2luZyBBcmVhIChnaeG6o2kgdGjDrWNoIOG7nyBiw6BpIHNhdSkgY8WpbmcgYuG6sW5nIGzhu4duaCBnaXQgYWRkIHRow6wgYuG6oW4gbeG7m2kgY8OzIHRo4buDIHRp4bq/biBow6BuaCDhu6d5IHRow6FjIChjb21taXQpIG5o4bqxbSBsxrB1IGzhuqFpIGLhuqNuIGNo4bulcCBjw6FjIHRoYXkgxJHhu5VpLiBM4buHbmggY29tbWl0IHPhur0gY8OzIGPhuqV1IHRyw7pjIGdpdCBjb21taXQgLW0gIkzhu51pIG5o4bqvbiIsIGzDumMgbsOgeSB04bqldCBj4bqjIGPDoWMgdOG6rXAgxJFhbmcgdHJvbmcgdHLhuqFuZyB0aMOhaSB0cmFja2VkIChmaWxlIG3hu5tpKSBob+G6t2MgbeG7mXQgdOG6rXAgdGluIMSRw6MgxJHGsOG7o2MgdHJhY2tlZCBuaMawbmcgY8OzIG3hu5l0IHPhu7EgdGhheSDEkeG7lWkgbeG7m2kgdGjDrCBz4bq9IMSRxrDhu6NjIGNvbW1pdC4NCg0KYGBge3J9DQokIGdpdCBjb21taXQgLW0gIkZpcnN0IENvbW1pdCINCmBgYA0KDQoNCkLDonkgZ2nhu50gdGjDrCBi4bqhbiDEkcOjIGhvw6BuIHRow6BuaCB2aeG7h2MgY29tbWl0IGzhuqduIMSR4bqndSB0acOqbiBjw6FjIHThuq1wIHRpbiBtw6AgYuG6oW4gxJHDoyDEkcawYSB2w6BvIGtobywgbcOsbmggc+G6vSBuw7NpIGvhu7kgaMahbiB24buBIHZp4buHYyBjb21taXQg4bufIGPDoWMgYsOgaSBzYXUuIFTDs20gbOG6oWkgbMOgIHThu5tpIMSRw6J5IGLhuqFuIMSRw6MgY8OzIG3hu5l0IGtobyBjaOG7qWEgbcOjIG5ndeG7k24gR2l0IHRyw6puIG3DoXkgY+G7p2EgYuG6oW4uDQoNCiMjIFThuqFvIHJlcG9zaXRvcnkgdHLDqm4gR2l0aHViIHbDoCBsw6BtIHZp4buHYw0KVHLGsOG7m2MgdGnDqm4gYuG6oW4gY+G6p24gxJHEg25nIG5o4bqtcCB2w6BvIEdpdGh2Yiwgc2F1IMSRw7Mg4bqlbiB2w6BvIGThuqV1ICsgdHLDqm4gbWVudSB2w6AgY2jhu41uIE5ldyByZXBvc2l0b3J5Lg0KDQpC4bqhbiBz4bq9IGPhuqduIMSR4bq3dCB0w6puIGNobyBraG8gY2jhu6lhIGPhu6dhIGLhuqFuLiBC4bqhbiBjw7MgdGjhu4MgY2jhu41uIGxv4bqhaSBraG8gY2jhu6lhIGzDoCBQdWJsaWMgKGFpIGPFqW5nIGPDsyB0aOG7gyBjbG9uZSkgdsOgIFByaXZhdGUgKGNo4buJIGPDsyBuaOG7r25nIG5nxrDhu51pIMSRxrDhu6NjIGPhuqVwIHF1eeG7gW4gbeG7m2kgY8OzIHRo4buDIGNsb25lKS4NCg0KDQpLaGkgdOG6oW8geG9uZyBuw7Mgc+G6vSBk4bqrbiBi4bqhbiB04bubaSB0cmFuZyBoxrDhu5tuZyBk4bqrbiBsw6BtIHZp4buHYyB24bubaSBraG8gY2jhu6lhIHbhu6thIHThuqFvLiBWw6Aga2hvIGNo4bupYSBj4bunYSBi4bqhbiBiw6J5IGdp4budIHPhur0gY8OzIMSR4buLYSBjaOG7iSBsw6AgaHR0cHM6Ly9naXRodWIuY29tLyR1c2VyLW5hbWUvJHJlcG9zaXRvcnksIHbDrSBk4bulIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3V5ZW5uZ29jYmluaC90ZXN0Lg0KDQpWaeG7h2MgY+G7p2EgYuG6oW4gYsOieSBnaeG7nSBsw6AgaMOjeSBjbG9uZSBjw6FpIGtobyBjaOG7qWEgbsOgeSB24buBIG3DoXkgY+G7p2EgbcOsbmggYuG6sW5nIGzhu4duaCBnaXQgY2xvbmUgxJHhu4thX2No4buJLg0KDQpgYGB7cn0NCiQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3V5ZW5uZ29jYmluaC90ZXN0DQpgYGANCg0KQsOieSBnaeG7nSBow6N5IHRydXkgY+G6rXAgdsOgbyB0aMawIG3hu6VjIHdvcmtpbmcgdHJlZSAodGjGsCBt4bulYyB24burYSBjbG9uZSByZXBvc2l0b3J5IHbhu4EpIHbDoCB0aOG7rSB04bqhbyByYSBt4buZdCBmaWxlIHTDqm4gbMOgIFJFQURNRS5tZCwgc2F1IMSRw7MgZMO5bmcgbOG7h25oIGdpdCBhZGQgxJHhu4MgxJHGsGEgZmlsZSBuw6B5IHbDoG8gU3RhZ2luZyBBcmVhLg0KDQpgYGB7cn0NCiQgY2QgdGVzdA0KJCBlY2hvICIjIEh2b25nIGRhbiBHaXQgY28gYmFuIiA+IFJFQURNRS5tZA0KJCBnaXQgYWRkIFJFQURNRS5tZA0KJCBnaXQgY29tbWl0IC1tICJGaXJzdCBjb21taXQgb24gR2l0aHViIg0KYGBgDQoNClR1eSBuaGnDqm4gc2F1IGtoaSBjb21taXQgeG9uZywgdOG6rXAgdGluIMSRw6MgxJHGsOG7o2MgY29tbWl0IHPhur0gduG6q24ga2jDtG5nIHRo4buDIHh24bqldCBoaeG7h24gdHJvbmcga2hvIGNo4bupYSB0csOqbiBHaXRodWIgbcOgIGLhuqFuIHBo4bqjaSBsw6BtIHRow6ptIG3hu5l0IHZp4buHYyBu4buvYSDEkcOzIGzDoCBkw7luZyBs4buHbmggZ2l0IHB1c2ggxJHhu4MgxJHhuql5IGPDoWMgdOG6rXAgdGluIMSRw6MgxJHGsOG7o2MgY29tbWl0IGzDqm4gR2l0aHViLiBMxrB1IMO9IHLhurFuZyBi4bqhbiBz4bq9IGPhuqduIG5o4bqtcCB0w6BpIGtob+G6o24gdsOgIG3huq10IGto4bqpdSBHaXRodWIuDQoNCm9yaWdpbiBuZ2jEqWEgbMOgIHTDqm4gcmVtb3RlICh4ZW0g4bufIGLDoGkgc2F1KSB2w6AgbWFzdGVyIGzDoCB0w6puIGJyYW5jaCwgaGFpIGPDoWkgbsOgeSBtw6xuaCBz4bq9IGdp4bqjaSB0aMOtY2gga+G7uSBoxqFuIOG7nyBiw6BpIHJpw6puZyBj4bunYSBuw7MuDQoNClRyb25nIGLDoGkgdOG6oW8gcmVwb3NpdG9yeSBjaG8gR2l0IG3DrG5oIGPDsyBuaOG6r2MgcXVhIHbhu4EgY+G7pW0gdOG7qyBTdGFnaW5nIEFyZWEgdsOgIG3hu5l0IHTDrW5oIG7Eg25nIGzDoCBjb21taXQgKOG7p3kgdGjDoWMpLCB24bqteSBoYWkgY8OhaSBuw6B5IGzDoCBnw6wgdGjDrCBtw6xuaCBz4bq9IGdp4bqjaSB0aMOtY2gga+G7uSBoxqFuIHRyb25nIGLDoGkgbsOgeSDEkeG7gyBi4bqhbiBiaeG6v3QgY8OhY2ggc+G7rSBk4bulbmcgY2hvIMSRw7puZy4NCg0KIyMgU3RhZ2luZyBBcmVhIGzDoCBnw6w/DQpTdGFnaW5nIEFyZWEgbmdoxKlhIGzDoCBt4buZdCBraHUgduG7sWMgbcOgIG7DsyBz4bq9IMSRxrDhu6NjIGNodeG6qW4gYuG7iyBjaG8gcXXDoSB0csOsbmggY29tbWl0LiBUcsaw4bubYyBo4bq/dCwgYuG6oW4gY+G6p24gcGjhuqNpIGhp4buDdSBy4bqxbmcgdHJvbmcgY8OhYyBo4buHIHRo4buRbmcgcXXhuqNuIGzDvSBwaGnDqm4gYuG6o24gKFZlcnNpb24gQ29udHJvbCBTeXN0ZW0pIHRow6wgY8OhYyBk4buvIGxp4buHdSBz4bq9IMSRxrDhu6NjIGzGsHUgdHLhu68g4bufIGhhaSBuxqFpLCBt4buZdCBsw6AgdGjGsCBt4bulYyBi4bqhbiDEkWFuZyBsw6BtIHZp4buHYyB0csOqbiBtw6F5IHTDrW5oICh3b3JraW5nIHRyZWUsIG3DrG5oIGtow7RuZyBuaOG6r2MgbOG6oWkgbuG7r2EgxJHDonUpIHbDoCBt4buZdCBsw6Aga2hvIGNo4bupYSBtw6Mgbmd14buTbiAocmVwb3NpdG9yeSkgc2F1IGtoaSBi4bqhbiDEkcOjIHRo4buxYyBoaeG7h24gdGhheSDEkeG7lWkgKHbDrSBk4bulIG5oxrAga2hvIGNo4bupYSB0csOqbiBHaXRodWIpLg0KDQpOaMawbmcgduG7m2kgR2l0IHRow6wgbsOzIGPDsyB0aMOqbSBt4buZdCBs4buxYSBjaOG7jW4gbuG7r2EgxJHDsyBsw6AgY8OzIHRow6ptIG3hu5l0IGtodSB24buxYyB0cnVuZyBnaWFuIGfhu41pIGzDoCBTdGFnaW5nIEFyZWEgdsOgIMSRw6J5IGNow61uaCBsw6AgbeG7mXQgbOG7o2kgdGjhur8gbOG7m24gY+G7p2EgR2l0LiBTdGFnaW5nIEFyZWEgbmdoxKlhIGzDoCBraHUgduG7sWMgc+G6vSBsxrB1IHRy4buvIG5o4buvbmcgdGhheSDEkeG7lWkgY+G7p2EgYuG6oW4gdHLDqm4gdOG6rXAgdGluIMSR4buDIG7DsyBjw7MgdGjhu4MgxJHGsOG7o2MgY29tbWl0LCB2w6wgbXXhu5FuIGNvbW1pdCB04bqtcCB0aW4gbsOgbyB0aMOsIHThuq1wIHRpbiDEkcOzIHBo4bqjaSBu4bqxbSB0cm9uZyBTdGFnaW5nIEFyZWEuIE3hu5l0IHThuq1wIHRpbiBraGkgbuG6sW0gdHJvbmcgU3RhZ2luZyBBcmVhIHPhur0gY8OzIHRy4bqhbmcgdGjDoWkgbMOgIFN0YWdnZWQgKHhlbSB0aMOqbSDhu58gZMaw4bubaSkuDQoNCiFbXShmaWd1cmVzL2dpdC1zdGFnaW5nLWFyZWEucG5nKQ0KDQpWw6AgxJHhu4MgxJHGsGEgbeG7mXQgdOG6rXAgdGluIHbDoG8gU3RhZ2luZyBBcmVhIHRow6wgYuG6oW4gc+G6vSBj4bqnbiBwaOG6o2kgc+G7rSBk4bulbmcgbOG7h25oIGdpdCBhZGQgdMOqbl9maWxlIG3DoCBtw6xuaCDEkcOjIGPDsyB2w60gZOG7pSDhu58gcGjhuqduIHRyxrDhu5tjLg0KDQojIyBDb21taXQgbMOgIGfDrCB2w6AgbsOzIGhv4bqhdCDEkeG7mW5nIHJhIHNhbz8NCkhp4buDdSDEkcahbiBnaeG6o24gaMahbiwgY29tbWl0IG5naMSpYSBsw6AgbeG7mXQgaMOgbmggxJHhu5luZyDEkeG7gyBHaXQgbMawdSBs4bqhaSBt4buZdCBi4bqjbiBjaOG7pXAgKHNuYXBzaG90KSBj4bunYSBjw6FjIHPhu7EgdGhheSDEkeG7lWkgdHJvbmcgdGjGsCBt4bulYyBsw6BtIHZp4buHYywgdsOgIGPDoWMgdOG6rXAgdGluIHbDoCB0aMawIG3hu6VjIMSRxrDhu6NjIHRoYXkgxJHhu5VpIMSRw6MgcGjhuqNpIG7hurFtIHRyb25nIFN0YWdpbmcgQXJlYS4gTeG7l2kgbOG6p24gY29tbWl0IG7DsyBz4bq9IMSRxrDhu6NjIGzGsHUgbOG6oWkgbOG7i2NoIHPhu60gY2jhu4luaCBz4butYSBj4bunYSBtw6Mgbmd14buTbiBrw6htIHRoZW8gdMOqbiB2w6AgxJHhu4thIGNo4buJIGVtYWlsIGPhu6dhIG5nxrDhu51pIGNvbW1pdC4gTmdvw6BpIHJhIHRyb25nIEdpdCBi4bqhbiBjxaluZyBjw7MgdGjhu4Mga2jDtGkgcGjhu6VjIGzhuqFpIHThuq1wIHRpbiB0cm9uZyBs4buLY2ggc+G7rSBjb21taXQgY+G7p2EgbsOzIMSR4buDIGNoaWEgY2hvIG3hu5l0IHBow6JuIG5ow6FuaCAoYnJhbmNoKSBraMOhYywgxJHDonkgbMOgIG3huqV1IGNo4buRdCBj4bunYSB2aeG7h2MgYuG6oW4gc+G6vSBk4buFIGTDoG5nIGtow7RpIHBo4bulYyBs4bqhaSBjw6FjIHRoYXkgxJHhu5VpIHRyxrDhu5tjIMSRw7MgbcOgIG3DrG5oIGPDsyBnaeG7m2kgdGhp4buHdSBxdWEg4bufIHBo4bqnbiBnaeG7m2kgdGhp4buHdSBzZXJpZSBuw6B5Lg0KDQpWw6AgdOG6pXQgbmhpw6puLCBs4buHbmggY29tbWl0IHRyb25nIEdpdCBz4bq9IGzDoCBnaXQgY29tbWl0IC1tICJM4budaSBuaOG6r24iLg0KDQpWw6AgbuG6v3UgYuG6oW4gbXXhu5FuIMSRxrBhIHThuq1wIHRpbiBsw6puIHJlcG9zaXRvcnkgdGjDrCBi4bqhbiBwaOG6o2kgY29tbWl0IG7DsyB0csaw4bubYyBy4buTaSBzYXUgxJHDsyBs4buHbmggZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBz4bq9IGPDsyBuaGnhu4dtIHbhu6UgxJHGsGEgdG/DoG4gYuG7mSBjw6FjIHThuq1wIHRpbiDEkcOjIMSRxrDhu6NjIGNvbW1pdCBsw6puIHJlcG9zaXRvcnkuDQoNCiMjIMSQaeG7gXUga2nhu4duIGfDrCDEkeG7gyBjb21taXQgbeG7mXQgdOG6rXAgdGluPw0KTuG6v3UgYuG6oW4gbXXhu5FuIGNvbW1pdCBt4buZdCB04bqtcCB0aW4gxJHDsywgYuG6oW4gc+G6vSBj4bqnbiBwaOG6o2kgxJHGsGEgdOG6rXAgdGluIMSRw7MgdsOgbyB0cuG6oW5nIHRow6FpIHRyYWNrZWQgYuG6sW5nIGzhu4duaCBnaXQgYWRkIHTDqm5fZmlsZS4gVHJvbmcgZ2l0IGPDsyBoYWkgbG/huqFpIHRy4bqhbmcgdGjDoWkgY2jDrW5oIMSRw7MgbMOgIFRyYWNrZWQgdsOgIFVudHJhY2tlZCwgY+G7pSB0aOG7gzoNCg0KVHJhY2tlZCDigJMgTMOgIHThuq1wIHRpbiDEkcOjIMSRxrDhu6NjIMSRw6FuaCBk4bqldSB0aGVvIGTDtWkgdHJvbmcgR2l0IMSR4buDIGLhuqFuIGzDoG0gdmnhu4djIHbhu5tpIG7Dsy4gVsOgIHRy4bqhbmcgdGjDoWkgVHJhY2tlZCBuw7Mgc+G6vSBjw7MgdGjDqm0gY8OhYyB0cuG6oW5nIHRow6FpIHBo4bulIGtow6FjIGzDoCBVbm1vZGlmaWVkIChjaMawYSBjaOG7iW5oIHPhu61hIGfDrCksIE1vZGlmaWVkICjEkcOjIGNo4buJbmggc+G7rWEpIHbDoCBTdGFnZWQgKMSRw6Mgc+G6tW4gc8OgbmcgxJHhu4MgY29tbWl0KS4NClVudHJhY2tlZCDigJMgTMOgIHThuq1wIHRpbiBjw7JuIGzhuqFpIG3DoCBi4bqhbiBz4bq9IGtow7RuZyBtdeG7kW4gbMOgbSB2aeG7h2MgduG7m2kgbsOzIHRyb25nIEdpdC4NCg0KTmjGsG5nIGLhuqFuIHBo4bqjaSBuw6puIGJp4bq/dCBy4bqxbmcgbuG6v3UgdOG6rXAgdGluIMSRw7MgxJHDoyDEkcaw4bujYyBUcmFja2VkIG5oxrBuZyDEkWFuZyByxqFpIHbDoG8gdHLhuqFuZyB0aMOhaSAoTW9kaWZpZWQpIHRow6wgbsOzIHbhuqtuIHPhur0ga2jDtG5nIHRo4buDIGNvbW1pdCDEkcaw4bujYyBtw6AgYuG6oW4gcGjhuqNpIMSRxrBhIG7DsyB24buBIFN0YWdlZCBjxaluZyBi4bqxbmcgbOG7h25oIGdpdCBhZGQuDQoNCg0KIyMgQuG7jyBxdWEgU3RhZ2luZyBBcmUgxJHhu4MgY29tbWl0DQpOaMawIG3DrG5oIGPDsyBuw7NpIOG7nyB0csOqbiBsw6AgbeG7mXQgdOG6rXAgdGluIHNhdSBraGkgxJHGsOG7o2MgdGhheSDEkeG7lWkgaGF5IHThuqFvIG3hu5tpIHRow6wgbsOzIHBo4bqjaSDEkcaw4bujYyB0aMOqbSB2w6BvIFN0YWdpbmcgQXJlYSB24bubaSBs4buHbmggZ2l0IGFkZC4gVHV5IG5oacOqbiwgYuG6oW4gY8OzIHRo4buDIMSRxrBhIG3hu5l0IHThuq1wIHRpbiDEkcOjIMSRxrDhu6NjIFRyYWNrZWQgxJHhu4MgY29tbWl0IG3DoCBraMO0bmcgY+G6p24gxJHGsGEgbsOzIHbDoG8gU3RhZ2luZyBBcmVhIHbhu5tpIHRoYW0gc+G7kSAtYSB0cm9uZyBs4buHbmggZ2l0IGNvbW1pdC4gVsOtIGThu6U6IGdpdCBjb21taXQgLWEgLW0gIlNraXBwZWQgU3RhZ2luZyBBcmUgdG8gY29tbWl0Ii4NCg0KIyMgVMOsbSBoaeG7g3UgdGjDqm0gduG7gSB0cuG6oW5nIHRow6FpDQoNCiFbXShmaWd1cmVzL2dpdC1saWZlY3ljbGUucG5nKQ0KDQojIyBVbnRyYWNrZWQNCg0KTuG6v3UgYuG6oW4gdOG6oW8gcmEgaG/hurdjIHRow6ptIHbDoG8gbeG7mXQgdOG6rXAgdGluIG3hu5tpIHbDoG8gdHJvbmcgdGjGsCBt4bulYyBsw6BtIHZp4buHYyBj4bunYSBi4bqhbiB0aMOsIG7DsyBz4bq9IOG7nyB0cuG6oW5nIHRow6FpIFVudHJhY2tlZC4gQsOieSBnaeG7nSBtw6xuaCB0aOG7rSB04bqhbyByYSBt4buZdCB04bqtcCB0aW4gbeG7m2kgdMOqbiBsw6AgZmFxLmh0bWwsIHNhdSDEkcOzIGTDuW5nIGzhu4duaCBnaXQgc3RhdHVzIMSR4buDIHhlbSB0cuG6oW5nIHRow6FpIGPhu6dhIEdpdCB0cm9uZyB0aMawIG3hu6VjIGzDoG0gdmnhu4djLg0KDQpgYGB7cn0NCiQgdG91Y2ggZmFxLmh0bWwNCiQgZ2l0IHN0YXR1cw0KYGBgDQoNCk5vdGU6IEzhu4duaCB0b3VjaCBsw6AgdOG6oW8gcmEgbeG7mXQgdOG6rXAgdGluIHLhu5duZy4NCg0KQsOieSBnaeG7nSBi4bqhbiBz4bq9IHRo4bqleSBuw7MgxJHDoyBsaeG7h3Qga8OqIHJhIHTDqm4gdOG6rXAgdGluIMSRYW5nIOG7nyB0cuG6oW5nIHRow6FpIFVudHJhY2tlZC4gxJDhu4MgxJHGsGEgbsOzIHbhu4EgVHJhY2tlZCBi4bqhbiBz4bq9IHPhu60gZOG7pW5nIGzhu4duaCBnaXQgYWRkIHbDoCB4ZW0gbOG6oWkgdHLhuqFuZyB0aMOhaSBj4bunYSBuw7MuDQoNCkLDonkgZ2nhu50gYuG6oW4gdGjhuqV5LCB04bqtcCB0aW4gZmFxLmh0bWwgY+G7p2EgbcOsbmggxJHDoyDEkcaw4bujYyDEkcawYSB24buBIHRy4bqhbmcgdGjDoWkgU3RhZ2VkIHbDoCBuw7MgY8OzIHRo4buDIMSRxrDhu6NjIGNvbW1pdC4gVOG6oWkgc2FvPyBWw6wgYuG6oW4gcGjhuqNpIGJp4bq/dCBy4bqxbmcgbuG6v3UgbeG7mXQgdOG6rXAgdGluIOG7nyB0cuG6oW5nIHRow6FpIFVudHJhY2tlZCBtw6AgxJHGsOG7o2MgxJHGsGEgduG7gSBUcmFja2VkIHRow6wgbsOzIHPhur0gbuG6sW0g4bufIHRy4bqhbmcgdGjDoWkgU3RhZ2VkIGx1w7RuLCB0cuG7qyBraGkgYuG6oW4gdGhheSDEkeG7lWkgbuG7mWkgZHVuZyB04bqtcCB0aW4gbsOgeSB0aMOsIG7DsyBz4bq9IMSRxrBhIHbhu4EgdHLhuqFuZyB0aMOhaSBNb2RpZmllZCB2w6AgbsOzIGtow7RuZyB0aOG7gyBjb21taXQgdHLhu6sga2hpIGLhuqFuIGfDtSBs4buHbmggZ2l0IGFkZCBjaG8gbsOzLg0KDQojIyBUcmFja2VkDQoNCk3hu5l0IGtoaSBt4buZdCB04bqtcCB0aW4gxJHDoyDEkcaw4bujYyDEkcawYSB24buBIFRyYWNrZWQgdGjDrCBuw7Mgc+G6vSBjw7MgdGjhu4MgdGhheSDEkeG7lWkgZ2nhu69hIDMgdHLhuqFuZyB0aMOhaSBraMOhYyBuaGF1IGzDoCBNb2RpZmllZCwgVW5tb2RpZmllZCB2w6AgU3RhZ2VkLg0KDQpUcsaw4bubYyBo4bq/dCBiw6J5IGdp4budIG3DrG5oIMSRw6MgY8OzIG3hu5l0IHThuq1wIHRpbiBt4bubaSDEkcOjIMSRxrDhu6NjIMSRxrBhIHbhu4EgU3RhZ2VkIHbhu5tpIGzhu4duaCBnaXQgYWRkIG5oxrAgdsOtIGThu6UgdHLDqm4uIELDonkgZ2nhu50gbcOsbmggdGnhur9uIGjDoG5oIHRoYXkgxJHhu5VpIG7hu5lpIGR1bmcgY+G7p2EgdOG6rXAgdGluIGZhcS5odG1sIG7DoHkgdsOgIHhlbSBr4bq/dCBxdeG6oyBj4bunYSBs4buHbmggZ2l0IHN0YXR1cy4NCg0KYGBge3J9DQokIGdpdCBzdGF0dXMNCmBgYA0KDQoNCkLhuqFuIGPDsyB0aOG6pXkgc+G7sSBr4buzIGzhuqEg4bufIHThuq1wIHRpbiBmYXEuaHRtbCBraMO0bmc/IMSQw7MgbMOgIG7DsyDEkcaw4bujYyBoaeG7g24gdGjhu4sg4bufIGhhaSB0cuG6oW5nIHRow6FpIFN0YWdlZCAoY8OzIHRo4buDIGNvbW1pdCkgdsOgIE1vZGlmaWVkIChraMO0bmcgdGjhu4MgY29tbWl0KSBoYXkgY8OybiBn4buNaSBsw6AgVW5zdGFnZWQuIFPhu58gZMSpIGPDsyBz4buxIGvhu7MgbOG6oSDEkcOzIOG7nyDEkcOieSBsw6AgYuG7n2kgdsOsIHRyxrDhu5tjIMSRw7MgYuG6oW4gxJHDoyB04bqhbyByYSB04bqtcCB0aW4gZmFxLmh0bWwgdsOgIMSRxrBhIHbhu4EgVHJhY2tlZCB0aMOsIG7DsyBjxaluZyDEkcOjIMSRxrDhu6NjIMSRxrBhIHbhu4EgU3RhZ2VkIMSR4buDIGPDsyB0aOG7gyBjb21taXQuIFR1eSBuaGnDqm4gc2F1IMSRw7MgYuG6oW4gbOG6oWkgY2jhu4luaCBz4butYSBu4buZaSBkdW5nIGPhu6dhIG7DsyBuw6puIG7DsyDEkcOjIGPDsyBt4buZdCBwaGnDqm4gYuG6o24ga2jDoWMgbuG6sW0g4bufIHRy4bqhbmcgdGjDoWkgTW9kaWZpZWQgKGtow7RuZyB0aOG7gyBjb21taXQpLiBO4bq/dSBiw6J5IGdp4budIGLhuqFuIGfDtSBs4buHbmggZ2l0IGNvbW1pdCDEkeG7gyDhu6d5IHRow6FjIG7DsyB0aMOsIGLhuqNuIGNo4bulcCBj4bunYSB04bqtcCB0aW4gZmFxLmh0bWwg4bufIGzhuqduIGN14buRaSBjw7luZyBi4bqhbiBnw7UgbOG7h25oIGdpdCBhZGQgc+G6vSDEkcaw4bujYyBjb21taXQgbMOqbiBjaOG7qSBuw7Mga2jDtG5nIGNo4bupYSBjw6FjIG7hu5lpIGR1bmcgbcOgIGLhuqFuIHbhu6thIHRow6ptIHbDoG8uIFbDoCDEkeG7gyBuw7MgY8OzIHRo4buDIGNvbW1pdCB04bqtcCB0aW4gZmFxLmh0bWwgxJHDoyDEkcaw4bujYyBjaOG7iW5oIHPhu61hIHRow6wgYuG6oW4gcGjhuqNpIGfDtSBs4bqhaSBs4buHbmggZ2l0IGFkZCBmYXEuaHRtbCBs4bqnbiBu4buvYS4NCg0KIyMgQ2h2eeG7g24gdOG6rXAgdGluIHThu6sgVW50cmFja2VkIHbhu4EgVHJhY2tlZA0KDQpUcm9uZyBHaXQsIGLhuqFuIGPDsyB0aOG7gyDEkcawYSBt4buZdCB04bqtcCB0aW4gdOG7qyBUcmFja2VkIHbhu4EgVW50cmFja2VkIHbhu5tpIGzhu4duaCBybSB0w6puX2ZpbGUuIEzhu4duaCBybSBz4bq9IGdpw7pwIGLhuqFuIMSRxrBhIHThuq1wIHRpbiB24buBIHRy4bqhbmcgdGjDoWkgVW50cmFja2VkIG5oxrBuZyBraMO0bmcgeMOzYSBo4bqzbiB0cm9uZyDhu5UgY+G7qW5nLg0KDQpgYGB7cn0NCiQgcm0gZmFxLmh0bWwNCiQgZ2l0IHN0YXR1cw0KYGBgDQoNCkPDsm4gbuG6v3UgYuG6oW4gbXXhu5FuIHjDs2EgbsOzIGx1w7RuIHRow6wgZMO5bmcgbOG7h25oIGBnaXQgcm0gLWYgdMOqbl9maWxlYCB2w6Agbmjhu5sgY+G6qW4gdGjhuq1uIGtoaSBkw7luZyBs4buHbmggbsOgeS4NCg0KIyBTxqEgbMaw4bujYyByZW1vdGUgcmVzcG9zaXRvcnkgdsOgIG9yaWdpbg0KDQpRdWF5IHRy4bufIGzhuqFpIGLDoGkgdOG6oW8gcmVwb3NpdG9yeSwgbcOsbmggY8OzIGjGsOG7m25nIGThuqtuIGLhuqFuIGPDoWNoIHThuqFvIG3hu5l0IHJlcG9zaXRvcnkgdHLDqm4gZOG7i2NoIHbhu6UgR2l0aHViIHbDoCBDbG9uZSBuw7MgduG7gSBtw6F5LiBOaMawIHbhuq15LCBjw6FpIEdpdGh2YiBsw6AgbeG7mXQgbcOheSBjaOG7pyByZXBvc2l0b3J5IHThu6sgeGEgbsOqbiBtw6xuaCBz4bq9IGfhu41pIG7DsyBsw6AgUmVtb3RlIFJlcG9zaXRvcnksIG5naMSpYSBsw6AgcmVwb3NpdG9yeSBuw6B5IGtow7RuZyBu4bqxbSB0csOqbiBtw6F5IHTDrW5oIGPhu6dhIGLhuqFuLg0KDQpWw6Ag4bufIHBo4bqnbiDEkcOzLCBi4bqhbiBjw7MgdGjhuqV5IG3DrG5oIGvDqnUgY8OhYyBi4bqhbiBn4butaSBk4buvIGxp4buHdSBsw6puIHJlcG9zaXRvcnkgYuG6sW5nIGPDoWNoIGTDuW5nIGzhu4duaCBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyIHNhdSBraGkgY29tbWl0IGtow7RuZz8gQ8OhaSBtYXN0ZXIgbMOgIHTDqm4gYnJhbmNoIG3DoCBtw6xuaCBz4bq9IGtow7RuZyBuw7NpIOG7nyBiw6BpIG7DoHksIG5oxrBuZyBjw6FpIG9yaWdpbiB0cm9uZyDEkW/huqFuIMSRw7MgY2jDrW5oIGzDoCB0w6puIHJlbW90ZSByZXBvc2l0b3J5LiBN4bq3YyDEkeG7i25oIGtoaSBjbG9uZSBt4buZdCByZXBvc2l0b3J5IHRow6wgbsOzIHThu7EgxJHhurd0IHTDqm4gbMOgIG9yaWdpbi4NCg0KxJDhu4Mga2nhu4NtIHRyYSB0w6puIHJlbW90ZSwgYuG6oW4gY8OzIHRo4buDIGfDtSBs4buHbmggYGdpdCByZW1vdGUgLXZgLg0KDQpUcm9uZyDEkcOzIGLhuqFuIGPDsyB0aOG7gyB0aOG6pXkgY8OhaSByZXBvc2l0b3J5IG3DrG5oIMSRw6MgY2xvbmUgxJHhu4F1IMSRxrDhu6NjIMSR4bq3dCB0w6puIGzDoCBvcmlnaW4sIHbDoCBt4buXaSByZXBvc2l0b3J5IGLhuqFuIGPDsyBoYWkgxJHhu4F1IGPDsyBoYWkgaMOgbmggxJHhu5luZyBsw6AgZmV0Y2ggKGzhuqV5IGThu68gbGnhu4d1IHbhu4EgdOG7qyBzZXJ2ZXIpIHbDoCBwdXNoIChn4butaSBk4buvIGxp4buHdSBsw6puIHNlcnZlcikuDQoNCk5ow6xuIGzhuqFpIMSRb+G6oW4gbOG7h25oIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIg4bufIHRyw6puLCDEkWnhu4F1IMSRw7MgY8OzIG5naMSpYSBsw6AgYuG6oW4gZ+G7rWkgdOG6pXQgY+G6oyBjw6FjIHRoYXkgxJHhu5VpIHRyw6puIG3DoyBuZ3Xhu5NuIOG7nyBtw6F5IGLhuqFuIGzDqm4gcmVtb3RlIHTDqm4gbMOgIG9yaWdpbiB24bubaSBicmFuY2ggbWFzdGVyLg0KDQojIyDEkOG7lWkgdMOqbiByZW1vdGUNCk7hur91IGLhuqFuIGtow7RuZyB0aMOtY2ggdMOqbiBvcmlnaW4gdGjDrCBjw7MgdGjhu4MgxJHhu5VpIHTDqm4gbsOzIGzhuqFpIG7DsyBi4bqxbmcgdMOqbiBraMOhYyBjaG8gZOG7hSBxdeG6o24gbMO9IG7hur91IG5oxrAgYuG6oW4gY8OzIG5oaeG7gXUgcmVtb3RlIHRyb25nIG3hu5l0IGThu7Egw6FuIHbhu5tpIGzhu4duaCBnaXQgcmVtb3RlIHJlbmFtZSB0w6puX2PFqSB0w6puX23hu5tpLiBWw60gZOG7pSBtw6xuaCBj4bqnbiDEkeG7lWkgdOG7qyBvcmlnaW4gc2FuZyBiaW5oIHRow6wgc+G6vSDEkeG7lWkgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KJCBnaXQgcmVtb3RlIHJlbmFtZSBvcmlnaW4gYmluaA0KJCBnaXQgcmVtb3RlIC12DQpgYGANCg0KQsOieSBnaeG7nSBraGkgY29tbWl0IGhheSBwdXNoIGLhuqFuIGPDsyB0aOG7gyBnw7UgZ2l0IHB1c2ggdGhhY2ggbWFzdGVyIMSR4buDIGfhu61pIG3DoyBuZ3Xhu5NuIGzDqm4gcmVtb3RlIHJlcG9zaXRvcnkgbsOgeS4NCg0KIyMgVGjDqm0gbeG7mXQgcmVtb3RlDQoNClRyxrDhu51uZyBo4bujcCBi4bqhbiBj4bqnbiB0aMOqbSBt4buZdCBjw6FpIHJlbW90ZSDEkeG7gyBs4bqleSBk4buvIGxp4buHdSBraGkgY+G6p24gdGjDrCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgbOG7h25oIGdpdCByZW1vdGUgYWRkIHTDqm5fcmVtb3RlIFVSTC4gVsOtIGThu6UgbcOsbmggY+G6p24gcmVtb3RlIG3hu5l0IHJlcG9zaXRvcnkgdsOgIMSR4bq3dCB0w6puIG7DsyBsw6AgaW51aXQgdGjDrCBz4bq9IHZp4bq/dCBuaMawIHNhdToNCg0KYGBge3J9DQokIGdpdCByZW1vdGUgYWRkIHNuaXBwZXQgaHR0cHM6Ly9naXRodWIuY29tL25ndXllbm5nb2NiaW5oL3JzbmlwcGV0DQokIGdpdCByZW1vdGUgLXYNCmBgYA0KDQpTYXUgxJHDsyBu4bq/dSBi4bqhbiBtdeG7kW4gbOG6pXkgZOG7ryBsaeG7h3UgdOG7qyBjw6FpIHNuaXBwZXQga2lhIHbhu4EgdGjDrCBjaOG7iSBj4bqnbiBz4butIGThu6VuZyBs4buHbmggYGdpdCBmZXRjaCBzbmlwcGV0YA0KDQpMxrB1IMO9IGzDoCBs4buHbmggZ2l0IGZldGNoIG7DsyBjaOG7iSBs4bqleSB24buBIHbDoCBsxrB1IHbDoG8gZGF0YWJhc2UgY+G7p2EgR2l0IHRyw6puIG3DoXkgY2jhu6kga2jDtG5nIMSRxrDhu6NjIGfhu5lwIHbDoG8gcmVwb3NpdG9yeSBj4bunYSBi4bqhbi4gxJDhu4MgZ+G7mXAgdsOgbyBi4bqhbiBjw7MgdGjhu4MgZ8O1IHRow6ptIGzhu4duaCBgZ2l0IG1lcmdlIHNuaXBwZXRgLCB0cm9uZyDEkcOzIHNuaXBwZXQgbMOgIHTDqm4gcmVtb3RlLg0KDQpDw7JuIG7hur91IGLhuqFuIG114buRbiBuw7MgbOG6pXkgduG7gSB0cuG7sWMgdGnhur9wIG3DoCBraMO0bmcgY+G6p24gZ+G7mXAgdGjDrCBz4butIGThu6VuZyBs4buHbmggZ2l0IHB1bGwgdMOqbl9yZW1vdGUsIHR1eSBuaGnDqm4gbcOsbmgga2h2eeG6v24ga2jDrWNoIGLhuqFuIG7Dqm4gZ+G7mXAgdsOgbyBicmFuY2gga2hpIGPhuqduIHbDoCBuaOG7myBj4bqpbiB0aOG6rW4gdHJvbmcgdmnhu4djIGfhu5lwLCB04buRdCBuaOG6pXQgbsOqbiB04bqhbyB0aMawIG3hu6VjIG3hu5tpIHRyb25nIHRoxrAgbeG7pWMgbMOgbSB2aeG7h2MgY+G7p2EgYuG6oW4gcuG7k2kgdsOgbyDEkcOzIG3DoCBs4bqleSB24buBLg0KDQojIFPhu7Ega2jDoWMgbmhhdSBnaeG7r2EgY2xvbmUsIGZldGNoIHbDoCBwdWxsDQoNCkPDsyB0aOG7gyBiw6J5IGdp4budIGLhuqFuIMSRw6MgYmnhur90IMSRxrDhu6NjIDMgbOG7h25oIMSR4buDIGzhuqV5IGThu68gbGnhu4d1IHbhu4EgdOG7qyByZXBvc2l0b3J5IMSRw7MgbMOgIGdpdCBjbG9uZSwgZ2l0IGZldGNoIHbDoCBnaXQgcHVsbC4gTmjGsG5nIGPhuqMgYmEgbG/huqFpIMSR4buBdSBsw6AgbOG6pXkgZOG7ryBsaeG7h3UsIHRo4bq/IHPhu7Ega2jDoWMgbmhhdSBj4bunYSBuw7MgbMOgIGfDrD8NCg0KIyMgZ2l0IGNsb25lDQoNCkzhu4duaCBuw6B5IHPhur0gc2FvIGNow6lwIHRvw6BuIGLhu5kgZOG7ryBsaeG7h3UgdHLDqm4gcmVwb3NpdG9yeSB2w6Agc2FvIGNow6lwIGx1w7RuIGPDoWMgdGhp4bq/dCBs4bqtcCB24buBIHJlcG9zaXRvcnksIHThu6ljIGzDoCBuw7Mgc+G6vSB04buxIMSR4buZbmcgdOG6oW8gbeG7mXQgbWFzdGVyIGJyYW5jaCB0csOqbiBtw6F5IHTDrW5oIGPhu6dhIGLhuqFuLiBM4buHbmggbsOgeSBjaOG7iSBuw6puIHPhu60gZOG7pW5nIGtoaSBi4bqhbiBj4bqnbiB04bqhbyBt4bubaSBt4buZdCBHaXQgbeG7m2kgdHLDqm4gbcOheSB0w61uaCB24bubaSB0b8OgbiBi4buZIGThu68gbGnhu4d1IHbDoCB0aGnhur90IGzhuq1wIGPhu6dhIG3hu5l0IHJlbW90ZSByZXBvc2l0b3J5Lg0KDQojIyBnaXQgcHVsbA0KDQpM4buHbmggbsOgeSBz4bq9IHThu7EgxJHhu5luZyBs4bqleSB0b8OgbiBi4buZIGThu68gbGnhu4d1IHThu6sgcmVtb3RlIHJlcG9zaXRvcnkgdsOgIGfhu5lwIHbDoG8gY8OhaSBicmFuY2ggaGnhu4duIHThuqFpIGLhuqFuIMSRYW5nIGzDoG0gdmnhu4djLg0KDQojIyBnaXQgZmV0Y2gNCg0KTOG7h25oIG7DoHkgc+G6vSBs4bqleSB0b8OgbiBi4buZIGThu68gbGnhu4d1IHThu6sgcmVtb3RlIHJlcG9zaXRvcnkgbmjGsG5nIHPhur0gY2hvIHBow6lwIGLhuqFuIGfhu5lwIHRo4bunIGPDtG5nIHbDoG8gbeG7mXQgYnJhbmNoIG7DoG8gxJHDsyB0csOqbiB0aMawIG3hu6VjIEdpdCDhu58gbcOheSB0w61uaC4NCg0KVOG6oW0gdGjhu51pIGLhuqFuIG7Dqm4gaGnhu4N1IHRo4bq/LCDhu58gYsOgaSBicmFuY2ggYuG6oW4gc+G6vSBoaeG7g3Ugc8OidSBoxqFuLg0KDQojIyBDw6FjIGxv4bqhaSBnaWFvIHRo4bupYyBj4bunYSBSZW1vdGUgUmVwb3NpdG9yeQ0KDQpDaMO6bmcgdGEga2jDtG5nIGNo4buJIGvhur90IG7hu5FpIHbhu5tpIG3hu5l0IHJlbW90ZSByZXBvc2l0b3J5IHF1YSBnaWFvIHRo4bupYyBIVFRQIGhheSBIVFRQUyBtw6AgY8OybiBjw7MgdGjhu4MgY2jhu41uIG5oaeG7gXUgZ2lhbyB0aOG7qWMga2jDoWMsIGTGsOG7m2kgxJHDonkgbMOgIG3hu5l0IHbDoGkgZ2lhbyB0aOG7qWMgcmVtb3RlIHJlcG9zaXRvcnkuDQoNCiMjIExvY2FsIFJlcG9zaXRvcnkNCg0KR2lhbyB0aOG7qWMgbsOgeSBuZ2jEqWEgbMOgIGLhuqFuIGvhur90IG7hu5FpIHThu5tpIG3hu5l0IHJlcG9zaXRvcnkgbsOgbyDEkcOzIHRyw6puIGNow61uaCBtw6F5IHTDrW5oIGPhu6dhIGLhuqFuIHbDoCBVUkwgY+G7p2EgZ2lhbyB0aOG7qWMgc+G6vSBjw7MgZOG6oW5nIC9wYXRoL3JlcG9zaXRvcnkvLg0KDQojIyBIVFRQIFJlcG9zaXRvcnkNCg0KR2lhbyB0aOG7qWMgdGjDtG5nIGThu6VuZyBuaOG6pXQgY8WpbmcgbmjGsCBk4buFIGhp4buDdSBuaOG6pXQsIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyBu4bq/dSBi4bqhbiBkw7luZyBjw6FjIGThu4tjaCB24bulIHJlbW90ZSByZXBvc2l0b3J5IG5oxrAgR2l0aHViIGhheSBBc3NlbWJsYSwgbsOzIHPhur0gYmFvIGfhu5NtIMSR4buLbmggZOG6oW5nIGh0dHA6Ly9kb21haW4uY29tL3JlcG9zaXRvcnkuZ2l0IGhv4bq3YyBodHRwczovL2RvbWFpbi5jb20vcmVwb3NpdG9yeS5naXQuDQoNCiMjIFNTSCBSZXBvc2l0b3J5DQoNCkdpYW8gdGjhu6ljIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIGTDuW5nIHRyw6puIGPDoWMgbmh2IGPhuqd1IHThuqFvIG3hu5l0IHNlcnZlciByZXBvc2l0b3J5IHJpw6puZyB2w6Aga+G6v3QgbuG7kWkgdGjDtG5nIHF1YSBnaWFvIHRo4bupYyBTU0guIMSQxrDhu51uZyBk4bqrbiBj4bunYSBnaWFvIHRo4bupYyBuw6B5IHPhur0gY8OzIGThuqFuZyBsw6AgdXNlckBzZXJ2ZXI6L3BhdGgvcmVwb3NpdG9yeS5naXQuIOG7niBwaOG6p24gY3Xhu5FpIHNlcmllIG3DrG5oIHPhur0gaMaw4bubbmcgZOG6q24gYuG6oW4gY8OhY2ggdOG6oW8gbeG7mXQgcmVwb3NpdG9yeSBzZXJ2ZXIgcmnDqm5nIHbDoCBuw7MgbMOgIGzhu7FhIGNo4buNbiBy4bqldCB04buRdCBu4bq/dSBi4bqhbiBsw6BtIHZp4buHYyBuaMOzbSBtw6Aga2jDtG5nIGPhuqduIHBo4bulIHRodeG7mWMgdsOgbyBjw6FjIGThu4tjaCB24bulIG5oxrAgR2l0aHViIGhheSBBc3NlbWJsYS4NCg==