Basic_Linux_Commands_You_Must_Know

如何寻求帮助?

在 Linux 下遇到问题,最重要的是要自己寻求帮助,下面是三种寻求帮助的方法。

man

第一个你需要知道的Linux命令就是man命令,该命令可以显示指定命令的用法和描述。

语法: man

man 是 Linux 的帮助手册,即 manual 。因为大多数程序都会自带手册,所以可以通过 man 命令获取帮助。执行以后,在 man page 页面中按 q 退出。

比如你想知道ls命令的用法和选项,可以在终端执行“man ls”,获取 ls 的帮助

man ls

root@devopscube:~# man ls
LS(1)                            User Commands                           LS(1)
NAME
       ls - list directory contents
SYNOPSIS
       ls [OPTION]... [FILE]...
DESCRIPTION
       List  information  about  the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuvSUX nor --sort  is  speciâ
       fied.
       Mandatory  arguments  to  long  options are mandatory for short options
       too.
       -a, --all
              do not ignore entries starting with .

查看有多少(针对不同方面的)同名手册

$ man -f ls
ls (1)               - list directory contents
ls (1p)              - list directory contents

查看特定的手册

$ man 1p ls

info

与 man 不同的是,可以像浏览网页一样在各个节点中跳转。

从文档首页开始浏览

$ info

获取特定程序的帮助

$ info program

help

除了上面的两种方法外,还有一种简单使用的方法,那就是 –help 参数,一般程序都会有这个参数,会输出最简单有用的介绍。

$ man --help       ### 获取 man 的帮助
$ info --help      ### 获取 info 的帮助
$ ls --help        ### 获取 ls 的帮助

============================================================

终端如何简单操作?

在 Terminal(终端) 中,有许多操作技巧,这里就介绍几个简单的。 ### 终端简单操作

up(方向键上) 可以调出输入历史执行记录,快速执行命令
down(方向键下) 配合 up 选择历史执行记录
Home 移动光标到本行开头
End 移动光标到本行结尾
PgUp 向上翻页
PaDN 向下翻页
ctrl + c 终止当前程序

Tab 补全

Tab 补全是非常有用的一个功能,可以用来自动补全命令或文件名,省时准确。 未输入状态下连按两次 Tab 列出所有可用命令 已输入部分命令名或文件名,按 Tab 进行自动补全,多用你就肯定会喜欢的了。

============================================================

Basic_Linux_Commands

虽然Linux发行版支持各种各样的GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的。Bash和 Linux Shell 需要输入命令来完成任务,因而被称为命令行接口。

命令是计算机执行任务的指令。可以使用命令去关闭计算机,或者列出当前目录的文件列表,或当前文本的内容,或者屏幕显示一条消息。

如果你是一个新手,并尝试使用命令行接口,我们收集了各种基本的Linux命令来供你学习,帮你在各种Linux发行版中完成各种任务。虽然不是很详细,但是对Linux初学者,或普通用火,或管理员都是很有用的。

1. ls – List

ls会列举出当前工作目录的内容(文件或文件夹),就跟你在GUI中打开一个文件夹去看里面的内容一样。

ls 即 list ,列出文件。

$ ls       ### 仅列出当前目录可见文件
$ ls -l    ### 列出当前目录可见文件详细信息,长列表
$ ls -hl   ### 列出详细信息并以可读大小显示文件大小,详细信息
$ ls -al   ### 列出所有文件(包括隐藏)的详细信息

注意: Linux 中 以 . 开头的文件或文件夹均为隐藏文件或隐藏文件夹。

2. mkdir – Make Directory

mkdir 创建一个新目录,用于新建文件夹。

$ mkdir folder
$ mkdir -p folder/subfolder    ### -p 参数为当父目录存在时忽略,若不存在则建立,用此参数可建立多级文件夹

3. pwd – Print Working Directory

pwd显示当前工作目录,用于返回当前工作目录的名字,为绝对路径名。

$ pwd
/home

4. cd – Change Directory

对于当前在终端运行的会中中,cd 将给定的文件夹(或目录)设置成当前工作目录。

cd 是打开某个路径的命令,也就是打开某个文件夹,并跳转到该处。

$ cd path      ### path 为你要打开的路径。
# $ cd(change directory) 切换文件夹,这个应该是最常用的 
$ cd - # 返回刚才的目录 
$ cd ~ # 主目录 

其中 path 有绝对路径和相对路径之分,绝对路径强调从 / 起,一直到所在路径。相对路径则相对于当前路径来说,假设当前家目录有etc 文件夹(绝对路径应 为 /home/username/etc),如果直接 cd etc 则进入此文件夹,但若是 cd /etc/ 则是进入系统 etc ,多琢磨一下就可以理解了。另外在 Linux 中, . 代表当前目录, .. 代表上级目录,因此返回上级目录可以 cd .. 。

5. rmdir – Remove Directory

rmdir 删除给定的目录。

6. rm – Remove

rm 即 remove ,删除文件。 rm 会删除给定的文件或文件夹,可以使用rm -r 递归删除文件夹

$ rm filename      ### 删除 filename
$ rm -i filename   ### 删除 filename 前提示,若多个文件则每次提示
$ rm -rf folder/subfolder/  ### 递归删除 subfolder 下所有文件及文件夹,包括 subfolder 自身
$ rm -d folder     ###  删除空文件夹

7. cp – Copy

cp 即 copy ,复制文件。

cp 命令对文件或文件夹进行复制

可以使用cp -r 选项来递归复制文件夹。

$ cp source dest            ### 将 source 复制到 dest
$ cp folder/*  dest         ### 将 folder 下所有文件(不含子文件夹中的文件)复制到 dest
$ cp -r folder  dest        ### 将 folder 下所有文件(包含子文件夹中的所有文件)复制到 dest

8. mv – MoVe

mv 即 move ,移动文件。 mv 命令对文件或文件夹进行移动 如果文件或文件夹存在于当前工作目录,还可以对文件或文件夹进行重命名。

$ mv source  folder        ### 将 source 移动到 folder 下,完成后则为  folder/source
$ mv -i source folder      ### 在移动时,若文件已存在则提示 **是否覆盖**
$ mv source dest           ### 在 dest 不为目录的前提下,重命名 source 为 dest

9. cat – concatenate and print files

cat 用于在标准输出(监控器或屏幕)上查看文件内容。用于输出文件内容到 Terminal 。

cat命令用来查看文件的内容,但是使用cat命令并不能编辑文件的内容,它仅仅是可以浏览文件内容。cat命令不支持键盘上下键翻页。

语法: cat <filename>
cat demo.txt

变形1: 
head -n 5 hello_world.txt 

变形2:
tail -n 5 hello_world.txt 
$ cat /etc/locale.gen     ### 输出 locale.gen 的内容
$ cat -n /etc/locale.gen  ### 输出 locale.gen 的内容并显示行号
$ cat /proc/version ### 系统信息 
$ cat /proc/meminfo ### 内存信息 
$ cat /proc/partitions ### 硬盘信息 

10. tail – print TAIL (from last) >

tail 默认在标准输出上显示给定文件的最后10行内容,可以使用tail -n N 指定在标准输出上显示文件的最后N行内容。

11. less – print LESS

less 按页或按窗口打印文件内容。在查看包含大量文本数据的大文件时是非常有用和高效的。你可以使用Ctrl+F向前翻页,Ctrl+B向后翻页。

12. grep

grep “在给定的文件中搜寻指定的字符串。grep -i “在搜寻时会忽略字符串的大小写,而grep -r “则会在当前工作目录的文件中递归搜寻指定的字符串。

grep 主要用于返回匹配的项目,支持正则表达式。Grep命令非常强大,系统管理员经常会用到它。grep命令可以在文件中搜索指定格式的字符串,同时对其进行标准输出。

语法: grep "<search string>" <filename> 
        grep "Mathew" test.txt
$ grep PATTERN filename      ## 返回所有含有 PATTERN 的行
$ grep zh_CN /etc/locale.gen ## 返回所有含 zh_CN 的行
root@devopscube:~# grep "dennis" test.txt
# 4 dennis start beginner jul

上面命令的输出结果是包含该子字符串的,如果你想检索完整的单词,你需要添加“-i”选项。同时,也可以用grep命令在多个文件中搜索字符串,命令代码如下:

grep “dennis” test1.txt test2.txt test3.txt 当然你也可以用正则表达式来匹配字符串。

4、cut命令

cut命令可以让你用列或者分隔符提取文件中的指定部分。如果你要列出文件中某列的全部内容,可以使用“-c”选项。例如,下面将从test.txt文件中提取第1、2列的全部内容。

cut -c1-2 test.txt

root@devopscube:~# cut -c1-2 test.txt 1 10 45 4 7 58

如果你希望从文件中提取指定的字符串,那么你可以使用分隔符选项“-d”和“-f”选项选中列。例如,我们可以利用cut命令提取names列:

cut -d’ ’ -f2 test.txt

root@devopscube:~# cut -d’ ’ -f2 test.txt mike lucy Dave dennis Megan Mathew

下面的例子从/etc/passd file中提取users列:

cut -d’:’ -f1 /etc/passwd

13. Find

这个命令会在给定位置搜寻与条件匹配的文件。你可以使用find -name 的-name选项来进行区分大小写的搜寻,find -iname 来进行不区分大小写的搜寻。

find -iname

find命令示例

find命令用来检索文件,可以用“-name”选项来检索指定名称的文件:

find -name  find -name test.txt

root@devopscube:/home/ubuntu# cd ~
root@devopscube:~# find -name test.txt
./demo/test.txt
./test.txt

你也可以用“/ -name”来检索指定名称的文件夹: find / -name passwd

root@devopscube:~# find / -name passwd
/etc/cron.daily/passwd
/etc/pam.d/passwd
/etc/passwd
/usr/share/lintian/overrides/passwd

14. tar

tar命令用来压缩和解压缩文件,其中经常会用到“-cf”和“-xf”选项。 ~~~~ 语法: tar ~~~~

tar命令能创建、查看和提取tar压缩文件。tar -cvf <archive-name.tar> 是创建对应压缩文件,tar -tvf <archive-to-view.tar>来查看对应压缩文件,tar -xvf <archive-to-extract.tar>来提取对应压缩文件。

tar 主要用于创建归档文件,和解压归档文件,其本身是没有压缩功能的,但可以调用 gzip 、 bzip2 进行压缩处理。 参数解释: -c 创建归档 -x 解压归档 -v 显示处理过程 -f 目标文件,其后必须紧跟 目标文件 -j 调用 bzip2 进行解压缩 -z 调用 gzip 进行解压缩 -t 列出归档中的文件

$ tar -cvf filename.tar .       ## 将当前目录所有文件归档,但不压缩,注意后面有个 ’.‘ ,不可省略,代表当前目录的意思
$ tar -xvf filename.tar         ## 解压 filename.tar 到当前文件夹
$ tar -cvjf filename.tar.bz2 .  ## 使用 bzip2 压缩
$ tar -xvjf  filename.tar.bz2   ## 解压 filename.tar.bz2 到当前文件夹
$ tar -cvzf filename.tar.gz     ## 使用 gzip  压缩
$ tar -xvzf filename.tar.gz     ## 解压 filename.tar.gz 到当前文件夹
$ tar -tf   filename            ## 只查看 filename 归档中的文件,不解压

让我们将test.txt文件打包:

# tar -cf test.tar test.txt
root@devopscube:~# tar -cf test.tar test.txt
root@devopscube:~# ls
test.tar  test.txt

用“-C”选项将刚才打包好的test.tar文件解压缩至“demo”目录:

tar -xf test.tar -C /root/demo/

root@devopscube:~# tar -xf test.tar -C /root/demo/
root@devopscube:~# cd demo/
root@devopscube:~/demo# ls
test.txt

15. gzip

gzip 命令创建和提取gzip压缩文件,还可以用gzip -d 来提取压缩文件。

16. unzip

unzip <archive-to-extract.zip>对gzip文档进行解压。在解压之前,可以使用unzip -l <archive-to-extract.zip>命令查看文件内容。

17. help

–help会在终端列出所有可用的命令,可以使用任何命令的-h或-help选项来查看该命令的具体用法。

18. whatis – What is this command

whatis 会用单行来描述给定的命令。

19. man – Manual

man 会为给定的命令显示一个手册页面。

20. exit

exit用于结束当前的终端会话。

21. ping

ping 通过发送数据包ping远程主机(服务器),常用与检测网络连接和服务器状态。

ping 主要用于测试网络连通,通过对目标机器发送数据包来测试两台主机是否连通,及延时情况。

$ ping locez.com    ## 通过域名 ping,若 DNS 未设置好,可能无法 ping 通
$ ping linux.cn
PING linux.cn (211.157.2.94) 56(84) bytes of data.
64 bytes from 211.157.2.94.static.in-addr.arpa (211.157.2.94): icmp_seq=1 ttl=53 time=41.5 ms
64 bytes from 211.157.2.94.static.in-addr.arpa (211.157.2.94): icmp_seq=2 ttl=53 time=40.4 ms
64 bytes from 211.157.2.94.static.in-addr.arpa (211.157.2.94): icmp_seq=3 ttl=53 time=41.9 ms
^C
--- linux.cn ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 40.406/41.287/41.931/0.644 ms

$ ping 211.157.2.94   ## 通过 IP 地址 ping ,若无法 ping 通可能是网络连接出现问题

22. who – Who Is logged in

who能列出当前登录的用户名。

23. su – Switch User

su 用于切换不同的用户。即使没有使用密码,超级用户也能切换到其它用户。

24. uname

uname会显示出关于系统的重要信息,如内核名称、主机名、内核版本、处理机类型等等,使用uname -a可以查看所有信息。get name and information about current kernel

25. free – Free memory

free会显示出系统的空闲内存、已经占用内存、可利用的交换内存等信息,free -m将结果中的单位转换成KB,而free –g则转换成GB。get name and information about current kernel

26. df – Disk space Free

df查看文件系统中磁盘的使用情况–硬盘已用和可用的存储空间以及其它存储设备。你可以使用df -h将结果以人类可读的方式显示。report free disk space

27. ps – ProcesseS

ps显示系统的运行进程。report free disk space

28. Top – TOP processes

top命令会默认按照CPU的占用情况,显示占用量较大的进程,可以使用top -u 查看某个用户的CPU使用排名情况。

29. shutdown

shutdown用于关闭计算机,而shutdown -r用于重启计算机。

shutdown是最安全的关机和重启命令,平时使用时推荐使用shutdown命令关机和重启。

shutdown语法

shutdown [选项] [参数]

【详解】shutdown是最安全的关机和重启命令,平时使用时推荐使用shutdown命令关机。而且该命令支持定时操作。

shutdown选项

选项 相应功能
-a 指定权限
-r 重启计算器(和reboot)命令一样
-k 模拟关机(只向用户发出警告信息,但不关机)
-h 关闭计算机并关闭电源(常用)
-n 不调用init进程关闭计算机(不推荐)
-c 取消正在执行的关机命令
-f 重启计算机,但不进行磁盘检测
-F 重启计算机,进行磁盘检测
-t(秒) 指定发出警告信息与删除信息时要延迟的秒数

【附加参数】

shutdown参数

时间 指关闭计算机的时间。可以为详细时间,如22:00,晚上10点关闭计算机, 也可以作为详细分钟,如“+5”,则5分钟后关机。 警告信息 可以是任意文本,信息,需要引号括起来才能使用。

shutdown例子:

(1)、通过shutdown命令重启计算机(加now则是立即重启) shutdown -r now

(2)、设置1分钟以后关闭计算机,并在SSH中提示“1 minute after shutdown” shutdown -h +1 "1 minute after shutdown"

(3)、取消关机

若需要取消关机、重启操作,在SSH中可按Ctrl+C快捷键取消正在执行的命令。

当然若重新登陆了SSH或其它情况,可通过一下代码取消(定时)关机。 shutdown -c

30. more-显示更多,Cat

more 与 cat 相似,都可以查看文件内容,所不同的是,当一个文档太长时, cat 只能展示最后布满屏幕的内容,前面的内容是不可见的。这时候可用 more 逐行显示内容。

$ more /etc/locale.gen
$ more +100 /etc/locale.gen       ### 从 100 行开始显示

31. less

less 与 more 相似,不过 less 支持上下滚动查看内容,而 more 只支持逐行显示。

同样的less命令也可以让你浏览文件,less命令非常快,并且支持上下键查看文件的开头和末尾。然而more命令和它类似,只是more命令只能用enter键实现文件的向前翻页,不支持回退。

语法: less <filename>
        more <filename>
$ less /etc/locale.gen
$ less +100 /etc/locale.gen
less demo.txt
more demo.txt

32. nano

nano 是一个简单实用的文本编辑器,使用简单。

$ nano  filename       ### 编辑 filename 文件,若文件不存在,则新打开一个文件,若退出时保存,则创建该文件

编辑完后,ctrl + X 提示是否保存,按 y 确定保存即可。 注意:在使用过程中可用 ctrl + G 获取帮助。

33. reboot

reboot 为重启命令。

# reboot         ### '$' 和 '#' 的区别在于 '$' 普通用户即可执行
                 ### 而 '#' 为 root 用户才可执行,或普通用户使用 'sudo'

34. poweroff

poweroff 为关机命令。

# poweroff  ### 马上关机

35. mount 挂载文件系统

mount 用于挂载一个文件系统,需要 root 用户执行。一个磁盘可分为若干个分区,在分区上面可以创建文件系统,而挂载点则是提供一个访问的入口,将一个分区的文件系统挂载到某个目录中,称这个目录为挂载点,并且可以通过这个挂载点访问该文件系统中的内容。

例如一块硬盘在 Linux 中表示为 /dev/sda 那么它上面的分区应该表示为 /dev/sda1 、/dev/sda2 。

# mount                       ## 输出系统目前的挂载信息
# mount /dev/sda1 /mnt        ## 将 sda1 挂载到 /mnt 中
# cd /mnt                     ## 直接通过 /mnt 访问内容
# mount -o remount,rw  /mnt   ## 重新挂载 sda1 到 /mnt 并设置为 可读写
# mount -a                    ## 挂载 fstab 文件配置好的文件系统

# Win10 Sharing Folder
# mount /mnt/hgfs/CentOS_Sharing/
# ls /mnt/hgfs/CentOS_Sharing/

36. umount卸载一个挂载点

umount 与 moung 相反,是卸载一个挂载点,即取消该入口。

# umount /mnt                 ## 卸载 /mnt 这个挂载点的文件系统
# umount -a                   ## 卸载所有已挂载的文件系统

37. ln

ln 主要用于在两个文件中创建链接,链接又分为 Hard Links (硬链接)和 Symbolic Links (符号链接或软链接),其中默认为创建硬链接,使用 -s 参数指定创建软链接。

硬链接主要是增加一个文件的链接数,只要该文件的链接数不为 0 ,该文件就不会被物理删除,所以删除一个具有多个硬链接数的文件,必须删除所有它的硬链接才可删除。

软链接简单来说是为文件创建了一个类似快捷方式的东西,通过该链接可以访问文件,修改文件,但不会增加该文件的链接数,删除一个软链接并不会删除源文件,即使源文件被删除,软链接也存在,当重新创建一个同名的源文件,该软链接则指向新创建的文件。

硬链接只可链接两个文件,不可链接目录,而软链接可链接目录,所以软链接是非常灵活的。

$ ln source dest       ## 为 source 创建一个名为 dest 的硬链接
$ ln -s source dest    ## 为 source 创建一个名为 dest 的软链接

38. chown-Change Owner

chown 用于改变一个文件的所有者及所在的组。

# chown user filename        ## 改变 filename 的所有者为 user
# chown user:group filename  ## 改变 filename 的所有者为 user,组为 group
# chown -R root folder       ## 改变 folder 文件夹及其子文件的所有者为 root

39. chmod

chmod命令用来改变文件的读/写/执行权限,权限数值如下所示:

4 - read permission 2 - write permission 1 - execute permission 0 - no permission

下面的命令可以给test.txt文件赋最高的权限:

chmod 755 test.txt
sudo chmod 777 -R .git/*

chmod 永远更改一个文件的权限,主要有 读取 、 写入 、 执行 ,三种权限,其中 所有者 、 用户组 、 其他 各占三个,因此 ls -l 可以看到如下的信息

-rwxr--r-- 1 locez users   154 Aug 30 18:09 filename

# 其中 r=read , w=write , x=execute

# chmod +x filename        ## 为 user ,group ,others 添加执行权限 
# chmod -x filename        ## 取消 user , group ,others 的执行权限 
# chmod +w filename        ## 为 user 添加写入权限 
# chmod ugo=rwx filename   ## 设置 user ,group ,others 具有 读取、写入、执行权限 
# chmod ug=rw filename     ## 设置 user ,group 添加 读取、写入权限 
# chmod ugo=--- filename   ## 取消所有权限 

40. useradd

useradd 用于添加一个普通用户。

# useradd -m -g users -G audio -s /usr/bin/bash newuser     
## -m 创建 home 目录, -g 所属的主组, -G 指定该用户在哪些附加组, -s 设定默认的 shell ,newuser 为新的用户名 

# 现在开始新建共享文件夹的用户willy,使用命令“useradd willy”,如下
useradd willy

# 使用命令“passwd willy”,对用户添加密码,如下
passwd willy

# 使用命令“mkdir /home/willy/myshare”,
# 在用户willy文件夹下新建“myshare”共享文件夹,(中途以willy用户进入了系统,所以多了很多中文文件夹)
cd ~
mkdir /home/willy/myshare

cd /home/willy/
ls

# 使用命令“chmod -R 777 /home/willy/myshare”,
# 将整个myshare文件夹与其中的文件和子目录的权限都设置为rwxrwxrwx,即所有人都可以查看操作
chmod -R 777 /home/willy/myshare

41. passwd

passwd 用于改变用户登录密码。

$ passwd                 ## 不带参数更改当前用户密码
# passwd newuser         ## 更改上述新建的 newuser 的用户密码

42. whereis

whereis 用于查找文件、手册等。

$ whereis bash 
bash: /usr/bin/bash /etc/bash.bashrc /etc/bash.bash_logout /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz 
$ whereis -b bash       ## 仅查找 binary 
bash: /usr/bin/bash /etc/bash.bashrc /etc/bash.bash_logout 
$ whereis -m bash       ## 仅查找 manual 
bash: /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz 

43. find

find 也用于查找文件,但更为强大,支持正则,并且可将查找结果传递到其他命令。

$ find . -name PATTERN    ## 从当前目录查找符合 PATTERN 的文件 
$ find /home -name PATTERN -exec ls -l {} /;  # 从 /home 文件查找所有符合 PATTERN 的文件,并交由 ls 输出详细信息 

44. wget

wget 是一个下载工具,简单强大。

$ wget -O newname.md https://github.com/LCTT/TranslateProject/blob/master/README.md     ## 下载 README 文件并重命名为 newname.md 
$ wget -c url     ## 下载 url 并开启断点续传 

45. touch & vi

touch命令可以在Linux系统中创建大小为0的任意类型文件,作为程序开发者,当你需要在Linux服务器上创建文件时,可以使用touch命令:

语法: touch <filename>
touch demo.txt

vi(visual) # 新建文本文档 输入完成后,按Esc后insert消失,然后输入:wq,write & quit Enter退出 
root@devopscube:~# touch demo.txt
root@devopscube:~# ls
demo.txt

46. sort

sort命令用来对文件内容进行排序。创建一个名为test.txt的文件,并且把以下内容拷贝到该文件中:

1 mike level intermediate jan 10 lucy level beginer mar 45 Dave level expert dec 4 dennis start beginner jul 7 Megan employee trainee feb 58 Mathew Head CEO nov

上面的例子中,第二列是名称,所以如果你想对名称列按字母排序,就可以使用“-k”选项,并标注列号,比如“-k2”:

语法: sort
sort -k2 test.txt

排序结果

root@devopscube:~# sort -k2 test.txt
45 Dave level expert dec
4 dennis start beginner jul
10 lucy level beginer mar
58 Mathew Head CEO nov
7 Megan employee trainee feb
1 mike level intermediate jan

第一列是数字,如果你想按数字排序,可以使用“-h”选项。如果数字在不同列上,你可以在“-h”选项后使用“-k”选项:

root@devopscube:~# sort -h test.txt  
1 mike level intermediate jan
4 dennis start beginner jul
7 Megan employee trainee feb
10 lucy level beginer mar
45 Dave level expert dec
58 Mathew Head CEO nov

最后一列是月份,你可以使用“-M”选项来让文件内容按月份排序:

root@devopscube:~# sort -k5 -M test.txt
1 mike level intermediate jan
7 Megan employee trainee feb
10 lucy level beginer mar
4 dennis start beginner jul
58 Mathew Head CEO nov
45 Dave level expert dec

注:如果你想消除重复的行,可以在sort命令后使用“-u”选项。

使用“-r”选项,是文件倒序排列:

root@devopscube:~# sort -h -r test.txt
58 Mathew Head CEO nov
45 Dave level expert dec
10 lucy level beginer mar
7 Megan employee trainee feb
4 dennis start beginner jul
1 mike level intermediate jan

47. diff命令

diff命令用来找出2个文件的不同点。diff命令通过分析文件内容,然后将不同的行打印出来,下面的例子可以找出两个文件test和test1的不同点:

语法: diff <filename1> <filename2>
        diff test.txt test1.txt
root@devopscube:~# diff test.txt test1.txt
7c7
< 59 sdfsd
---
> 59 sdfsd  CTO dec

48. Uniq命令

uniq命令用来过滤文件中的重复行: ~~~~ 语法: uniq uniq test.txt ~ root@devopscube:# uniq test.txt 1 mike level intermediate jan 10 lucy level beginer mar 45 Dave level expert dec 4 dennis start beginner jul 7 Megan employee trainee feb 58 Mathew Head CEO nov

49. sed命令

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。

如果你想通过搜索替换文件中的指定内容,你可以使用“s”选项来检索到它然后将它替换。 ~~~~ 语法: sed ‘s///’ test.txt ~~~~ 例如,在test.txt文件中用“michael”替换“mike”:

# sed 's/mike/michael/' test.txt

root@devopscube:~# sed 's/mike/michael/' test.txt
1 michael level intermediate jan
10 lucy level beginer mar
45 Dave level expert dec
4 dennis start beginner jul
7 Megan employee trainee feb
58 Mathew Head CEO nov
LS0tCnRpdGxlOiAiMjAxOC0xMS0wMy1CYXNpY19MaW51eF9Db21tYW5kc19Zb3VfTXVzdF9Lbm93IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNzczogLi4vcm1kX3RoZW1lLmNzcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogc3BhY2VsYWIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnNCcKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBoaWdobGlnaHQgPSBUUlVFKQpgYGAKCiMgQmFzaWNfTGludXhfQ29tbWFuZHNfWW91X011c3RfS25vdwoKIyMg5aaC5L2V5a+75rGC5biu5Yqp77yfCgrlnKggTGludXgg5LiL6YGH5Yiw6Zeu6aKY77yM5pyA6YeN6KaB55qE5piv6KaB6Ieq5bex5a+75rGC5biu5Yqp77yM5LiL6Z2i5piv5LiJ56eN5a+75rGC5biu5Yqp55qE5pa55rOV44CCCgojIyMgbWFuCgrnrKzkuIDkuKrkvaDpnIDopoHnn6XpgZPnmoRMaW51eOWRveS7pOWwseaYr21hbuWRveS7pO+8jOivpeWRveS7pOWPr+S7peaYvuekuuaMh+WumuWRveS7pOeahOeUqOazleWSjOaPj+i/sOOAggoK6K+t5rOVOiBtYW4gPGNvbW1hbmQgbmFtZT4KCm1hbiDmmK8gTGludXgg55qE5biu5Yqp5omL5YaM77yM5Y2zIG1hbnVhbCDjgILlm6DkuLrlpKflpJrmlbDnqIvluo/pg73kvJroh6rluKbmiYvlhozvvIzmiYDku6Xlj6/ku6XpgJrov4cgbWFuIOWRveS7pOiOt+WPluW4ruWKqeOAguaJp+ihjOS7peWQju+8jOWcqCBtYW4gcGFnZSDpobXpnaLkuK3mjIkgcSDpgIDlh7rjgIIKCuavlOWmguS9oOaDs+efpemBk2xz5ZG95Luk55qE55So5rOV5ZKM6YCJ6aG577yM5Y+v5Lul5Zyo57uI56uv5omn6KGM4oCcbWFuIGxz4oCdLOiOt+WPliBscyDnmoTluK7liqkKYGBge3NofQptYW4gbHMKCnJvb3RAZGV2b3BzY3ViZTp+IyBtYW4gbHMKTFMoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBDb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgIExTKDEpCk5BTUUKICAgICAgIGxzIC0gbGlzdCBkaXJlY3RvcnkgY29udGVudHMKU1lOT1BTSVMKICAgICAgIGxzIFtPUFRJT05dLi4uIFtGSUxFXS4uLgpERVNDUklQVElPTgogICAgICAgTGlzdCAgaW5mb3JtYXRpb24gIGFib3V0ICB0aGUgRklMRXMgKHRoZSBjdXJyZW50IGRpcmVjdG9yeSBieSBkZWZhdWx0KS4KICAgICAgIFNvcnQgZW50cmllcyBhbHBoYWJldGljYWxseSBpZiBub25lIG9mIC1jZnR1dlNVWCBub3IgLS1zb3J0ICBpcyAgc3BlY2nDogogICAgICAgZmllZC4KICAgICAgIE1hbmRhdG9yeSAgYXJndW1lbnRzICB0byAgbG9uZyAgb3B0aW9ucyBhcmUgbWFuZGF0b3J5IGZvciBzaG9ydCBvcHRpb25zCiAgICAgICB0b28uCiAgICAgICAtYSwgLS1hbGwKICAgICAgICAgICAgICBkbyBub3QgaWdub3JlIGVudHJpZXMgc3RhcnRpbmcgd2l0aCAuCmBgYAoK5p+l55yL5pyJ5aSa5bCR77yI6ZKI5a+55LiN5ZCM5pa56Z2i55qE77yJ5ZCM5ZCN5omL5YaMCmBgYHtzaH0KJCBtYW4gLWYgbHMKbHMgKDEpICAgICAgICAgICAgICAgLSBsaXN0IGRpcmVjdG9yeSBjb250ZW50cwpscyAoMXApICAgICAgICAgICAgICAtIGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzCmBgYAoK5p+l55yL54m55a6a55qE5omL5YaMCmBgYHtzaH0KJCBtYW4gMXAgbHMKYGBgCgojIyMgaW5mbwrkuI4gbWFuIOS4jeWQjOeahOaYr++8jOWPr+S7peWDj+a1j+iniOe9kemhteS4gOagt+WcqOWQhOS4quiKgueCueS4rei3s+i9rOOAggoK5LuO5paH5qGj6aaW6aG15byA5aeL5rWP6KeICmBgYHtzaH0KJCBpbmZvCmBgYArojrflj5bnibnlrprnqIvluo/nmoTluK7liqkKYGBge3NofQokIGluZm8gcHJvZ3JhbQpgYGAKCiMjIyBoZWxwCgrpmaTkuobkuIrpnaLnmoTkuKTnp43mlrnms5XlpJbvvIzov5jmnInkuIDnp43nroDljZXkvb/nlKjnmoTmlrnms5XvvIzpgqPlsLHmmK8g4oCTaGVscCDlj4LmlbDvvIzkuIDoiKznqIvluo/pg73kvJrmnInov5nkuKrlj4LmlbDvvIzkvJrovpPlh7rmnIDnroDljZXmnInnlKjnmoTku4vnu43jgIIKYGBge3NofQokIG1hbiAtLWhlbHAgICAgICAgIyMjIOiOt+WPliBtYW4g55qE5biu5YqpCiQgaW5mbyAtLWhlbHAgICAgICAjIyMg6I635Y+WIGluZm8g55qE5biu5YqpCiQgbHMgLS1oZWxwICAgICAgICAjIyMg6I635Y+WIGxzIOeahOW4ruWKqQpgYGAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyMg57uI56uv5aaC5L2V566A5Y2V5pON5L2c77yfCgrlnKggVGVybWluYWzvvIjnu4jnq6/vvIkg5Lit77yM5pyJ6K645aSa5pON5L2c5oqA5ben77yM6L+Z6YeM5bCx5LuL57uN5Yeg5Liq566A5Y2V55qE44CCCiMjIyDnu4jnq6/nroDljZXmk43kvZwKYGBge3NofQp1cCjmlrnlkJHplK7kuIopIOWPr+S7peiwg+WHuui+k+WFpeWOhuWPsuaJp+ihjOiusOW9le+8jOW/q+mAn+aJp+ihjOWRveS7pApkb3duKOaWueWQkemUruS4iykg6YWN5ZCIIHVwIOmAieaLqeWOhuWPsuaJp+ihjOiusOW9lQpIb21lIOenu+WKqOWFieagh+WIsOacrOihjOW8gOWktApFbmQg56e75Yqo5YWJ5qCH5Yiw5pys6KGM57uT5bC+ClBnVXAg5ZCR5LiK57+76aG1ClBhRE4g5ZCR5LiL57+76aG1CmN0cmwgKyBjIOe7iOatouW9k+WJjeeoi+W6jwpgYGAKCiMjIyBUYWIg6KGl5YWoCgpUYWIg6KGl5YWo5piv6Z2e5bi45pyJ55So55qE5LiA5Liq5Yqf6IO977yM5Y+v5Lul55So5p2l6Ieq5Yqo6KGl5YWo5ZG95Luk5oiW5paH5Lu25ZCN77yM55yB5pe25YeG56Gu44CCCuacqui+k+WFpeeKtuaAgeS4i+i/nuaMieS4pOasoSBUYWIg5YiX5Ye65omA5pyJ5Y+v55So5ZG95LukCuW3sui+k+WFpemDqOWIhuWRveS7pOWQjeaIluaWh+S7tuWQje+8jOaMiSBUYWIg6L+b6KGM6Ieq5Yqo6KGl5YWo77yM5aSa55So5L2g5bCx6IKv5a6a5Lya5Zac5qyi55qE5LqG44CCCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgQmFzaWNfTGludXhfQ29tbWFuZHMKCuiZveeEtkxpbnV45Y+R6KGM54mI5pSv5oyB5ZCE56eN5ZCE5qC355qER1VJ77yIZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlc++8ie+8jOS9huWcqOafkOS6m+aDheWGteS4i++8jExpbnV455qE5ZG95Luk6KGM5o6l5Y+jKGJhc2gp5LuN54S25piv566A5Y2V5b+r6YCf55qE44CCQmFzaOWSjCBMaW51eCBTaGVsbCDpnIDopoHovpPlhaXlkb3ku6TmnaXlrozmiJDku7vliqHvvIzlm6DogIzooqvnp7DkuLrlkb3ku6TooYzmjqXlj6PjgIIKCuWRveS7pOaYr+iuoeeul+acuuaJp+ihjOS7u+WKoeeahOaMh+S7pOOAguWPr+S7peS9v+eUqOWRveS7pOWOu+WFs+mXreiuoeeul+acuu+8jOaIluiAheWIl+WHuuW9k+WJjeebruW9leeahOaWh+S7tuWIl+ihqO+8jOaIluW9k+WJjeaWh+acrOeahOWGheWuue+8jOaIluiAheWxj+W5leaYvuekuuS4gOadoea2iOaBr+OAggoK5aaC5p6c5L2g5piv5LiA5Liq5paw5omL77yM5bm25bCd6K+V5L2/55So5ZG95Luk6KGM5o6l5Y+j77yM5oiR5Lus5pS26ZuG5LqG5ZCE56eN5Z+65pys55qETGludXjlkb3ku6TmnaXkvpvkvaDlrabkuaDvvIzluK7kvaDlnKjlkITnp41MaW51eOWPkeihjOeJiOS4reWujOaIkOWQhOenjeS7u+WKoeOAguiZveeEtuS4jeaYr+W+iOivpue7hu+8jOS9huaYr+WvuUxpbnV45Yid5a2m6ICF77yM5oiW5pmu6YCa55So54Gr77yM5oiW566h55CG5ZGY6YO95piv5b6I5pyJ55So55qE44CCCgojIyAxLiBscyDigJMgTGlzdAoKbHPkvJrliJfkuL7lh7rlvZPliY3lt6XkvZznm67lvZXnmoTlhoXlrrnvvIjmlofku7bmiJbmlofku7blpLnvvInvvIzlsLHot5/kvaDlnKhHVUnkuK3miZPlvIDkuIDkuKrmlofku7blpLnljrvnnIvph4zpnaLnmoTlhoXlrrnkuIDmoLfjgIIKCmxzIOWNsyBsaXN0IO+8jOWIl+WHuuaWh+S7tuOAggpgYGB7c2h9CiQgbHMgICAgICAgIyMjIOS7heWIl+WHuuW9k+WJjeebruW9leWPr+ingeaWh+S7tgokIGxzIC1sICAgICMjIyDliJflh7rlvZPliY3nm67lvZXlj6/op4Hmlofku7bor6bnu4bkv6Hmga8s6ZW/5YiX6KGoCiQgbHMgLWhsICAgIyMjIOWIl+WHuuivpue7huS/oeaBr+W5tuS7peWPr+ivu+Wkp+Wwj+aYvuekuuaWh+S7tuWkp+Wwjyzor6bnu4bkv6Hmga8KJCBscyAtYWwgICAjIyMg5YiX5Ye65omA5pyJ5paH5Lu277yI5YyF5ous6ZqQ6JeP77yJ55qE6K+m57uG5L+h5oGvCmBgYArms6jmhI/vvJogTGludXgg5LitIOS7pSAuIOW8gOWktOeahOaWh+S7tuaIluaWh+S7tuWkueWdh+S4uumakOiXj+aWh+S7tuaIlumakOiXj+aWh+S7tuWkueOAggoKIyMgMi4gbWtkaXIg4oCTIE1ha2UgRGlyZWN0b3J5Cgpta2RpciA8bmV3LWRpcmVjdG9yeS1uYW1lPuWIm+W7uuS4gOS4quaWsOebruW9le+8jOeUqOS6juaWsOW7uuaWh+S7tuWkueOAggpgYGB7c2h9CiQgbWtkaXIgZm9sZGVyCiQgbWtkaXIgLXAgZm9sZGVyL3N1YmZvbGRlciAgICAjIyMgLXAg5Y+C5pWw5Li65b2T54i255uu5b2V5a2Y5Zyo5pe25b+955Wl77yM6Iul5LiN5a2Y5Zyo5YiZ5bu656uL77yM55So5q2k5Y+C5pWw5Y+v5bu656uL5aSa57qn5paH5Lu25aS5CmBgYAoKCgojIyAzLiBwd2Qg4oCTIFByaW50IFdvcmtpbmcgRGlyZWN0b3J5CnB3ZOaYvuekuuW9k+WJjeW3peS9nOebruW9le+8jOeUqOS6jui/lOWbnuW9k+WJjeW3peS9nOebruW9leeahOWQjeWtl++8jOS4uue7neWvuei3r+W+hOWQjeOAggpgYGB7c2h9CiQgcHdkCi9ob21lCmBgYAoKIyMgNC4gY2Qg4oCTIENoYW5nZSBEaXJlY3RvcnkKCuWvueS6juW9k+WJjeWcqOe7iOerr+i/kOihjOeahOS8muS4reS4re+8jGNkIDxkaXJlY3Rvcnk+5bCG57uZ5a6a55qE5paH5Lu25aS577yI5oiW55uu5b2V77yJ6K6+572u5oiQ5b2T5YmN5bel5L2c55uu5b2V44CCCgpjZCDmmK/miZPlvIDmn5DkuKrot6/lvoTnmoTlkb3ku6TvvIzkuZ/lsLHmmK/miZPlvIDmn5DkuKrmlofku7blpLnvvIzlubbot7PovazliLDor6XlpITjgIIKCmBgYHtzaH0KJCBjZCBwYXRoICAgICAgIyMjIHBhdGgg5Li65L2g6KaB5omT5byA55qE6Lev5b6E44CCCiMgJCBjZChjaGFuZ2UgZGlyZWN0b3J5KSDliIfmjaLmlofku7blpLnvvIzov5nkuKrlupTor6XmmK/mnIDluLjnlKjnmoQgCiQgY2QgLSAjIOi/lOWbnuWImuaJjeeahOebruW9lSAKJCBjZCB+ICMg5Li755uu5b2VIApgYGAKCuWFtuS4rSBwYXRoIOaciee7neWvuei3r+W+hOWSjOebuOWvuei3r+W+hOS5i+WIhu+8jOe7neWvuei3r+W+hOW8uuiwg+S7jiAvIOi1t++8jOS4gOebtOWIsOaJgOWcqOi3r+W+hOOAguebuOWvuei3r+W+hOWImeebuOWvueS6juW9k+WJjei3r+W+hOadpeivtO+8jOWBh+iuvuW9k+WJjeWutuebruW9leaciWV0YyDmlofku7blpLnvvIjnu53lr7not6/lvoTlupQg5Li6IC9ob21lL3VzZXJuYW1lL2V0Y++8ie+8jOWmguaenOebtOaOpSBjZCBldGMg5YiZ6L+b5YWl5q2k5paH5Lu25aS577yM5L2G6Iul5pivIGNkIC9ldGMvIOWImeaYr+i/m+WFpeezu+e7nyBldGMg77yM5aSa55Ci56Oo5LiA5LiL5bCx5Y+v5Lul55CG6Kej5LqG44CC5Y+m5aSW5ZyoIExpbnV4IOS4re+8jCAuIOS7o+ihqOW9k+WJjeebruW9le+8jCAuLiDku6PooajkuIrnuqfnm67lvZXvvIzlm6DmraTov5Tlm57kuIrnuqfnm67lvZXlj6/ku6UgY2QgLi4g44CCCgojIyA1LiBybWRpciDigJMgUmVtb3ZlIERpcmVjdG9yeQpybWRpciA8ZGlyZWN0b3J5LW5hbWU+5Yig6Zmk57uZ5a6a55qE55uu5b2V44CCCgojIyA2LiBybSDigJMgUmVtb3ZlCgpybSDljbMgcmVtb3ZlIO+8jOWIoOmZpOaWh+S7tuOAggpybSA8ZmlsZS1uYW1lPuS8muWIoOmZpOe7meWumueahOaWh+S7tuaIluaWh+S7tuWkue+8jOWPr+S7peS9v+eUqHJtIC1yIDxkaXJlY3RvcnktbmFtZT7pgJLlvZLliKDpmaTmlofku7blpLkKCmBgYHtzaH0KJCBybSBmaWxlbmFtZSAgICAgICMjIyDliKDpmaQgZmlsZW5hbWUKJCBybSAtaSBmaWxlbmFtZSAgICMjIyDliKDpmaQgZmlsZW5hbWUg5YmN5o+Q56S677yM6Iul5aSa5Liq5paH5Lu25YiZ5q+P5qyh5o+Q56S6CiQgcm0gLXJmIGZvbGRlci9zdWJmb2xkZXIvICAjIyMg6YCS5b2S5Yig6ZmkIHN1YmZvbGRlciDkuIvmiYDmnInmlofku7blj4rmlofku7blpLnvvIzljIXmi6wgc3ViZm9sZGVyIOiHqui6qwokIHJtIC1kIGZvbGRlciAgICAgIyMjICDliKDpmaTnqbrmlofku7blpLkKYGBgCgojIyA3LiBjcCDigJMgQ29weQoKY3Ag5Y2zIGNvcHkg77yM5aSN5Yi25paH5Lu244CCCgpjcCA8c291cmNlLWZpbGU+IDxkZXN0aW5hdGlvbi1maWxlPuWRveS7pOWvueaWh+S7tuaIluaWh+S7tuWkuei/m+ihjOWkjeWItgoK5Y+v5Lul5L2/55SoY3AgLXIgPHNvdXJjZS1mb2xkZXI+IDxkZXN0aW5hdGlvbi1mb2xkZXI+IOmAiemhueadpemAkuW9kuWkjeWItuaWh+S7tuWkueOAggpgYGB7c2h9CiQgY3Agc291cmNlIGRlc3QgICAgICAgICAgICAjIyMg5bCGIHNvdXJjZSDlpI3liLbliLAgZGVzdAokIGNwIGZvbGRlci8qICBkZXN0ICAgICAgICAgIyMjIOWwhiBmb2xkZXIg5LiL5omA5pyJ5paH5Lu2KOS4jeWQq+WtkOaWh+S7tuWkueS4reeahOaWh+S7tinlpI3liLbliLAgZGVzdAokIGNwIC1yIGZvbGRlciAgZGVzdCAgICAgICAgIyMjIOWwhiBmb2xkZXIg5LiL5omA5pyJ5paH5Lu277yI5YyF5ZCr5a2Q5paH5Lu25aS55Lit55qE5omA5pyJ5paH5Lu277yJ5aSN5Yi25YiwIGRlc3QKYGBgCgojIyA4LiBtdiDigJMgTW9WZQoKbXYg5Y2zIG1vdmUg77yM56e75Yqo5paH5Lu244CCCm12IDxzb3VyY2U+IDxkZXN0aW5hdGlvbj7lkb3ku6Tlr7nmlofku7bmiJbmlofku7blpLnov5vooYznp7vliqgK5aaC5p6c5paH5Lu25oiW5paH5Lu25aS55a2Y5Zyo5LqO5b2T5YmN5bel5L2c55uu5b2V77yM6L+Y5Y+v5Lul5a+55paH5Lu25oiW5paH5Lu25aS56L+b6KGM6YeN5ZG95ZCN44CCCgpgYGB7c2h9CiQgbXYgc291cmNlICBmb2xkZXIgICAgICAgICMjIyDlsIYgc291cmNlIOenu+WKqOWIsCBmb2xkZXIg5LiL77yM5a6M5oiQ5ZCO5YiZ5Li6ICBmb2xkZXIvc291cmNlCiQgbXYgLWkgc291cmNlIGZvbGRlciAgICAgICMjIyDlnKjnp7vliqjml7bvvIzoi6Xmlofku7blt7LlrZjlnKjliJnmj5DnpLogKirmmK/lkKbopobnm5YqKgokIG12IHNvdXJjZSBkZXN0ICAgICAgICAgICAjIyMg5ZyoIGRlc3Qg5LiN5Li655uu5b2V55qE5YmN5o+Q5LiL77yM6YeN5ZG95ZCNIHNvdXJjZSDkuLogZGVzdApgYGAKCiMjIDkuIGNhdCDigJMgY29uY2F0ZW5hdGUgYW5kIHByaW50IGZpbGVzCgpjYXQgPGZpbGU+55So5LqO5Zyo5qCH5YeG6L6T5Ye677yI55uR5o6n5Zmo5oiW5bGP5bmV77yJ5LiK5p+l55yL5paH5Lu25YaF5a6544CC55So5LqO6L6T5Ye65paH5Lu25YaF5a655YiwIFRlcm1pbmFsIOOAggoKY2F05ZG95Luk55So5p2l5p+l55yL5paH5Lu255qE5YaF5a6577yM5L2G5piv5L2/55SoY2F05ZG95Luk5bm25LiN6IO957yW6L6R5paH5Lu255qE5YaF5a6577yM5a6D5LuF5LuF5piv5Y+v5Lul5rWP6KeI5paH5Lu25YaF5a6544CCY2F05ZG95Luk5LiN5pSv5oyB6ZSu55uY5LiK5LiL6ZSu57+76aG144CCCgp+fn5+fn5+fn5+CuivreazlTogY2F0IDxmaWxlbmFtZT4KY2F0IGRlbW8udHh0Cgrlj5jlvaIxOiAKaGVhZCAtbiA1IGhlbGxvX3dvcmxkLnR4dCAKCuWPmOW9ojI6CnRhaWwgLW4gNSBoZWxsb193b3JsZC50eHQgCn5+fn5+fn5+fn4KCmBgYHtzaH0KJCBjYXQgL2V0Yy9sb2NhbGUuZ2VuICAgICAjIyMg6L6T5Ye6IGxvY2FsZS5nZW4g55qE5YaF5a65CiQgY2F0IC1uIC9ldGMvbG9jYWxlLmdlbiAgIyMjIOi+k+WHuiBsb2NhbGUuZ2VuIOeahOWGheWuueW5tuaYvuekuuihjOWPtwokIGNhdCAvcHJvYy92ZXJzaW9uICMjIyDns7vnu5/kv6Hmga8gCiQgY2F0IC9wcm9jL21lbWluZm8gIyMjIOWGheWtmOS/oeaBryAKJCBjYXQgL3Byb2MvcGFydGl0aW9ucyAjIyMg56Gs55uY5L+h5oGvIApgYGAKCiMjIDEwLiB0YWlsIOKAkyBwcmludCBUQUlMIChmcm9tIGxhc3QpID4KdGFpbCA8ZmlsZS1uYW1lPum7mOiupOWcqOagh+WHhui+k+WHuuS4iuaYvuekuue7meWumuaWh+S7tueahOacgOWQjjEw6KGM5YaF5a6577yM5Y+v5Lul5L2/55SodGFpbCAtbiBOIDxmaWxlLW5hbWU+5oyH5a6a5Zyo5qCH5YeG6L6T5Ye65LiK5pi+56S65paH5Lu255qE5pyA5ZCOTuihjOWGheWuueOAggoKIyMgMTEuIGxlc3Mg4oCTIHByaW50IExFU1MKbGVzcyA8ZmlsZS1uYW1lPuaMiemhteaIluaMieeql+WPo+aJk+WNsOaWh+S7tuWGheWuueOAguWcqOafpeeci+WMheWQq+Wkp+mHj+aWh+acrOaVsOaNrueahOWkp+aWh+S7tuaXtuaYr+mdnuW4uOacieeUqOWSjOmrmOaViOeahOOAguS9oOWPr+S7peS9v+eUqEN0cmwrRuWQkeWJjee/u+mhte+8jEN0cmwrQuWQkeWQjue/u+mhteOAggoKIyMgMTIuIGdyZXAKCmdyZXAgIjxzdHJpbmc+IiA8ZmlsZS1uYW1lPuWcqOe7meWumueahOaWh+S7tuS4reaQnOWvu+aMh+WumueahOWtl+espuS4suOAgmdyZXAgLWkgIjxzdHJpbmc+IiA8ZmlsZS1uYW1lPuWcqOaQnOWvu+aXtuS8muW/veeVpeWtl+espuS4sueahOWkp+Wwj+WGme+8jOiAjGdyZXAgLXIgIjxzdHJpbmc+IiA8ZmlsZS1uYW1lPuWImeS8muWcqOW9k+WJjeW3peS9nOebruW9leeahOaWh+S7tuS4remAkuW9kuaQnOWvu+aMh+WumueahOWtl+espuS4suOAggoKZ3JlcCDkuLvopoHnlKjkuo7ov5Tlm57ljLnphY3nmoTpobnnm67vvIzmlK/mjIHmraPliJnooajovr7lvI/jgIJHcmVw5ZG95Luk6Z2e5bi45by65aSn77yM57O757uf566h55CG5ZGY57uP5bi45Lya55So5Yiw5a6D44CCZ3JlcOWRveS7pOWPr+S7peWcqOaWh+S7tuS4reaQnOe0ouaMh+WumuagvOW8j+eahOWtl+espuS4su+8jOWQjOaXtuWvueWFtui/m+ihjOagh+WHhui+k+WHuuOAggoKfn5+fn5+fn5+fgror63ms5U6IGdyZXAgIjxzZWFyY2ggc3RyaW5nPiIgPGZpbGVuYW1lPiAKICAgICAgICBncmVwICJNYXRoZXciIHRlc3QudHh0Cn5+fn5+fn5+fn4KCmBgYHtzaH0KJCBncmVwIFBBVFRFUk4gZmlsZW5hbWUgICAgICAjIyDov5Tlm57miYDmnInlkKvmnIkgUEFUVEVSTiDnmoTooYwKJCBncmVwIHpoX0NOIC9ldGMvbG9jYWxlLmdlbiAjIyDov5Tlm57miYDmnInlkKsgemhfQ04g55qE6KGMCmBgYAoKCmBgYHtzaH0Kcm9vdEBkZXZvcHNjdWJlOn4jIGdyZXAgImRlbm5pcyIgdGVzdC50eHQKIyA0IGRlbm5pcyBzdGFydCBiZWdpbm5lciBqdWwKYGBgCuS4iumdouWRveS7pOeahOi+k+WHuue7k+aenOaYr+WMheWQq+ivpeWtkOWtl+espuS4sueahO+8jOWmguaenOS9oOaDs+ajgOe0ouWujOaVtOeahOWNleivje+8jOS9oOmcgOimgea3u+WKoOKAnC1p4oCd6YCJ6aG544CC5ZCM5pe277yM5Lmf5Y+v5Lul55SoZ3JlcOWRveS7pOWcqOWkmuS4quaWh+S7tuS4reaQnOe0ouWtl+espuS4su+8jOWRveS7pOS7o+eggeWmguS4i++8mgoKZ3JlcCAiZGVubmlzIiB0ZXN0MS50eHQgdGVzdDIudHh0IHRlc3QzLnR4dArlvZPnhLbkvaDkuZ/lj6/ku6XnlKjmraPliJnooajovr7lvI/mnaXljLnphY3lrZfnrKbkuLLjgIIKCiMjIDTjgIFjdXTlkb3ku6QKCmN1dOWRveS7pOWPr+S7peiuqeS9oOeUqOWIl+aIluiAheWIhumalOespuaPkOWPluaWh+S7tuS4reeahOaMh+WumumDqOWIhuOAguWmguaenOS9oOimgeWIl+WHuuaWh+S7tuS4reafkOWIl+eahOWFqOmDqOWGheWuue+8jOWPr+S7peS9v+eUqOKAnC1j4oCd6YCJ6aG544CC5L6L5aaC77yM5LiL6Z2i5bCG5LuOdGVzdC50eHTmlofku7bkuK3mj5Dlj5bnrKwx44CBMuWIl+eahOWFqOmDqOWGheWuueOAggoKY3V0IC1jMS0yIHRlc3QudHh0Cgpyb290QGRldm9wc2N1YmU6fiMgY3V0IC1jMS0yIHRlc3QudHh0CjEKMTAKNDUKNAo3CjU4CgrlpoLmnpzkvaDluIzmnJvku47mlofku7bkuK3mj5Dlj5bmjIflrprnmoTlrZfnrKbkuLLvvIzpgqPkuYjkvaDlj6/ku6Xkvb/nlKjliIbpmpTnrKbpgInpobnigJwtZOKAneWSjOKAnC1m4oCd6YCJ6aG56YCJ5Lit5YiX44CC5L6L5aaC77yM5oiR5Lus5Y+v5Lul5Yip55SoY3V05ZG95Luk5o+Q5Y+WbmFtZXPliJfvvJoKCmN1dCAtZCcgJyAtZjIgdGVzdC50eHQKCnJvb3RAZGV2b3BzY3ViZTp+IyBjdXQgLWQnICcgLWYyIHRlc3QudHh0Cm1pa2UKbHVjeQpEYXZlCmRlbm5pcwpNZWdhbgpNYXRoZXcKCuS4i+mdoueahOS+i+WtkOS7ji9ldGMvcGFzc2QgZmlsZeS4reaPkOWPlnVzZXJz5YiX77yaCgpjdXQgLWQnOicgLWYxIC9ldGMvcGFzc3dkCgoKIyMgMTMuIEZpbmQKCui/meS4quWRveS7pOS8muWcqOe7meWumuS9jee9ruaQnOWvu+S4juadoeS7tuWMuemFjeeahOaWh+S7tuOAguS9oOWPr+S7peS9v+eUqGZpbmQgPGZvbGRlci10by1zZWFyY2g+IC1uYW1lIDxmaWxlLW5hbWU+55qELW5hbWXpgInpobnmnaXov5vooYzljLrliIblpKflsI/lhpnnmoTmkJzlr7vvvIxmaW5kIDxmb2xkZXItdG8tc2VhcmNoPiAtaW5hbWUgPGZpbGUtbmFtZT7mnaXov5vooYzkuI3ljLrliIblpKflsI/lhpnnmoTmkJzlr7vjgIIKCmZpbmQgPGZvbGRlci10by1zZWFyY2g+IC1pbmFtZSA8ZmlsZS1uYW1lPgoKIyMjIGZpbmTlkb3ku6TnpLrkvosKCmZpbmTlkb3ku6TnlKjmnaXmo4DntKLmlofku7bvvIzlj6/ku6XnlKjigJwtbmFtZeKAnemAiemhueadpeajgOe0ouaMh+WumuWQjeensOeahOaWh+S7tu+8mgoKYGBge3NofQpmaW5kIC1uYW1lICBmaW5kIC1uYW1lIHRlc3QudHh0Cgpyb290QGRldm9wc2N1YmU6L2hvbWUvdWJ1bnR1IyBjZCB+CnJvb3RAZGV2b3BzY3ViZTp+IyBmaW5kIC1uYW1lIHRlc3QudHh0Ci4vZGVtby90ZXN0LnR4dAouL3Rlc3QudHh0CmBgYAoK5L2g5Lmf5Y+v5Lul55So4oCcLyAtbmFtZeKAneadpeajgOe0ouaMh+WumuWQjeensOeahOaWh+S7tuWkue+8mgpmaW5kIC8gLW5hbWUgcGFzc3dkCgpgYGB7c2h9CnJvb3RAZGV2b3BzY3ViZTp+IyBmaW5kIC8gLW5hbWUgcGFzc3dkCi9ldGMvY3Jvbi5kYWlseS9wYXNzd2QKL2V0Yy9wYW0uZC9wYXNzd2QKL2V0Yy9wYXNzd2QKL3Vzci9zaGFyZS9saW50aWFuL292ZXJyaWRlcy9wYXNzd2QKYGBgCgoKIyMgMTQuIHRhcgoKdGFy5ZG95Luk55So5p2l5Y6L57yp5ZKM6Kej5Y6L57yp5paH5Lu277yM5YW25Lit57uP5bi45Lya55So5Yiw4oCcLWNm4oCd5ZKM4oCcLXhm4oCd6YCJ6aG544CCCn5+fn5+fn5+fn4K6K+t5rOVOiB0YXIgPG9wdGlvbnM+IDxhcmNoaXZlLW5hbWU+IDxmaWxlL2ZvbGRlciBuYW1lPgp+fn5+fn5+fn5+Cgp0YXLlkb3ku6Tog73liJvlu7rjgIHmn6XnnIvlkozmj5Dlj5Z0YXLljovnvKnmlofku7bjgIJ0YXIgLWN2ZiA8YXJjaGl2ZS1uYW1lLnRhcj4gPGZpbGUxLU9SLWZpbGUyLU9SLWJvdGgtdG8tYXJjaGl2ZT7mmK/liJvlu7rlr7nlupTljovnvKnmlofku7bvvIx0YXIgLXR2ZiA8YXJjaGl2ZS10by12aWV3LnRhcj7mnaXmn6XnnIvlr7nlupTljovnvKnmlofku7bvvIx0YXIgLXh2ZiA8YXJjaGl2ZS10by1leHRyYWN0LnRhcj7mnaXmj5Dlj5blr7nlupTljovnvKnmlofku7bjgIIKCnRhciDkuLvopoHnlKjkuo7liJvlu7rlvZLmoaPmlofku7bvvIzlkozop6PljovlvZLmoaPmlofku7bvvIzlhbbmnKzouqvmmK/msqHmnInljovnvKnlip/og73nmoTvvIzkvYblj6/ku6XosIPnlKggZ3ppcCDjgIEgYnppcDIg6L+b6KGM5Y6L57yp5aSE55CG44CCCuWPguaVsOino+mHiu+8mgogICAgLWMg5Yib5bu65b2S5qGjCiAgICAteCDop6PljovlvZLmoaMKICAgIC12IOaYvuekuuWkhOeQhui/h+eoiwogICAgLWYg55uu5qCH5paH5Lu277yM5YW25ZCO5b+F6aG757Sn6LefIOebruagh+aWh+S7tgogICAgLWog6LCD55SoIGJ6aXAyIOi/m+ihjOino+WOi+e8qQogICAgLXog6LCD55SoIGd6aXAg6L+b6KGM6Kej5Y6L57ypCiAgICAtdCDliJflh7rlvZLmoaPkuK3nmoTmlofku7YKICAgIApgYGB7c2h9CiQgdGFyIC1jdmYgZmlsZW5hbWUudGFyIC4gICAgICAgIyMg5bCG5b2T5YmN55uu5b2V5omA5pyJ5paH5Lu25b2S5qGj77yM5L2G5LiN5Y6L57yp77yM5rOo5oSP5ZCO6Z2i5pyJ5LiqIOKAmS7igJgg77yM5LiN5Y+v55yB55Wl77yM5Luj6KGo5b2T5YmN55uu5b2V55qE5oSP5oCdCiQgdGFyIC14dmYgZmlsZW5hbWUudGFyICAgICAgICAgIyMg6Kej5Y6LIGZpbGVuYW1lLnRhciDliLDlvZPliY3mlofku7blpLkKJCB0YXIgLWN2amYgZmlsZW5hbWUudGFyLmJ6MiAuICAjIyDkvb/nlKggYnppcDIg5Y6L57ypCiQgdGFyIC14dmpmICBmaWxlbmFtZS50YXIuYnoyICAgIyMg6Kej5Y6LIGZpbGVuYW1lLnRhci5iejIg5Yiw5b2T5YmN5paH5Lu25aS5CiQgdGFyIC1jdnpmIGZpbGVuYW1lLnRhci5neiAgICAgIyMg5L2/55SoIGd6aXAgIOWOi+e8qQokIHRhciAteHZ6ZiBmaWxlbmFtZS50YXIuZ3ogICAgICMjIOino+WOiyBmaWxlbmFtZS50YXIuZ3og5Yiw5b2T5YmN5paH5Lu25aS5CiQgdGFyIC10ZiAgIGZpbGVuYW1lICAgICAgICAgICAgIyMg5Y+q5p+l55yLIGZpbGVuYW1lIOW9kuaho+S4reeahOaWh+S7tu+8jOS4jeino+WOiwpgYGAKCgrorqnmiJHku6zlsIZ0ZXN0LnR4dOaWh+S7tuaJk+WMhe+8mgoKYGBge3NofQojIHRhciAtY2YgdGVzdC50YXIgdGVzdC50eHQKcm9vdEBkZXZvcHNjdWJlOn4jIHRhciAtY2YgdGVzdC50YXIgdGVzdC50eHQKcm9vdEBkZXZvcHNjdWJlOn4jIGxzCnRlc3QudGFyICB0ZXN0LnR4dApgYGAKCueUqOKAnC1D4oCd6YCJ6aG55bCG5Yia5omN5omT5YyF5aW955qEdGVzdC50YXLmlofku7bop6PljovnvKnoh7PigJxkZW1v4oCd55uu5b2V77yaCmBgYHtzaH0KdGFyIC14ZiB0ZXN0LnRhciAtQyAvcm9vdC9kZW1vLwoKcm9vdEBkZXZvcHNjdWJlOn4jIHRhciAteGYgdGVzdC50YXIgLUMgL3Jvb3QvZGVtby8Kcm9vdEBkZXZvcHNjdWJlOn4jIGNkIGRlbW8vCnJvb3RAZGV2b3BzY3ViZTp+L2RlbW8jIGxzCnRlc3QudHh0CmBgYAoKCiMjIDE1LiBnemlwCmd6aXAgPGZpbGVuYW1lPuWRveS7pOWIm+W7uuWSjOaPkOWPlmd6aXDljovnvKnmlofku7bvvIzov5jlj6/ku6XnlKhnemlwIC1kIDxmaWxlbmFtZT7mnaXmj5Dlj5bljovnvKnmlofku7bjgIIKCiMjIDE2LiB1bnppcAp1bnppcCA8YXJjaGl2ZS10by1leHRyYWN0LnppcD7lr7lnemlw5paH5qGj6L+b6KGM6Kej5Y6L44CC5Zyo6Kej5Y6L5LmL5YmN77yM5Y+v5Lul5L2/55SodW56aXAgLWwgPGFyY2hpdmUtdG8tZXh0cmFjdC56aXA+5ZG95Luk5p+l55yL5paH5Lu25YaF5a6544CCCgojIyAxNy4gaGVscAo8Y29tbWFuZC1uYW1lPiAtLWhlbHDkvJrlnKjnu4jnq6/liJflh7rmiYDmnInlj6/nlKjnmoTlkb3ku6Qs5Y+v5Lul5L2/55So5Lu75L2V5ZG95Luk55qELWjmiJYtaGVscOmAiemhueadpeafpeeci+ivpeWRveS7pOeahOWFt+S9k+eUqOazleOAggoKIyMgMTguIHdoYXRpcyDigJMgV2hhdCBpcyB0aGlzIGNvbW1hbmQKd2hhdGlzIDxjb21tYW5kLW5hbWU+5Lya55So5Y2V6KGM5p2l5o+P6L+w57uZ5a6a55qE5ZG95Luk44CCCgojIyAxOS4gbWFuIOKAkyBNYW51YWwKbWFuIDxjb21tYW5kLW5hbWU+5Lya5Li657uZ5a6a55qE5ZG95Luk5pi+56S65LiA5Liq5omL5YaM6aG16Z2i44CCCgojIyAyMC4gZXhpdApleGl055So5LqO57uT5p2f5b2T5YmN55qE57uI56uv5Lya6K+d44CCCgojIyAyMS4gcGluZwoKcGluZyA8cmVtb3RlLWhvc3QtYWRkcmVzcz7pgJrov4flj5HpgIHmlbDmja7ljIVwaW5n6L+c56iL5Li75py6KOacjeWKoeWZqCnvvIzluLjnlKjkuI7mo4DmtYvnvZHnu5zov57mjqXlkozmnI3liqHlmajnirbmgIHjgIIKCnBpbmcg5Li76KaB55So5LqO5rWL6K+V572R57uc6L+e6YCa77yM6YCa6L+H5a+555uu5qCH5py65Zmo5Y+R6YCB5pWw5o2u5YyF5p2l5rWL6K+V5Lik5Y+w5Li75py65piv5ZCm6L+e6YCa77yM5Y+K5bu25pe25oOF5Ya144CCCmBgYHtzaH0KJCBwaW5nIGxvY2V6LmNvbSAgICAjIyDpgJrov4fln5/lkI0gcGluZ++8jOiLpSBETlMg5pyq6K6+572u5aW977yM5Y+v6IO95peg5rOVIHBpbmcg6YCaCiQgcGluZyBsaW51eC5jbgpQSU5HIGxpbnV4LmNuICgyMTEuMTU3LjIuOTQpIDU2KDg0KSBieXRlcyBvZiBkYXRhLgo2NCBieXRlcyBmcm9tIDIxMS4xNTcuMi45NC5zdGF0aWMuaW4tYWRkci5hcnBhICgyMTEuMTU3LjIuOTQpOiBpY21wX3NlcT0xIHR0bD01MyB0aW1lPTQxLjUgbXMKNjQgYnl0ZXMgZnJvbSAyMTEuMTU3LjIuOTQuc3RhdGljLmluLWFkZHIuYXJwYSAoMjExLjE1Ny4yLjk0KTogaWNtcF9zZXE9MiB0dGw9NTMgdGltZT00MC40IG1zCjY0IGJ5dGVzIGZyb20gMjExLjE1Ny4yLjk0LnN0YXRpYy5pbi1hZGRyLmFycGEgKDIxMS4xNTcuMi45NCk6IGljbXBfc2VxPTMgdHRsPTUzIHRpbWU9NDEuOSBtcwpeQwotLS0gbGludXguY24gcGluZyBzdGF0aXN0aWNzIC0tLQozIHBhY2tldHMgdHJhbnNtaXR0ZWQsIDMgcmVjZWl2ZWQsIDAlIHBhY2tldCBsb3NzLCB0aW1lIDIwMDJtcwpydHQgbWluL2F2Zy9tYXgvbWRldiA9IDQwLjQwNi80MS4yODcvNDEuOTMxLzAuNjQ0IG1zCgokIHBpbmcgMjExLjE1Ny4yLjk0ICAgIyMg6YCa6L+HIElQIOWcsOWdgCBwaW5nIO+8jOiLpeaXoOazlSBwaW5nIOmAmuWPr+iDveaYr+e9kee7nOi/nuaOpeWHuueOsOmXrumimApgYGAKCiMjIDIyLiB3aG8g4oCTIFdobyBJcyBsb2dnZWQgaW4Kd2hv6IO95YiX5Ye65b2T5YmN55m75b2V55qE55So5oi35ZCN44CCCgojIyAyMy4gc3Ug4oCTIFN3aXRjaCBVc2VyCnN1IDx1c2VybmFtZT7nlKjkuo7liIfmjaLkuI3lkIznmoTnlKjmiLfjgILljbPkvb/msqHmnInkvb/nlKjlr4bnoIHvvIzotoXnuqfnlKjmiLfkuZ/og73liIfmjaLliLDlhbblroPnlKjmiLfjgIIKCiMjIDI0LiB1bmFtZQp1bmFtZeS8muaYvuekuuWHuuWFs+S6juezu+e7n+eahOmHjeimgeS/oeaBr++8jOWmguWGheaguOWQjeensOOAgeS4u+acuuWQjeOAgeWGheaguOeJiOacrOOAgeWkhOeQhuacuuexu+Wei+etieetie+8jOS9v+eUqHVuYW1lIC1h5Y+v5Lul5p+l55yL5omA5pyJ5L+h5oGv44CCZ2V0IG5hbWUgYW5kIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQga2VybmVsCgojIyAyNS4gZnJlZSDigJMgRnJlZSBtZW1vcnkKZnJlZeS8muaYvuekuuWHuuezu+e7n+eahOepuumXsuWGheWtmOOAgeW3sue7j+WNoOeUqOWGheWtmOOAgeWPr+WIqeeUqOeahOS6pOaNouWGheWtmOetieS/oeaBr++8jGZyZWUgLW3lsIbnu5PmnpzkuK3nmoTljZXkvY3ovazmjaLmiJBLQu+8jOiAjGZyZWUg4oCTZ+WImei9rOaNouaIkEdC44CCZ2V0IG5hbWUgYW5kIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQga2VybmVsCgojIyAyNi4gZGYg4oCTIERpc2sgc3BhY2UgRnJlZQpkZuafpeeci+aWh+S7tuezu+e7n+S4reejgeebmOeahOS9v+eUqOaDheWGteKAk+ehrOebmOW3sueUqOWSjOWPr+eUqOeahOWtmOWCqOepuumXtOS7peWPiuWFtuWug+WtmOWCqOiuvuWkh+OAguS9oOWPr+S7peS9v+eUqGRmIC1o5bCG57uT5p6c5Lul5Lq657G75Y+v6K+755qE5pa55byP5pi+56S644CCcmVwb3J0IGZyZWUgZGlzayBzcGFjZQoKCiMjIDI3LiBwcyDigJMgUHJvY2Vzc2VTCnBz5pi+56S657O757uf55qE6L+Q6KGM6L+b56iL44CCcmVwb3J0IGZyZWUgZGlzayBzcGFjZQoKCiMjIDI4LiBUb3Ag4oCTIFRPUCBwcm9jZXNzZXMKdG9w5ZG95Luk5Lya6buY6K6k5oyJ54WnQ1BV55qE5Y2g55So5oOF5Ya177yM5pi+56S65Y2g55So6YeP6L6D5aSn55qE6L+b56iLLOWPr+S7peS9v+eUqHRvcCAtdSA8dXNlcm5hbWU+5p+l55yL5p+Q5Liq55So5oi355qEQ1BV5L2/55So5o6S5ZCN5oOF5Ya144CCCgojIyAyOS4gc2h1dGRvd24KCnNodXRkb3du55So5LqO5YWz6Zet6K6h566X5py677yM6ICMc2h1dGRvd24gLXLnlKjkuo7ph43lkK/orqHnrpfmnLrjgIIKCnNodXRkb3du5piv5pyA5a6J5YWo55qE5YWz5py65ZKM6YeN5ZCv5ZG95Luk77yM5bmz5pe25L2/55So5pe25o6o6I2Q5L2/55Soc2h1dGRvd27lkb3ku6TlhbPmnLrlkozph43lkK/jgIIKCiMjI3NodXRkb3du6K+t5rOVCgpgc2h1dGRvd24gW+mAiemhuV0gW+WPguaVsF1gCgrjgJDor6bop6PjgJFzaHV0ZG93buaYr+acgOWuieWFqOeahOWFs+acuuWSjOmHjeWQr+WRveS7pO+8jOW5s+aXtuS9v+eUqOaXtuaOqOiNkOS9v+eUqHNodXRkb3du5ZG95Luk5YWz5py644CC6ICM5LiU6K+l5ZG95Luk5pSv5oyB5a6a5pe25pON5L2c44CCCgojIyMgc2h1dGRvd27pgInpobkKCnwg6YCJ6aG5ICAgICAgICAgfCDnm7jlupTlip/og70gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCAtYSAgICAgICAgICAgfCDmjIflrprmnYPpmZAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC1yIAkgICAgICAgICB8ICDph43lkK/orqHnrpflmajvvIjlkoxyZWJvb3TvvInlkb3ku6TkuIDmoLcgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtayAJICAgICAgICAgfCAg5qih5ouf5YWz5py677yI5Y+q5ZCR55So5oi35Y+R5Ye66K2m5ZGK5L+h5oGv77yM5L2G5LiN5YWz5py677yJICAgICAgICAgICAgICB8CnwgLWggCSAgICAgICAgIHwgIOWFs+mXreiuoeeul+acuuW5tuWFs+mXreeUtea6kO+8iOW4uOeUqO+8iSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgLW4gCSAgICAgICAgIHwgIOS4jeiwg+eUqGluaXTov5vnqIvlhbPpl63orqHnrpfmnLrvvIjkuI3mjqjojZDvvIkgICAgICAgICAgICAgICAgICAgICAgfAp8IC1jIAkgICAgICAgICB8ICDlj5bmtojmraPlnKjmiafooYznmoTlhbPmnLrlkb3ku6QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC1mIAkgICAgICAgICB8ICDph43lkK/orqHnrpfmnLrvvIzkvYbkuI3ov5vooYzno4Hnm5jmo4DmtYsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC1GIAkgICAgICAgICB8ICDph43lkK/orqHnrpfmnLrvvIzov5vooYzno4Hnm5jmo4DmtYsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtdCjnp5IpIAkgICAgIHwgIOaMh+WumuWPkeWHuuitpuWRiuS/oeaBr+S4juWIoOmZpOS/oeaBr+aXtuimgeW7tui/n+eahOenkuaVsCAgICAgICAgICAgICAgICB8CgrjgJDpmYTliqDlj4LmlbDjgJEKCiMjIyBzaHV0ZG93buWPguaVsCAJCuaXtumXtCAJ5oyH5YWz6Zet6K6h566X5py655qE5pe26Ze044CC5Y+v5Lul5Li66K+m57uG5pe26Ze077yM5aaCMjLvvJowMO+8jOaZmuS4ijEw54K55YWz6Zet6K6h566X5py6LCDkuZ/lj6/ku6XkvZzkuLror6bnu4bliIbpkp/vvIzlpoLigJwrNeKAne+8jOWImTXliIbpkp/lkI7lhbPmnLrjgIIK6K2m5ZGK5L+h5oGvIAnlj6/ku6XmmK/ku7vmhI/mlofmnKzvvIzkv6Hmga/vvIzpnIDopoHlvJXlj7fmi6zotbfmnaXmiY3og73kvb/nlKjjgIIKCiMjIyBzaHV0ZG93buS+i+WtkO+8mgooMSnjgIHpgJrov4dzaHV0ZG93buWRveS7pOmHjeWQr+iuoeeul+acuu+8iOWKoG5vd+WImeaYr+eri+WNs+mHjeWQr++8iQpgc2h1dGRvd24gLXIgbm93YAoKKDIp44CB6K6+572uMeWIhumSn+S7peWQjuWFs+mXreiuoeeul+acuu+8jOW5tuWcqFNTSOS4reaPkOekuuKAnDEgbWludXRlIGFmdGVyIHNodXRkb3du4oCdCmBzaHV0ZG93biAtaCArMSAiMSBtaW51dGUgYWZ0ZXIgc2h1dGRvd24iYAoKKDMp44CB5Y+W5raI5YWz5py6Cgroi6XpnIDopoHlj5bmtojlhbPmnLrjgIHph43lkK/mk43kvZzvvIzlnKhTU0jkuK3lj6/mjIlDdHJsK0Plv6vmjbfplK7lj5bmtojmraPlnKjmiafooYznmoTlkb3ku6TjgIIKCuW9k+eEtuiLpemHjeaWsOeZu+mZhuS6hlNTSOaIluWFtuWug+aDheWGte+8jOWPr+mAmui/h+S4gOS4i+S7o+eggeWPlua2iO+8iOWumuaXtu+8ieWFs+acuuOAggpgc2h1dGRvd24gLWMgYAoKIyMgMzAuIG1vcmUt5pi+56S65pu05aSa77yMQ2F0Cgptb3JlIOS4jiBjYXQg55u45Ly877yM6YO95Y+v5Lul5p+l55yL5paH5Lu25YaF5a6577yM5omA5LiN5ZCM55qE5piv77yM5b2T5LiA5Liq5paH5qGj5aSq6ZW/5pe277yMIGNhdCDlj6rog73lsZXnpLrmnIDlkI7luIPmu6HlsY/luZXnmoTlhoXlrrnvvIzliY3pnaLnmoTlhoXlrrnmmK/kuI3lj6/op4HnmoTjgILov5nml7blgJnlj6/nlKggbW9yZSDpgJDooYzmmL7npLrlhoXlrrnjgIIKYGBge3NofQokIG1vcmUgL2V0Yy9sb2NhbGUuZ2VuCiQgbW9yZSArMTAwIC9ldGMvbG9jYWxlLmdlbiAgICAgICAjIyMg5LuOIDEwMCDooYzlvIDlp4vmmL7npLoKYGBgCgoKIyMgMzEuIGxlc3MKbGVzcyDkuI4gbW9yZSDnm7jkvLzvvIzkuI3ov4cgbGVzcyDmlK/mjIHkuIrkuIvmu5rliqjmn6XnnIvlhoXlrrnvvIzogIwgbW9yZSDlj6rmlK/mjIHpgJDooYzmmL7npLrjgIIKCuWQjOagt+eahGxlc3Plkb3ku6TkuZ/lj6/ku6XorqnkvaDmtY/op4jmlofku7bvvIxsZXNz5ZG95Luk6Z2e5bi45b+r77yM5bm25LiU5pSv5oyB5LiK5LiL6ZSu5p+l55yL5paH5Lu255qE5byA5aS05ZKM5pyr5bC+44CC54S26ICMbW9yZeWRveS7pOWSjOWug+exu+S8vO+8jOWPquaYr21vcmXlkb3ku6Tlj6rog73nlKhlbnRlcumUruWunueOsOaWh+S7tueahOWQkeWJjee/u+mhte+8jOS4jeaUr+aMgeWbnumAgOOAggoKfn5+fn5+fn5+fgror63ms5U6IGxlc3MgPGZpbGVuYW1lPgogICAgICAgIG1vcmUgPGZpbGVuYW1lPgp+fn5+fn5+fn5+CgpgYGB7c2h9CiQgbGVzcyAvZXRjL2xvY2FsZS5nZW4KJCBsZXNzICsxMDAgL2V0Yy9sb2NhbGUuZ2VuCmxlc3MgZGVtby50eHQKbW9yZSBkZW1vLnR4dApgYGAKCgojIyAzMi4gbmFubwpuYW5vIOaYr+S4gOS4queugOWNleWunueUqOeahOaWh+acrOe8lui+keWZqO+8jOS9v+eUqOeugOWNleOAggpgYGB7c2h9CiQgbmFubyAgZmlsZW5hbWUgICAgICAgIyMjIOe8lui+kSBmaWxlbmFtZSDmlofku7bvvIzoi6Xmlofku7bkuI3lrZjlnKjvvIzliJnmlrDmiZPlvIDkuIDkuKrmlofku7bvvIzoi6XpgIDlh7rml7bkv53lrZjvvIzliJnliJvlu7ror6Xmlofku7YKYGBgCgrnvJbovpHlrozlkI7vvIxjdHJsICsgWCDmj5DnpLrmmK/lkKbkv53lrZjvvIzmjIkgeSDnoa7lrprkv53lrZjljbPlj6/jgIIK5rOo5oSP77ya5Zyo5L2/55So6L+H56iL5Lit5Y+v55SoIGN0cmwgKyBHIOiOt+WPluW4ruWKqeOAggoKIyMgMzMuIHJlYm9vdApyZWJvb3Qg5Li66YeN5ZCv5ZG95Luk44CCCmBgYHtzaH0KIyByZWJvb3QgICAgICAgICAjIyMgJyQnIOWSjCAnIycg55qE5Yy65Yir5Zyo5LqOICckJyDmma7pgJrnlKjmiLfljbPlj6/miafooYwKICAgICAgICAgICAgICAgICAjIyMg6ICMICcjJyDkuLogcm9vdCDnlKjmiLfmiY3lj6/miafooYzvvIzmiJbmma7pgJrnlKjmiLfkvb/nlKggJ3N1ZG8nCmBgYAoKIyMgMzQuIHBvd2Vyb2ZmCnBvd2Vyb2ZmIOS4uuWFs+acuuWRveS7pOOAggpgYGB7c2h9CiMgcG93ZXJvZmYgICMjIyDpqazkuIrlhbPmnLoKYGBgCgojIyAzNS4gbW91bnQg5oyC6L295paH5Lu257O757ufCm1vdW50IOeUqOS6juaMgui9veS4gOS4quaWh+S7tuezu+e7n++8jOmcgOimgSByb290IOeUqOaIt+aJp+ihjOOAguS4gOS4quejgeebmOWPr+WIhuS4uuiLpeW5suS4quWIhuWMuu+8jOWcqOWIhuWMuuS4iumdouWPr+S7peWIm+W7uuaWh+S7tuezu+e7n++8jOiAjOaMgui9veeCueWImeaYr+aPkOS+m+S4gOS4quiuv+mXrueahOWFpeWPo++8jOWwhuS4gOS4quWIhuWMuueahOaWh+S7tuezu+e7n+aMgui9veWIsOafkOS4quebruW9leS4re+8jOensOi/meS4quebruW9leS4uuaMgui9veeCue+8jOW5tuS4lOWPr+S7pemAmui/h+i/meS4quaMgui9veeCueiuv+mXruivpeaWh+S7tuezu+e7n+S4reeahOWGheWuueOAggoK5L6L5aaC5LiA5Z2X56Gs55uY5ZyoIExpbnV4IOS4reihqOekuuS4uiAvZGV2L3NkYSDpgqPkuYjlroPkuIrpnaLnmoTliIbljLrlupTor6XooajnpLrkuLogL2Rldi9zZGExIOOAgS9kZXYvc2RhMiDjgIIKCmBgYHtzaH0KIyBtb3VudCAgICAgICAgICAgICAgICAgICAgICAgIyMg6L6T5Ye657O757uf55uu5YmN55qE5oyC6L295L+h5oGvCiMgbW91bnQgL2Rldi9zZGExIC9tbnQgICAgICAgICMjIOWwhiBzZGExIOaMgui9veWIsCAvbW50IOS4rQojIGNkIC9tbnQgICAgICAgICAgICAgICAgICAgICAjIyDnm7TmjqXpgJrov4cgL21udCDorr/pl67lhoXlrrkKIyBtb3VudCAtbyByZW1vdW50LHJ3ICAvbW50ICAgIyMg6YeN5paw5oyC6L29IHNkYTEg5YiwIC9tbnQg5bm26K6+572u5Li6IOWPr+ivu+WGmQojIG1vdW50IC1hICAgICAgICAgICAgICAgICAgICAjIyDmjILovb0gZnN0YWIg5paH5Lu26YWN572u5aW955qE5paH5Lu257O757ufCgojIFdpbjEwIFNoYXJpbmcgRm9sZGVyCiMgbW91bnQgL21udC9oZ2ZzL0NlbnRPU19TaGFyaW5nLwojIGxzIC9tbnQvaGdmcy9DZW50T1NfU2hhcmluZy8KYGBgCgojIyAzNi4gdW1vdW505Y246L295LiA5Liq5oyC6L2954K5CnVtb3VudCDkuI4gbW91bmcg55u45Y+N77yM5piv5Y246L295LiA5Liq5oyC6L2954K577yM5Y2z5Y+W5raI6K+l5YWl5Y+j44CCCmBgYHtzaH0KIyB1bW91bnQgL21udCAgICAgICAgICAgICAgICAgIyMg5Y246L29IC9tbnQg6L+Z5Liq5oyC6L2954K555qE5paH5Lu257O757ufCiMgdW1vdW50IC1hICAgICAgICAgICAgICAgICAgICMjIOWNuOi9veaJgOacieW3suaMgui9veeahOaWh+S7tuezu+e7nwpgYGAKCiMjIDM3LiBsbgoKbG4g5Li76KaB55So5LqO5Zyo5Lik5Liq5paH5Lu25Lit5Yib5bu66ZO+5o6l77yM6ZO+5o6l5Y+I5YiG5Li6IEhhcmQgTGlua3MgKOehrOmTvuaOpSnlkowgU3ltYm9saWMgTGlua3MgKOespuWPt+mTvuaOpeaIlui9r+mTvuaOpSnvvIzlhbbkuK3pu5jorqTkuLrliJvlu7rnoazpk77mjqXvvIzkvb/nlKggLXMg5Y+C5pWw5oyH5a6a5Yib5bu66L2v6ZO+5o6l44CCCgrnoazpk77mjqXkuLvopoHmmK/lop7liqDkuIDkuKrmlofku7bnmoTpk77mjqXmlbDvvIzlj6ropoHor6Xmlofku7bnmoTpk77mjqXmlbDkuI3kuLogMCDvvIzor6Xmlofku7blsLHkuI3kvJrooqvniannkIbliKDpmaTvvIzmiYDku6XliKDpmaTkuIDkuKrlhbfmnInlpJrkuKrnoazpk77mjqXmlbDnmoTmlofku7bvvIzlv4XpobvliKDpmaTmiYDmnInlroPnmoTnoazpk77mjqXmiY3lj6/liKDpmaTjgIIKCui9r+mTvuaOpeeugOWNleadpeivtOaYr+S4uuaWh+S7tuWIm+W7uuS6huS4gOS4quexu+S8vOW/q+aNt+aWueW8j+eahOS4nOilv++8jOmAmui/h+ivpemTvuaOpeWPr+S7peiuv+mXruaWh+S7tu+8jOS/ruaUueaWh+S7tu+8jOS9huS4jeS8muWinuWKoOivpeaWh+S7tueahOmTvuaOpeaVsO+8jOWIoOmZpOS4gOS4qui9r+mTvuaOpeW5tuS4jeS8muWIoOmZpOa6kOaWh+S7tu+8jOWNs+S9v+a6kOaWh+S7tuiiq+WIoOmZpO+8jOi9r+mTvuaOpeS5n+WtmOWcqO+8jOW9k+mHjeaWsOWIm+W7uuS4gOS4quWQjOWQjeeahOa6kOaWh+S7tu+8jOivpei9r+mTvuaOpeWImeaMh+WQkeaWsOWIm+W7uueahOaWh+S7tuOAggoK56Gs6ZO+5o6l5Y+q5Y+v6ZO+5o6l5Lik5Liq5paH5Lu277yM5LiN5Y+v6ZO+5o6l55uu5b2V77yM6ICM6L2v6ZO+5o6l5Y+v6ZO+5o6l55uu5b2V77yM5omA5Lul6L2v6ZO+5o6l5piv6Z2e5bi454G15rS755qE44CCCiAgICAKYGBge3NofQokIGxuIHNvdXJjZSBkZXN0ICAgICAgICMjIOS4uiBzb3VyY2Ug5Yib5bu65LiA5Liq5ZCN5Li6IGRlc3Qg55qE56Gs6ZO+5o6lCiQgbG4gLXMgc291cmNlIGRlc3QgICAgIyMg5Li6IHNvdXJjZSDliJvlu7rkuIDkuKrlkI3kuLogZGVzdCDnmoTova/pk77mjqUKYGBgCgojIyAzOC4gY2hvd24tQ2hhbmdlIE93bmVyCgpjaG93biDnlKjkuo7mlLnlj5jkuIDkuKrmlofku7bnmoTmiYDmnInogIXlj4rmiYDlnKjnmoTnu4TjgIIKYGBge3NofQojIGNob3duIHVzZXIgZmlsZW5hbWUgICAgICAgICMjIOaUueWPmCBmaWxlbmFtZSDnmoTmiYDmnInogIXkuLogdXNlcgojIGNob3duIHVzZXI6Z3JvdXAgZmlsZW5hbWUgICMjIOaUueWPmCBmaWxlbmFtZSDnmoTmiYDmnInogIXkuLogdXNlcu+8jOe7hOS4uiBncm91cAojIGNob3duIC1SIHJvb3QgZm9sZGVyICAgICAgICMjIOaUueWPmCBmb2xkZXIg5paH5Lu25aS55Y+K5YW25a2Q5paH5Lu255qE5omA5pyJ6ICF5Li6IHJvb3QKYGBgCgojIyAzOS4gY2htb2QKCmNobW9k5ZG95Luk55So5p2l5pS55Y+Y5paH5Lu255qE6K+7L+WGmS/miafooYzmnYPpmZDvvIzmnYPpmZDmlbDlgLzlpoLkuIvmiYDnpLrvvJoKCjQgLSByZWFkIHBlcm1pc3Npb24KMiAtIHdyaXRlIHBlcm1pc3Npb24KMSAtIGV4ZWN1dGUgcGVybWlzc2lvbgowIC0gbm8gcGVybWlzc2lvbgoK5LiL6Z2i55qE5ZG95Luk5Y+v5Lul57uZdGVzdC50eHTmlofku7botYvmnIDpq5jnmoTmnYPpmZDvvJoKCmBgYHtzaH0KY2htb2QgNzU1IHRlc3QudHh0CnN1ZG8gY2htb2QgNzc3IC1SIC5naXQvKgpgYGAKCmNobW9kIOawuOi/nOabtOaUueS4gOS4quaWh+S7tueahOadg+mZkO+8jOS4u+imgeaciSDor7vlj5Yg44CBIOWGmeWFpSDjgIEg5omn6KGMIO+8jOS4ieenjeadg+mZkO+8jOWFtuS4rSDmiYDmnInogIUg44CBIOeUqOaIt+e7hCDjgIEg5YW25LuWIOWQhOWNoOS4ieS4qu+8jOWboOatpCBscyAtbCDlj6/ku6XnnIvliLDlpoLkuIvnmoTkv6Hmga8KCmBgYHtzaH0KLXJ3eHItLXItLSAxIGxvY2V6IHVzZXJzICAgMTU0IEF1ZyAzMCAxODowOSBmaWxlbmFtZQoKIyDlhbbkuK0gcj1yZWFkIO+8jCB3PXdyaXRlIO+8jCB4PWV4ZWN1dGUKCiMgY2htb2QgK3ggZmlsZW5hbWUgICAgICAgICMjIOS4uiB1c2VyIO+8jGdyb3VwIO+8jG90aGVycyDmt7vliqDmiafooYzmnYPpmZAgCiMgY2htb2QgLXggZmlsZW5hbWUgICAgICAgICMjIOWPlua2iCB1c2VyIO+8jCBncm91cCDvvIxvdGhlcnMg55qE5omn6KGM5p2D6ZmQIAojIGNobW9kICt3IGZpbGVuYW1lICAgICAgICAjIyDkuLogdXNlciDmt7vliqDlhpnlhaXmnYPpmZAgCiMgY2htb2QgdWdvPXJ3eCBmaWxlbmFtZSAgICMjIOiuvue9riB1c2VyIO+8jGdyb3VwIO+8jG90aGVycyDlhbfmnIkg6K+75Y+W44CB5YaZ5YWl44CB5omn6KGM5p2D6ZmQIAojIGNobW9kIHVnPXJ3IGZpbGVuYW1lICAgICAjIyDorr7nva4gdXNlciDvvIxncm91cCDmt7vliqAg6K+75Y+W44CB5YaZ5YWl5p2D6ZmQIAojIGNobW9kIHVnbz0tLS0gZmlsZW5hbWUgICAjIyDlj5bmtojmiYDmnInmnYPpmZAgCmBgYAoKIyMgNDAuIHVzZXJhZGQKdXNlcmFkZCDnlKjkuo7mt7vliqDkuIDkuKrmma7pgJrnlKjmiLfjgIIKCmBgYHtzaH0KIyB1c2VyYWRkIC1tIC1nIHVzZXJzIC1HIGF1ZGlvIC1zIC91c3IvYmluL2Jhc2ggbmV3dXNlciAgICAgCiMjIC1tIOWIm+W7uiBob21lIOebruW9le+8jCAtZyDmiYDlsZ7nmoTkuLvnu4TvvIwgLUcg5oyH5a6a6K+l55So5oi35Zyo5ZOq5Lqb6ZmE5Yqg57uE77yMIC1zIOiuvuWumum7mOiupOeahCBzaGVsbCDvvIxuZXd1c2VyIOS4uuaWsOeahOeUqOaIt+WQjSAKCiMg546w5Zyo5byA5aeL5paw5bu65YWx5Lqr5paH5Lu25aS555qE55So5oi3d2lsbHnvvIzkvb/nlKjlkb3ku6TigJx1c2VyYWRkIHdpbGx54oCd77yM5aaC5LiLCnVzZXJhZGQgd2lsbHkKCiMg5L2/55So5ZG95Luk4oCccGFzc3dkIHdpbGx54oCd77yM5a+555So5oi35re75Yqg5a+G56CB77yM5aaC5LiLCnBhc3N3ZCB3aWxseQoKIyDkvb/nlKjlkb3ku6TigJxta2RpciAvaG9tZS93aWxseS9teXNoYXJl4oCd77yMCiMg5Zyo55So5oi3d2lsbHnmlofku7blpLnkuIvmlrDlu7rigJxteXNoYXJl4oCd5YWx5Lqr5paH5Lu25aS577yM77yI5Lit6YCU5Luld2lsbHnnlKjmiLfov5vlhaXkuobns7vnu5/vvIzmiYDku6XlpJrkuoblvojlpJrkuK3mlofmlofku7blpLnvvIkKY2Qgfgpta2RpciAvaG9tZS93aWxseS9teXNoYXJlCgpjZCAvaG9tZS93aWxseS8KbHMKCiMg5L2/55So5ZG95Luk4oCcY2htb2QgLVIgNzc3IC9ob21lL3dpbGx5L215c2hhcmXigJ0sCiMg5bCG5pW05LiqbXlzaGFyZeaWh+S7tuWkueS4juWFtuS4reeahOaWh+S7tuWSjOWtkOebruW9leeahOadg+mZkOmDveiuvue9ruS4unJ3eHJ3eHJ3eO+8jOWNs+aJgOacieS6uumDveWPr+S7peafpeeci+aTjeS9nApjaG1vZCAtUiA3NzcgL2hvbWUvd2lsbHkvbXlzaGFyZQoKYGBgCgojIyA0MS4gcGFzc3dkCnBhc3N3ZCDnlKjkuo7mlLnlj5jnlKjmiLfnmbvlvZXlr4bnoIHjgIIKYGBge3NofQokIHBhc3N3ZCAgICAgICAgICAgICAgICAgIyMg5LiN5bim5Y+C5pWw5pu05pS55b2T5YmN55So5oi35a+G56CBCiMgcGFzc3dkIG5ld3VzZXIgICAgICAgICAjIyDmm7TmlLnkuIrov7DmlrDlu7rnmoQgbmV3dXNlciDnmoTnlKjmiLflr4bnoIEKYGBgCgojIyA0Mi4gd2hlcmVpcwp3aGVyZWlzIOeUqOS6juafpeaJvuaWh+S7tuOAgeaJi+WGjOetieOAggpgYGB7c2h9CiQgd2hlcmVpcyBiYXNoIApiYXNoOiAvdXNyL2Jpbi9iYXNoIC9ldGMvYmFzaC5iYXNocmMgL2V0Yy9iYXNoLmJhc2hfbG9nb3V0IC91c3Ivc2hhcmUvbWFuL21hbjEvYmFzaC4xLmd6IC91c3Ivc2hhcmUvaW5mby9iYXNoLmluZm8uZ3ogCiQgd2hlcmVpcyAtYiBiYXNoICAgICAgICMjIOS7heafpeaJviBiaW5hcnkgCmJhc2g6IC91c3IvYmluL2Jhc2ggL2V0Yy9iYXNoLmJhc2hyYyAvZXRjL2Jhc2guYmFzaF9sb2dvdXQgCiQgd2hlcmVpcyAtbSBiYXNoICAgICAgICMjIOS7heafpeaJviBtYW51YWwgCmJhc2g6IC91c3Ivc2hhcmUvbWFuL21hbjEvYmFzaC4xLmd6IC91c3Ivc2hhcmUvaW5mby9iYXNoLmluZm8uZ3ogCmBgYAojIyA0My4gZmluZApmaW5kIOS5n+eUqOS6juafpeaJvuaWh+S7tu+8jOS9huabtOS4uuW8uuWkp++8jOaUr+aMgeato+WIme+8jOW5tuS4lOWPr+WwhuafpeaJvue7k+aenOS8oOmAkuWIsOWFtuS7luWRveS7pOOAggpgYGB7c2h9CiQgZmluZCAuIC1uYW1lIFBBVFRFUk4gICAgIyMg5LuO5b2T5YmN55uu5b2V5p+l5om+56ym5ZCIIFBBVFRFUk4g55qE5paH5Lu2IAokIGZpbmQgL2hvbWUgLW5hbWUgUEFUVEVSTiAtZXhlYyBscyAtbCB7fSAvOyAgIyDku44gL2hvbWUg5paH5Lu25p+l5om+5omA5pyJ56ym5ZCIIFBBVFRFUk4g55qE5paH5Lu277yM5bm25Lqk55SxIGxzIOi+k+WHuuivpue7huS/oeaBryAKYGBgCgojIyA0NC4gd2dldAoKd2dldCDmmK/kuIDkuKrkuIvovb3lt6XlhbfvvIznroDljZXlvLrlpKfjgIIKYGBge3NofQokIHdnZXQgLU8gbmV3bmFtZS5tZCBodHRwczovL2dpdGh1Yi5jb20vTENUVC9UcmFuc2xhdGVQcm9qZWN0L2Jsb2IvbWFzdGVyL1JFQURNRS5tZCAgICAgIyMg5LiL6L29IFJFQURNRSDmlofku7blubbph43lkb3lkI3kuLogbmV3bmFtZS5tZCAKJCB3Z2V0IC1jIHVybCAgICAgIyMg5LiL6L29IHVybCDlubblvIDlkK/mlq3ngrnnu63kvKAgCmBgYAojIyA0NS4gdG91Y2ggJiB2aQoKdG91Y2jlkb3ku6Tlj6/ku6XlnKhMaW51eOezu+e7n+S4reWIm+W7uuWkp+Wwj+S4ujDnmoTku7vmhI/nsbvlnovmlofku7bvvIzkvZzkuLrnqIvluo/lvIDlj5HogIXvvIzlvZPkvaDpnIDopoHlnKhMaW51eOacjeWKoeWZqOS4iuWIm+W7uuaWh+S7tuaXtu+8jOWPr+S7peS9v+eUqHRvdWNo5ZG95Luk77yaCgp+fn5+fn5+fn5+CuivreazlTogdG91Y2ggPGZpbGVuYW1lPgp0b3VjaCBkZW1vLnR4dAoKdmkodmlzdWFsKSAjIOaWsOW7uuaWh+acrOaWh+ahoyDovpPlhaXlrozmiJDlkI7vvIzmjIlFc2PlkI5pbnNlcnTmtojlpLHvvIznhLblkI7ovpPlhaU6d3HvvIx3cml0ZSAmIHF1aXQgRW50ZXLpgIDlh7ogCn5+fn5+fn5+fn4KCmBgYHtzaH0Kcm9vdEBkZXZvcHNjdWJlOn4jIHRvdWNoIGRlbW8udHh0CnJvb3RAZGV2b3BzY3ViZTp+IyBscwpkZW1vLnR4dApgYGAKCiMjIDQ2LiBzb3J0Cgpzb3J05ZG95Luk55So5p2l5a+55paH5Lu25YaF5a656L+b6KGM5o6S5bqP44CC5Yib5bu65LiA5Liq5ZCN5Li6dGVzdC50eHTnmoTmlofku7bvvIzlubbkuJTmiorku6XkuIvlhoXlrrnmi7fotJ3liLDor6Xmlofku7bkuK3vvJoKCjEgbWlrZSBsZXZlbCBpbnRlcm1lZGlhdGUgamFuCjEwIGx1Y3kgbGV2ZWwgYmVnaW5lciBtYXIKNDUgRGF2ZSBsZXZlbCBleHBlcnQgZGVjCjQgZGVubmlzIHN0YXJ0IGJlZ2lubmVyIGp1bAo3IE1lZ2FuIGVtcGxveWVlIHRyYWluZWUgZmViCjU4IE1hdGhldyBIZWFkIENFTyBub3YKCuS4iumdoueahOS+i+WtkOS4re+8jOesrOS6jOWIl+aYr+WQjeensO+8jOaJgOS7peWmguaenOS9oOaDs+WvueWQjeensOWIl+aMieWtl+avjeaOkuW6j++8jOWwseWPr+S7peS9v+eUqOKAnC1r4oCd6YCJ6aG577yM5bm25qCH5rOo5YiX5Y+377yM5q+U5aaC4oCcLWsy4oCd77yaCgp+fn5+fn5+fn5+CuivreazlTogc29ydApzb3J0IC1rMiB0ZXN0LnR4dAp+fn5+fn5+fn5+CgrmjpLluo/nu5PmnpwKYGBge3NofQpyb290QGRldm9wc2N1YmU6fiMgc29ydCAtazIgdGVzdC50eHQKNDUgRGF2ZSBsZXZlbCBleHBlcnQgZGVjCjQgZGVubmlzIHN0YXJ0IGJlZ2lubmVyIGp1bAoxMCBsdWN5IGxldmVsIGJlZ2luZXIgbWFyCjU4IE1hdGhldyBIZWFkIENFTyBub3YKNyBNZWdhbiBlbXBsb3llZSB0cmFpbmVlIGZlYgoxIG1pa2UgbGV2ZWwgaW50ZXJtZWRpYXRlIGphbgpgYGAKCuesrOS4gOWIl+aYr+aVsOWtl++8jOWmguaenOS9oOaDs+aMieaVsOWtl+aOkuW6j++8jOWPr+S7peS9v+eUqOKAnC1o4oCd6YCJ6aG544CC5aaC5p6c5pWw5a2X5Zyo5LiN5ZCM5YiX5LiK77yM5L2g5Y+v5Lul5Zyo4oCcLWjigJ3pgInpobnlkI7kvb/nlKjigJwta+KAnemAiemhue+8mgoKYGBge3NofQpyb290QGRldm9wc2N1YmU6fiMgc29ydCAtaCB0ZXN0LnR4dCAgCjEgbWlrZSBsZXZlbCBpbnRlcm1lZGlhdGUgamFuCjQgZGVubmlzIHN0YXJ0IGJlZ2lubmVyIGp1bAo3IE1lZ2FuIGVtcGxveWVlIHRyYWluZWUgZmViCjEwIGx1Y3kgbGV2ZWwgYmVnaW5lciBtYXIKNDUgRGF2ZSBsZXZlbCBleHBlcnQgZGVjCjU4IE1hdGhldyBIZWFkIENFTyBub3YKYGBgCgrmnIDlkI7kuIDliJfmmK/mnIjku73vvIzkvaDlj6/ku6Xkvb/nlKjigJwtTeKAnemAiemhueadpeiuqeaWh+S7tuWGheWuueaMieaciOS7veaOkuW6j++8mgpgYGB7c2h9CnJvb3RAZGV2b3BzY3ViZTp+IyBzb3J0IC1rNSAtTSB0ZXN0LnR4dAoxIG1pa2UgbGV2ZWwgaW50ZXJtZWRpYXRlIGphbgo3IE1lZ2FuIGVtcGxveWVlIHRyYWluZWUgZmViCjEwIGx1Y3kgbGV2ZWwgYmVnaW5lciBtYXIKNCBkZW5uaXMgc3RhcnQgYmVnaW5uZXIganVsCjU4IE1hdGhldyBIZWFkIENFTyBub3YKNDUgRGF2ZSBsZXZlbCBleHBlcnQgZGVjCmBgYAoK5rOo77ya5aaC5p6c5L2g5oOz5raI6Zmk6YeN5aSN55qE6KGM77yM5Y+v5Lul5Zyoc29ydOWRveS7pOWQjuS9v+eUqOKAnC114oCd6YCJ6aG544CCCgrkvb/nlKjigJwtcuKAnemAiemhue+8jOaYr+aWh+S7tuWAkuW6j+aOkuWIl++8mgpgYGB7c2h9CnJvb3RAZGV2b3BzY3ViZTp+IyBzb3J0IC1oIC1yIHRlc3QudHh0CjU4IE1hdGhldyBIZWFkIENFTyBub3YKNDUgRGF2ZSBsZXZlbCBleHBlcnQgZGVjCjEwIGx1Y3kgbGV2ZWwgYmVnaW5lciBtYXIKNyBNZWdhbiBlbXBsb3llZSB0cmFpbmVlIGZlYgo0IGRlbm5pcyBzdGFydCBiZWdpbm5lciBqdWwKMSBtaWtlIGxldmVsIGludGVybWVkaWF0ZSBqYW4KYGBgCgojIyA0Ny4gZGlmZuWRveS7pAoKZGlmZuWRveS7pOeUqOadpeaJvuWHujLkuKrmlofku7bnmoTkuI3lkIzngrnjgIJkaWZm5ZG95Luk6YCa6L+H5YiG5p6Q5paH5Lu25YaF5a6577yM54S25ZCO5bCG5LiN5ZCM55qE6KGM5omT5Y2w5Ye65p2l77yM5LiL6Z2i55qE5L6L5a2Q5Y+v5Lul5om+5Ye65Lik5Liq5paH5Lu2dGVzdOWSjHRlc3Qx55qE5LiN5ZCM54K577yaCgp+fn5+fn5+fn5+CuivreazlTogZGlmZiA8ZmlsZW5hbWUxPiA8ZmlsZW5hbWUyPgogICAgICAgIGRpZmYgdGVzdC50eHQgdGVzdDEudHh0Cn5+fn5+fn5+fn4KCmBgYHtzaH0Kcm9vdEBkZXZvcHNjdWJlOn4jIGRpZmYgdGVzdC50eHQgdGVzdDEudHh0CjdjNwo8IDU5IHNkZnNkCi0tLQo+IDU5IHNkZnNkICBDVE8gZGVjCmBgYAoKIyMgNDguIFVuaXHlkb3ku6QKCnVuaXHlkb3ku6TnlKjmnaXov4fmu6Tmlofku7bkuK3nmoTph43lpI3ooYzvvJoKfn5+fn5+fn5+fgror63ms5U6IHVuaXEgCnVuaXEgdGVzdC50eHQKfn5+fn5+fn5+fgpyb290QGRldm9wc2N1YmU6fiMgdW5pcSB0ZXN0LnR4dAoxIG1pa2UgbGV2ZWwgaW50ZXJtZWRpYXRlIGphbgoxMCBsdWN5IGxldmVsIGJlZ2luZXIgbWFyCjQ1IERhdmUgbGV2ZWwgZXhwZXJ0IGRlYwo0IGRlbm5pcyBzdGFydCBiZWdpbm5lciBqdWwKNyBNZWdhbiBlbXBsb3llZSB0cmFpbmVlIGZlYgo1OCBNYXRoZXcgSGVhZCBDRU8gbm92CgojIyA0OS4gc2Vk5ZG95LukCgpzZWQg5piv5LiA56eN5Zyo57q/57yW6L6R5Zmo77yM5a6D5LiA5qyh5aSE55CG5LiA6KGM5YaF5a6544CC5aSE55CG5pe277yM5oqK5b2T5YmN5aSE55CG55qE6KGM5a2Y5YKo5Zyo5Li05pe257yT5Yay5Yy65Lit77yM56ew5Li64oCc5qih5byP56m66Ze04oCd77yIcGF0dGVybiBzcGFjZe+8ie+8jOaOpeedgOeUqHNlZOWRveS7pOWkhOeQhue8k+WGsuWMuuS4reeahOWGheWuue+8jOWkhOeQhuWujOaIkOWQju+8jOaKiue8k+WGsuWMuueahOWGheWuuemAgeW+gOWxj+W5leOAguaOpeedgOWkhOeQhuS4i+S4gOihjO+8jOi/meagt+S4jeaWremHjeWkje+8jOebtOWIsOaWh+S7tuacq+WwvuOAguaWh+S7tuWGheWuueW5tuayoeaciSDmlLnlj5jvvIzpmaTpnZ7kvaDkvb/nlKjph43lrprlkJHlrZjlgqjovpPlh7rjgIIKCuWmguaenOS9oOaDs+mAmui/h+aQnOe0ouabv+aNouaWh+S7tuS4reeahOaMh+WumuWGheWuue+8jOS9oOWPr+S7peS9v+eUqOKAnHPigJ3pgInpobnmnaXmo4DntKLliLDlroPnhLblkI7lsIblroPmm7/mjaLjgIIKfn5+fn5+fn5+fgror63ms5U6IHNlZCAncy88b2xkLXdvcmQ+LzxuZXctd29yZD4vJyB0ZXN0LnR4dAp+fn5+fn5+fn5+CuS+i+Wmgu+8jOWcqHRlc3QudHh05paH5Lu25Lit55So4oCcbWljaGFlbOKAneabv+aNouKAnG1pa2XigJ3vvJoKYGBge3NofQojIHNlZCAncy9taWtlL21pY2hhZWwvJyB0ZXN0LnR4dAoKcm9vdEBkZXZvcHNjdWJlOn4jIHNlZCAncy9taWtlL21pY2hhZWwvJyB0ZXN0LnR4dAoxIG1pY2hhZWwgbGV2ZWwgaW50ZXJtZWRpYXRlIGphbgoxMCBsdWN5IGxldmVsIGJlZ2luZXIgbWFyCjQ1IERhdmUgbGV2ZWwgZXhwZXJ0IGRlYwo0IGRlbm5pcyBzdGFydCBiZWdpbm5lciBqdWwKNyBNZWdhbiBlbXBsb3llZSB0cmFpbmVlIGZlYgo1OCBNYXRoZXcgSGVhZCBDRU8gbm92CmBgYAoKIyMgUmVmZXJlbmNlCgo+IC0g5paH56ug5Y+C6ICD77yaWzI55Liq5L2g5b+F6aG755+l6YGT55qETGludXjlkb3ku6RdKGh0dHA6Ly9ibG9nLjUxY3RvLmNvbS95YW5nem9uZy8xNjgwNzMwKQoKPiAtIOivkeaWh+a6kOiHqu+8mlsyOSBMaW51eCBDb21tYW5kcyBZb3UgTXVzdCBLbm93XShodHRwOi8vd3d3LmlkbzMyMS5jb20vMTYwOS5odG1sKQoK