From 02b56c243264b338005688265e2a2c0026a3b321 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com>
Date: Sun, 28 Apr 2019 17:50:26 +0800
Subject: [PATCH] =?UTF-8?q?Hive=E5=B8=B8=E7=94=A8DDL=E6=93=8D=E4=BD=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
notes/Hive常用DML操作.md | 319 +++++++++++++++++++++++++++++
pictures/hive-emp-deptno-20-30.png | Bin 0 -> 28214 bytes
pictures/hive-emp-deptno-20.png | Bin 0 -> 14357 bytes
pictures/hive-emp-ptn.png | Bin 0 -> 33288 bytes
pictures/hive-emp-ts-2.png | Bin 0 -> 2430 bytes
pictures/hive-emp-ts.png | Bin 0 -> 2776 bytes
pictures/hive-emp.png | Bin 0 -> 33167 bytes
pictures/hive-ouput.png | Bin 0 -> 25864 bytes
8 files changed, 319 insertions(+)
create mode 100644 notes/Hive常用DML操作.md
create mode 100644 pictures/hive-emp-deptno-20-30.png
create mode 100644 pictures/hive-emp-deptno-20.png
create mode 100644 pictures/hive-emp-ptn.png
create mode 100644 pictures/hive-emp-ts-2.png
create mode 100644 pictures/hive-emp-ts.png
create mode 100644 pictures/hive-emp.png
create mode 100644 pictures/hive-ouput.png
diff --git a/notes/Hive常用DML操作.md b/notes/Hive常用DML操作.md
new file mode 100644
index 0000000..35d789a
--- /dev/null
+++ b/notes/Hive常用DML操作.md
@@ -0,0 +1,319 @@
+# Hive 常用DML操作
+
+
+
+
+## 一、加载文件数据到表
+
+### 1.1 语法
+
+将文件数据加载到表时,Hive不会进行任何转换,加载操作是纯复制/移动操作,它将数据文件移动到Hive表定义的存储位置。
+
+```shell
+LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
+```
+
+- Load 关键字代表从本地文件系统加载文件,省略则代表从HDFS上加载文件:
+
+ + 从本地文件系统加载文件时, `filepath`可以是绝对路径也可以是相对路径(建议使用绝对路径);
+
+ + 从HDFS加载文件时候,`filepath`为文件完整的URL地址:如`hdfs://namenode:port/user/hive/project/ data1`
+
+- `filepath`可以是文件路径(在这种情况下Hive会将文件移动到表中),也可以目录路径(在这种情况下,Hive会将该目录中的所有文件移动到表中);
+
+- 如果使用OVERWRITE关键字,则将删除目标表(或分区)的内容,使用新的数据填充;不使用此关键字,则数据以追加的方式加入;
+
+- 加载的目标可以是表或分区。如果是分区表,则必须指定加载数据的分区;
+
+- 加载文件的格式必须与建表时使用` STORED AS`指定的存储格式相同。
+
+> 使用建议:
+>
+> **不论是本地路径还是URL都建议使用完整的**。虽然可以使用不完整的URL地址,此时Hive将使用hadoop中fs.default.name配置来推断地址,但是为避免不必要的错误,建议使用完整的本地路径或URL地址;
+>
+> **加载对象是分区表时建议显示指定分区**。在Hive 3.0之后,内部将加载(LOAD)重写为INSERT AS SELECT,此时如果不指定分区,INSERT AS SELECT将假设最后一组列是分区列,如果该列不是表定义的分区,它将抛出错误。为避免错误,还是建议显示指定分区。
+
+### 1.2 示例
+
+新建分区表:
+
+```sql
+ CREATE TABLE emp_ptn(
+ empno INT,
+ ename STRING,
+ job STRING,
+ mgr INT,
+ hiredate TIMESTAMP,
+ sal DECIMAL(7,2),
+ comm DECIMAL(7,2)
+ )
+ PARTITIONED BY (deptno INT) -- 按照部门编号进行分区
+ ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
+```
+
+从HDFS上加载数据到分区表:
+
+```sql
+LOAD DATA INPATH "hdfs://hadoop001:8020/mydir/emp.txt" OVERWRITE INTO TABLE emp_ptn PARTITION (deptno=20);
+```
+
+> emp.txt文件可在本仓库的resources目录中下载
+
+加载后表中数据如下,分区列deptno全部赋值成20:
+
+
+
+## 二、查询结果插入到表
+
+### 2.1 语法
+
+```sql
+INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
+INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
+```
+
++ Hive 0.13.0开始,建表时可以通过使用TBLPROPERTIES(“immutable”=“true”)来创建不可变表(immutable table) ,如果不可以变表中存在数据,则INSERT INTO失败。(注:INSERT OVERWRITE的语句不受`immutable`属性的影响);
+
++ 可以对表或分区执行插入操作。如果表已分区,则必须通过指定所有分区列的值来指定表的特定分区;
+
++ 从Hive 1.1.0开始,TABLE关键字是可选的;
+
++ 从Hive 1.2.0开始 ,可以采用INSERT INTO tablename(z,x,c1)指明插入列;
+
++ 可以将SELECT语句的查询结果插入多个表(或分区),称为多表插入。语法如下:
+
+ ```sql
+ FROM from_statement
+ INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
+ [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
+ [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
+ ```
+
+### 2.2 动态插入分区
+
+```sql
+INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
+INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
+```
+
+在向分区表插入数据时候,分区列名是必须的,但是列值是可选的。如果给出了分区列值,我们将其称为静态分区,否则它是动态分区。动态分区列必须在SELECT语句的列中最后指定,并且与它们在PARTITION()子句中出现的顺序相同。
+
+注意:Hive 0.9.0之前的版本动态分区插入是默认禁用的,而0.9.0之后的版本则默认启用。以下是动态分区的相关配置:
+
+| 配置 | 默认值 | 说明 |
+| ------------------------------------------ | -------- | ------------------------------------------------------------ |
+| `hive.exec.dynamic.partition` | `true` | 需要设置为true才能启用动态分区插入 |
+| `hive.exec.dynamic.partition.mode` | `strict` | 在严格模式(strict)下,用户必须至少指定一个静态分区,以防用户意外覆盖所有分区,在非严格模式下,允许所有分区都是动态的 |
+| `hive.exec.max.dynamic.partitions.pernode` | 100 | 允许在每个mapper/reducer节点中创建的最大动态分区数 |
+| `hive.exec.max.dynamic.partitions` | 1000 | 允许总共创建的最大动态分区数 |
+| `hive.exec.max.created.files` | 100000 | 作业中所有mapper/reducer创建的HDFS文件的最大数量 |
+| `hive.error.on.empty.partition` | `false` | 如果动态分区插入生成空结果,是否抛出异常 |
+
+### 2.3 示例
+
+1. 新建emp表,作为查询对象表
+
+```sql
+CREATE TABLE emp(
+ empno INT,
+ ename STRING,
+ job STRING,
+ mgr INT,
+ hiredate TIMESTAMP,
+ sal DECIMAL(7,2),
+ comm DECIMAL(7,2),
+ deptno INT)
+ ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
+
+ -- 加载数据到emp表中 这里直接从本地加载
+load data local inpath "/usr/file/emp.txt" into table emp;
+```
+ 完成后`emp`表中数据如下:
+
+
+2. 为清晰演示,先清空`emp_ptn`表中加载的数据:
+
+```sql
+TRUNCATE TABLE emp_ptn;
+```
+
+3. 静态分区演示:从`emp`表中查询部门编号为20的员工数据,并插入`emp_ptn`表中,语句如下:
+
+```sql
+INSERT OVERWRITE TABLE emp_ptn PARTITION (deptno=20) SELECT empno,ename,job,mgr,hiredate,sal,comm FROM emp WHERE deptno=20;
+```
+
+ 完成后`emp_ptn`表中数据如下:
+
+
+
+4. 接着演示动态分区:
+
+```sql
+-- 由于我们只有一个分区,且还是动态分区,所以需要关闭严格默认。因为在严格模式下,用户必须至少指定一个静态分区
+set hive.exec.dynamic.partition.mode=nonstrict;
+
+-- 动态分区 此时查询语句的最后一列为动态分区列,即deptno
+INSERT OVERWRITE TABLE emp_ptn PARTITION (deptno) SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno FROM emp WHERE deptno=30;
+```
+
+ 完成后`emp_ptn`表中数据如下:
+
+
+
+
+
+## 三、使用SQL语句插入值
+
+```sql
+INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES ( value [, value ...] )
+```
+
++ 使用时必须为表中的每个列都提供值。不支持只向部分列插入值(可以为缺省值的列提供空值来消除这个弊端);
++ 如果目标表表支持ACID及其事务管理器,则插入后自动提交;
++ 不支持支持复杂类型(array, map, struct, union)的插入。
+
+
+
+## 四、更新和删除数据
+
+### 4.1 语法
+
+更新和删除的语法比较简单,和关系型数据库一致。需要注意的是这两个操作都只能在支持ACID的表,也就是事务表上才能执行。
+
+```sql
+-- 更新
+UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
+
+--删除
+DELETE FROM tablename [WHERE expression]
+```
+
+### 4.2 示例
+
+1. 首先需要更改`hive-site.xml`,添加如下配置,开启事务支持,配置完成后需要重启Hive服务。
+
+ ```xml
+
+ hive.support.concurrency
+ true
+
+
+ hive.enforce.bucketing
+ true
+
+
+ hive.exec.dynamic.partition.mode
+ nonstrict
+
+
+ hive.txn.manager
+ org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
+
+
+ hive.compactor.initiator.on
+ true
+
+
+ hive.in.test
+ true
+
+ ```
+
+2. 创建用于测试的事务表,建表时候指定属性`transactional = true`则代表该表是事务表。需要注意的是,按照[官方文档](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions)的说明,目前Hive中的事务表有以下限制:
+ + 必须是buckets Table;
+ + 仅支持ORC文件格式;
+ + 不支持LOAD DATA ...语句。
+
+ ```sql
+ -- 建表语句
+ CREATE TABLE emp_ts(
+ empno int,
+ ename String
+ )
+ CLUSTERED BY (empno) INTO 2 BUCKETS STORED AS ORC
+ TBLPROPERTIES ("transactional"="true");
+ ```
+3. 插入测试数据
+
+ ```sql
+ INSERT INTO TABLE emp_ts VALUES (1,"ming"),(2,"hong");
+ ```
+
+ 插入数据依靠的是MapReduce作业,执行成功后数据如下:
+
+
+
+4. 测试更新和删除
+
+ ```sql
+ --更新数据
+ UPDATE emp_ts SET ename = "lan" WHERE empno=1;
+
+ --删除数据
+ DELETE FROM emp_ts WHERE empno=2;
+ ```
+
+ 更新和删除数据依靠的也是MapReduce作业,执行成功后数据如下:
+
+
+
+
+
+
+
+## 五、查询结果写出到文件系统
+
+### 5.1 语法
+
+```sql
+INSERT OVERWRITE [LOCAL] DIRECTORY directory1
+ [ROW FORMAT row_format] [STORED AS file_format]
+ SELECT ... FROM ...
+```
+
++ OVERWRITE关键字表示输出文件存在时,先删除后再重新写入;
+
++ 和Load语句一样,建议无论是本地路径还是URL地址都使用完整的;
+
++ 写入文件系统的数据被序列化为文本,其中列默认由^A分隔,行由换行符分隔。如果列不是基本类型,则将其序列化为JSON格式。其中行分隔符不允许自定义,但列分隔符可以自定义,如下:
+
+ ```sql
+ -- 定义列分隔符为'\t'
+ insert overwrite local directory './test-04'
+ row format delimited
+ FIELDS TERMINATED BY '\t'
+ COLLECTION ITEMS TERMINATED BY ','
+ MAP KEYS TERMINATED BY ':'
+ select * from src;
+ ```
+
+### 5.2 示例
+
+这里我们将上面创建的`emp_ptn`表导出到本地文件系统,语句如下:
+
+```sql
+INSERT OVERWRITE LOCAL DIRECTORY '/usr/file/ouput'
+ROW FORMAT DELIMITED
+FIELDS TERMINATED BY '\t'
+SELECT * FROM emp_ptn;
+```
+
+导出结果如下:
+
+
+
+
+
+
+
+## 参考资料
+
+1. [Hive Transactions](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions)
+2. [Hive Data Manipulation Language](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML)
\ No newline at end of file
diff --git a/pictures/hive-emp-deptno-20-30.png b/pictures/hive-emp-deptno-20-30.png
new file mode 100644
index 0000000000000000000000000000000000000000..89d755a577155858706400d3c698c55444c8dd15
GIT binary patch
literal 28214
zcmb@u2{e@d|Nl*rErg=7OsHg6L<&=6D-yDlJ=ynt9aGsVgzO2)p6qM3$(DT&F&Jys
zv6~sQUH8Rj`ToB5|33Hm-^)2Nt~oQt`+9GW_w)ID_4e^2RYv-Y^b`~njOuFlbtouK
zI)Oh=(Vhaoch?x71Rv;J)t-7#P%yO}{i93}X5s{&Wbsrs^wf2+_VlrEx1!K>wsW=c
z@U$}F=%1#bxJ03T|K1bdPaBO|`RmWpx3KahcU;c6uZKN1yDd-45#QJJskuIG-#uKC
zVc@ziO}WF9TbF$p2PA(#o(>q1^cgORzLd4_>4b~xsSEcRVfUMZCxfe-wUt&L33+A5
zXpabNR2Wf@0{I^Mifj5O4sN`;5##u%7nYj5K2`z#?L!j_kIaP`2l-u`c
zc|&3z9B%rM<%#tifONWifcMI`Gw!ZLV4wpyTs6QU$Xi2tf
zbNtP*{JI^#CUdnIQ!I!3$w8wBSR6A11-KfN9jJ-6Z&a{oK|=yF>Us
z2YeYo4*>nZ;Q%lOL;!UOUjQRu844gj?!O`?0ZNI*oBIXOb0id*xJ5+Zva%KC0XP;*
z)*>%$U0xg5!j%N!8Nko}%tYGPdq4`nb^-gVY)I&uo!Ocle2p`^1PLG8$@2YjmYx*+
zK^(mE?338aB?K-GfdxMY&&-_8OrP_%1+!Hd3f}xolAu+#GZ34*yr;o=)Pu7V6*j(O
zi;c#|eQDDvc~bJ$U)_4tIobDIa~S{b<}-?FRCC$?yH^v*m9e=rMjYXt46-LyAeWi(
zs_G$3NJ-vxrV9SbExWzG4Dtymcqe5&rPbn5hn7U}UcGanH^J)?=d~h?pMG#5pGDwS
zAq!J-p=cDDrH*l6PqCmTBMUabIf>xQrW+V@bH4JO893~FW+@PIMu*ELWUM_?@?QVN
zpq+Y)vof6k#*CzjE4t{x8vb5!t>Z$K>vhF#_vb-=D;sANJDYEnptXm;!E)2NuJ1E{
zpdl?(X2P0jc31=V@^HAa-|v!(>^?uO?jM$M+1Xh@`ge!Nhoez;N`!Qo4rjn}0IvM^
zt!WY1In{rLi~44Q5x>)}$gbJZZT+PgD(rMJ`}<6QeX4t7hUQACJZG+5>z-qB9n+nu
zjIRve`d(pBkeyAmaD#~nmc_-vuzIkU#_g5M
zOq0;OH3OX;aVXESBq%HTlP%>4+?;*
zq}4$|EQ&1*_><~|i{6@J+E6+hlyt
zF#tlQ3KBehXB1C!_B_zE0K!4Lg0>
zt}~eF1|XZ{{!=`(TlHp>ywtKYoNmN)+=XP1+%32RXu=g{n4m(#`+-IrLAyQ)Y9o8{
zy7&{@lymFemw7S?)i#8>m*SpCtlUV_P-Vy_()4me%+9uu;6>Aqg_R>M$XKHIRvru1
z>=L|ezeW@xiq-(~TcKw$qnc((Jw$r5=rz5iyayR%H&@_IM^%c7Gf6A}sB~$>oT~#i
zN9t$Erj2`0m_O$f3aLe|H@L^s479z;>aH0q1hV4{m169F{Z{%oGnv
zCHmQaXzQkFfggx{(Aw#SV^`AvA)O}F{VnB&T@-9m1l59lDn*oWF|f-Eg>!TPyFu0J
z2sPiGH52OwKXRN=6E$%!)xd>+haS*-MqWfFYzd4c{Sg30c<_1UEg11mz?+o1uQ`D6
z`c5>$4ga!SU3~BI{7|h6f)3c;iI9>T&9?lchF#$gWL{Yx
z;IVdgPz8C}!G6LERnK9zLE=M){C>+-cb(8kg8|u}Qe!KfB
z7}`+t*^69}33RB#QkBa*_#xDEo+uyPCx0KN^FiX+
zj4Td=!P)2fD8nYM{pb_ek~d~+rQtB!XZpDERY;5nmib)hnorbfQYfaqV${QP{uTa$
zJ|@kjEn|1PG5TpjZr_v$$p#}h2ZghdwQjTyumXhBJ?d$_>+Z5&w!dB*+5fsLI-jA_
zQQwSE+t-4}!C=qun&^yfcMLk?l_{3~59th+bX}^pG?!{$C6=})(uJw-JJR5$f*pQO
z{i!W*0waD%%vyYt5nYr0QJr&{MNC9P%)e}64?XC5g<`|F)T%XUb`ZNI*P^`aiY=KR
zT+&s?vBo#S={%;w1CYuNheAppx5Eez5Z3+E&?jfVqBIAf==v8oUsVvt{n`e$GcNCT
z(50U1=MM^lc91y0AuICa^5zvgz{#aj4cBnX<7y&(nKDj9Z*1%9t{y%wt5v$1hUS_Sd9DZ(UOD*}W#)BnvJ9W}~?5)d2ykOcKLy
zGd+cye}Fb($rrTtDQkVsh0Zwz#WjfoCx!l;OgKjv2P?jm(PyVr`2q(mK&IOqmi1P=
zTO;r5y&F@cghISZ(W@q|ErM;72+Sh2wvXJXu^>n2D&xJ}H_4e_)JWDOaqgfk42)d?
ze=(VK2rrFA^wCV&1SIQDs9r=qH^(d=lG#KHSH9+sKIyOM+a*l^hEs6*P&g2hA^#AY
zQQ7sb4^>XeGxWWL3VM25?~r|azy^w3$&lVndW!fs15H@!MM7Do9D*vTf6Dap8&|qb
z->SLgK@jT@z~a}o4S2o2xqxHtsI?;-oa2SvdHuwUL_iO7a4l=RT{J8?JWmp3MpY5+
z^oLtiBcs@D%WwOSrRS8lP%B>7O>z;shoe22J*U(+*A6h=6c=2S7D$Bq0EOq9;$oIdmVxrVJ?fgrK%
z$)p%ZL+B&UNo+$VN&Uha24d%LZ1Kv
z9wWB`$zwzZfKVLrq7{Ec*2{gv!APr9N3j752lYYR78Jj!`MX=p0KFxs|
zuQ>rYO-Kncear8aqp1?fZhaNt3rhd*znwR^`CkI<
zKLsFXQ8p-9M}^MS$KhIT|G&{`#}U~{SBmpalm>kQA2Uf^#T!|q*$2mze0)%eIi=H=
z9W`hXz|)ZZ`?kKvBgK}=q}!a<-H!2teR^`$f-LoXEHh(PSDp$4D5@n_bMG*+x!alB
zokFCrq>911$9OM&My8UhJ`KfNzuQtSVY%%%aKG0w`vO+W-Sx`>szUSI$2U?0<)?Tp
zMg7gnOsz_Y;10tyQ()z8y_}Nw3Pc*|Lpfa;I|`@0u){qNCit`h`*slRSzj#n__s_h
z);zWA)-Kvi8g4}rkRkJtOCH^G1D3j%_ZOfNIi&hItWSU7^+WL?P^f7SsDWz?^ht^fB06NyYW~6C5nxt0;VSC}=1yeMXsB
zNYfrn(+y_ulOw@FMR|34_G9w~y^L_<%OGf2^-9SMToIKgY3Pb^fk?~Ge8Ku0
z5ust3VrOu{5$(@`r&q%7&KEOl&@>uy4sni3S=*_S@@diMI#hi=VHd30z4RXZs^dp|0DduKX<5Hp~)Xgn^$p
zwa_(kM50#hb1%!#fwDG)!y(tla`N;(f&T~Bo|*R!&CsayqTFK)D
zl|-{HUJ!Hfs#A-eWJO;``e@VE(H_EvNNEM?H;tjuC&@NRE?N(8;QUCn!u=PhGTf?6LPJ3Skx?^^c?AGFUS0OEVHJJPcyK
z51v#Nnbf_3X8gl$T~c;bg9igGv_d6gnN)%W
zr~2jOerz!r8onfiU=vUj1=JmPOU_LKUm^;SKYcBA^MZ%kLUW(y2lij}`=h=#!LaD7
zo^ChtprOljy};m1*CV|L1aVDHOQ&~Y
zHjWoVx|_i5u48G$d=#pY9#$p^)!%tB2@NtN6=zKMVlwRK2RI=G+J}g`pie%;@Gta$
z*cXBDB>`L`{8JVI=`vsF6hwNHr)2eZBZ0UBcAlVCdz^GLr_>TRdZ9bKJM<=+8pJ@Sp{~5&SzV_^tB!VG2=~nxbWIZMJKE=bclSk7ud`fAUM^V1l4BP?}DiE2ynyjqv4JsCVkcj0m_{Dk3d$X^j0
z38IxBR{5P<5|K}mMkDMUvcDHZ;8nlE)ltT#aZ8Z(t`tO4uHr#*4s%hB%@k|M0d#
zz5AABd-^e&g~4SQJqxqUk^>7;QdwP+B~X4?*aDBomh8e4@;4D`han_edxQ_TZr29I
zW41_BsP8?GFr?>y2t_G?`vLMHd~6p6tjmximRvF#cWlfEO(^=sRs(U%I_9D(=PPE7
zBDr}__{cS{9Gw6~aDCa5RVybM;-9pyE($!zydO%w*TshKuwwxENRgm(ZK4GPBt=4c
z$%dSrQf5ebw0i0@g+tB%P+j-V>E?}p)iHNz9O@LHKSk~b>B}jjYQaM3lZI9NWvI^>W<6Yvele0`Kzf{9uv@~|$Y`Wh
z?Q9cS4!>&%ZB!#^{l1o4V{sK_eR*F5Ah9|iN7j7l?8Gu5TzSvlvZn8l?lpR*z^x;E_XU2
z7s+ANbs%(WOJf0g?Eyh}O_h4VK?ja8?sL
z#U;1#adS<7iIz+6ueWqw`zp{8)#in4->+g}Qsj!f%3j&8xsf?hK6!p~_mW8Q=jN8)
zH@GZI^Ix2q`Qabx+{z4XGhtUY@nY-|xO4NlRDB=KpWCfC_D<%L`0q5dnLv`6#?TK1
z0oT(F>2-r*8C$IQ{fQMw`hpJC)I=Q_D)NQRn@OcnyH{G0VX#<{^Bt$B6hmBWMN`o8
zO!>uZNB+l?s#ZX`2qCFdA^e~M)>t;ifrrs-W`{pb*tx^M?|n$syvr)l#SLB{
z%ou%zY|^v*BYy+oM5sCd$Iih28%UDi@v_xVvMzaoe%uK8co=NQ#e6vT(;dI)Gt?ul8YS=EWly*b7WT@KO
z_l+I3^X-e@QYbAGKMgW;VxvE8+mQ`U@w##3DoamnKw8w39lk%?gpUl(Dl`tfxjSFS
zSetMmk}FXZjSv+)K>B%7qJ_$+*Ll*~FO|J6uEX(Dy5=~|A->{j9s#}cE?h>F&FvuXRO*jHwQe$RZ`rbVgrpQiYE
zT7QzgKn}RZ8st~toQHdy4!^SBtWb!Cko#X(k|`zpO++M4ujR_9b~LtM+Ido5-V;cx
z!N0UFXFjK5@RV+)RXQel{|e2Qm#}xg5pvBBVn(am^Wn7I*fixXDUbQ+OMSBVO*9ia
zSSTn#fh)YKT>p%;e9$?o)~#?xg3D+S`gYURs=Y$U+`u+fWYaBAl}_F+XH;|+jIS>j
zug>WgReh&@{S)O|P*?kH$YX7Byx?^#@Yc;OM@s{5oHDU7A?(2gNq65EH
zpRZM4|C66%K+&4e8Ao%c`XKka;
zEw6tPE+7TJbRKX!lrkJ0=o)dg)Cuw`R`+?G*DvR89TPlcPG7^;WLLfQGL-t;h9*-)
zw?g|yh89s`Y=1BNbvSaYe7<-%Nn-1c;pyFKrNp=JC@H7ND#5xteJfw*4f5bKJCJlw
zg3C}4TCVBp!5$lN2HHPFLd)!oN+W{WMl#FqV;%$%W{8-#QW@_AoL
z$;;iPno>=FI(l|@qoRm3!uF;}+BWLB!;s8cP3^l}IJM@;U`C06)lal*eb-uGBI{20
zNh&;bU5c=Fxw9qnj9A604Soz-!C|nLlstWyg@IAe3;W%%3W@(V`D3|7H{Qy
z4__tT?)gb+rx;$KsxT+wIn|Nq`wugD%ipTJn=YZ%nEbQUQY7GADD4pjmUofwP30Jt(r&pVQe@`%b6N?Q<
z7Cv5GS)ii@P(T#1eQG3)Y8FKmr#M?k;!@*j7i3e@5aO|YmCG~kvMi@>E#TH&xL}}O
z2`_``xO5QG2@sPv#0@Y>*6&?zhMWN-h43_Ech2&IL>m#M1!L%`K4ysK_B%JDXHkPwf2PR(4`y
zZ8!$PQUYr&NSDujAas2-Q9h?-EFL(G2}H&>y&@*)JT
zW?W;UVOD~Mel#4sEfbg;r1&P4Ny_2%+nh{~xXN$TJ@%H#dtrRgK%PwK!Pe`V)LkZ6
zU(1WLx3h-fUHbX>aK_7<_>14V>R_&sEc$)HI$BKcYVQd=%V@!m@rW64IZhz9W}){0
zmNA2lBNZNV@bj723YNPzj>p<)DxGzSRQPxa9zl3$^ww8uXX}|l$D`>b)o#fSVv-5*
zo@W)KEb}K8e|f6+736^Dl#`?O;uPxw1(DCLIwdk|Wqp%PWo&$vLTx+lUS&+q&1#1E
zn?2UL81*j|2|ny7`P|%YId)!76ZA!jz27b$EGBQHeSTylN%d0%rs$0Er+@M2S3&FY
z^Lpv~+lHYD|W>
z$lE;S&+u#)%=0rB5(@USyUwq8xy&gl!R448ZEZ5HEB421JMH&U
znD?67aXX46y783Wh4|RL*S*|uBFl%Na9RafrzuxE1TW+-BKb(zo6OGh#cZNaJcBby
z>i;-qFJt4``7aUF_~Z_;$E#ho5=U0-
zfZ1pdB!Brq;@}qmLia7?9juDZID!IDcNp}n@+9;#d6z#2HyXWdgQHY2guI!3qJY
zJ;@k;-oMGm`7iQ$G=Zdl7izG>qa`+s+8%)y-W!Ep`aLQ2+fc#rn5sTKeJi6UBrnT#
zEG0dv{qUoSik-dmYl+eRRtlL7+Iy39W^Q(_w(3*z(;RV&8K2Vgi%vcwtUxgqp)6N$
zDE<|S#YG42W0><1L^au<*C;}VY#oAhwQ2Itc(m{BCyAY=vAI!Y(#kSk->qLVb44-96J2CC3v!KJ^V|A5rbM<
zJR_5!Qw{P?7>Y6n_@MZr3OI(OAyE*Ls(+k67M8%Hb|vJ{-`zH(xMb3smklF2i75QZ
zks?BfKBgB#S^i2fKBta$YG=_OY2F^yct_PuQc@p62hpwk^Imfv54=_I7g!gn(9bT
ze%a6}Vc$V{Y?t`sY36!tr?DHj<o0SA5#y6F?N>UHxW+A@i>g=
z;8EibSr3?zGUu?hUb69x!0@5CJA5whmyCiejA=*adypfNjD8jr|7@dvM|~@a{B5ZO
zddP^wZA3u{lgv=YO#-CJ|H25&w#ZBPEsRx8Rjc5Bci`?Fr@#x*;RkzMFCZDjFd=RF
zD?*?{mHvO}P%W!-(qD;(X-xjw?Q;3ox;vxu-iFrN?A7Km<;kiLFe4}ScSg?EOtIX8bjt~RB*d9as1lkJr2oMjT3*H@Cmw_d
zIbZd%)~#WxmoXCPs($ILx)XDhwA02WHmR(inB}EUdIpRX$5{7nRy!%?UNm5tiI07#
zl<~||__7A_Jx*W$;^O1`>oqp1hMI;9+|@RU*3=rf0UiC#(##r*b#=419pavMwqv`u
zc28?pZCMeb`TTW+6>B63=-Jo#FxCSXB?J<8H&$sSxA6fgvXPO2kYGqej>35Posw)?
zHN3^%5@c$EIFph9KD
z0EOF012eNqiV&q70UFf_az)UGcmIpvLq&0BaI0f*%E(h(%++nEU2)yADe$XK81wBa
zKbmAuDw4T(D5rupH^=-b?!M4MFV~78>!-DhPS9kE*6&e$ZtAAK9L3&^7i}YsMcy+to~rhj&?&iO
zlxdIZ!9X6!7jWAAqIdKG?Ib0FNL?n329$T!)ko=n(gXJKDQF{&t+YF&PJO
zPgLcRSt0K&knQspvf2LcA2PbysNCvw2OXXoTJe8`o(wL_5SEPm_w;TfudFpC%A`D{
zZA|oUsW1l%4k99I><{NmMA$Ee)!m&H2UQ)bAAcc@QeelAd>J9R6#*|kw{e=>U@uab
zgF_-3DuvxqLv4xywV$NK?bj^v0Lv!4$}v%tg2uB`W(7*r=+
z_77rXp7~3mQ>Wi&N8l+`-Rsv4yNbYC)2N{{OghC$MjuatO3YLqw!I~sd0Oj@bM(B>
z+XcST?>8mQdqr&1QjH0+(PE!Xl#8{);emz}X`Hm6ig2^F_4bXwjjGQmDMmMHMll}j
z&ETt-Hxf9^o+Xj-S6MOQSm%yAUuG-6*Lc+RKr{-3|=`A_)S4^AX=n&vP
zz!DgnRUh1GxrqzG_ty;Nw7(|((8dEP9j=={aW=HNQR(h!Ee!pl6^DDb@
zl3*P01;4Fe^i)_Ql?U;zd@l8fA0O=ew?t!q)G_CtK<)TThP?B9xjhUir_&d9?fi1p
zIO6gw@YxUTeJM&ME)*qcMZZ31|5PBy+NMeKkq|OFy&53*{m>}en_bYSxk{GYD>jcHQk|}T&Qo$P76iqGZYyypxwIt9%Ns<0jBaAzXHF%
zzzjbm2!jK
zNjS)t)aSG&Pr3|BGtn9se|WQDC&R<;iX4ASlNY(&&+n_)?Dh|u*qbS>rSLtxU)tol
zL=)P|*?1yc&3(8;`&P7TX67~vvsD}?qeN8WVYE32$aX6z4}#Ufi^?q_uu<2h5HZ1X
zk%LCX)^-QmFVzU9-hpSr-WDg?9Sbp&NiP7M*;C~U%yg$V7(68nK8j@BkocHiL(9<*
zpCH^hz(uFk^+Z4E5a5QkF-zb#K@$<9X-ycws|#gMs;6$RD{#`B46}J>teU9W^Shf)
z+4nD~I7s)A|9$pR9+bW%xVA1f;Y4F75+;q0rp1WXA;+Q%g7+a{clMO2
z)+;h>QF24EMI(s4_Qvbr$5lb@Rhr4EGom6z(E(yL1&O^FlT3pHh%$l0T>?avwd$DL
zn^{Jm9z-)g0YCF1zNduxT^qY_W~*_O=xfAQ&E)GVmo&u#TCDklE;up^PXX6Q0&J}NGpW_Xjt~8iC
zl3JMjvg6~@h)Uqu6g-%c#9$+Pfx2P`4ye+&Chcp1I?QG()msy7P^Xct?H~C0!wRk$)Aw7R-b@9_Gl1!PLEgQb1$&p66=S_|5gBiU
zf%+Yae_<{ui}RLE!f~2H;}7!Q?PmRYjuN+SLVY|GH$XJ*+lZpDh@b_8AsI8l3CC1z
z5sL0A1RmVTB@8}W*WVrOdG7z<$~>I2a||Os2(C@(;g^xoIa+$39tC|l`{2n6Bwj8P
z{;7Jf2^3t!LqCXuG6<-=9Cr7|NuPaijgVYfuoQ>-4|Qa74V>wn`BxjU2?m_Dw<@-{
zq#=u*`K@{Xt(!P%Osb6p_m$+voIZ|u|33}V%=xTR-c?J+=-9N5S>0d-8Dlv0?Sv3-
zpV~!fjjoBoEX9wh)G){4Sngfm%%o^8sxoPC9Cr5`>{|Z6
zn#)-dTw|+Qdcp15f_MsIcOinf^Kh3evv0Lvur?r1rpl^>Pwd*^NEtWGdS`0_197{`
z#F`S+Z2JRfYmZtChgr}|Ko8erTHH50)1cjxA$iceWAIkSZVmFcd
zK}kWog0-}baL$LA4_#=Dl=m4J>Ns&^S$PWFg*S~caQlo)p02YXPE%Lz$g!t$QEp0=
zZasK*o|=hu63)6-Z)j^d)p1dpp{B=mnr@1GYv*pm81vO1t~_aH_*7rj-c$9Mv*(`5
z{{3hjW%a1xEL}#Z#Q^XiY=}Pvo0Np#Q~f&WfQ7o;c_H!cD$_17x5L@1sZ!37+rc!jFbS_S9%H
zAn-1tob`45uYat<7mb)gwQloDT&S9ny3?}fW$OiXygGCYlL(`1~_wCIb`DdlqKd-cP`0t
z{NV_emCUxsoRB^o2)z02$p3z@$$B4q7T$e2V~l+H%9@foT!^*lH3536AP4?(+v|?F
z>1t~Fa_SA?M+xcWGKAc!y-++*OS*yFnhJW+K}-+}uj>&1ii^mF{Ho|9KofC=!a(q7
z^e^A;!~yaq@XJbo5OjTyG}fB|TLMoKfn{XSy(CAxAzNMU{lC(iSODZ*j2S{OkMCIV
z)XUZG0Ykw@uG;7Aht|hj!asiJh+wQlg4t__DX_6FWm>P#5*CiFssY`Sq}p}cQfrlu
z>@U0FYI|pD>74A3!G{sq2QJLrRg3>T!?V$5LcY9GqE5VMQ8Mj
zkaJ^?2DxlC0jeEDWQLwp02EB~#jglxegOkvm(S_6W=FM|KzHtIt$I(7eBH$s=F$yzt4{gE&Cy{0r|61TXUYv)?se*X!iE38K;39wK)tg
z_^B!cGaPuvpPl45vS6Ss9oU$UHmeT&2m=HLN`gY5t>9)lKX`#R{Br$KLzfDIhE+_n
z(2sU*|0(@TF2P+LJ(5di6?n;FqAU9b%Xb}D{sxZ2wxGbv1C$8|2C5y8P@~!#k|6dn`E&1v*-x%g>EHuX`cSd+3-4=n%qh
zf&Q)e+7}qNs2OOWvM8LseZKEoTdGh(Iv0~3ApRNYVXVNYf8ekyHRV1m8kBrcO!Lwv
zTKrvG1~lktTH#3AY=I<-H~Q;NtUu8c^rYCUNIi*K6*NyXWxnnCAR
zA3x;_xB?u;AH>Dy&8w%*GCtdVsZQ|{)Km_otNzwhiamJd6kGKil>_fXSf9KBy&xC&
zPVEoR;c|#bxex&{$Pwp!pT67&SM%@-Dp1yc-ZwN(fxfXMAF^{%ci+vY(GvGyHv5P3
z;y$wH`MMhIM!YdAw&|Uj%yjFJB7Z1A`Q&e13YRC
zIoJ4{Mo=k++dX)*vb-9sME9HBNl72L!#4&DxcZ^)8xGx4u+Ke&Izy2_6+-O6L0lz~0Sp3h?_8IhPC7iuCzh^~g12*=
zRUBUstet@veX@{zjy~b)r1`+ZAZ4{7fB{y7l|wzOp6kXvTrBypquh_9wji)X-I+w_
zok2W4L14fdEDEFR3OhI|4x>YBd0RoyH2+n%7-N6c39M_|o4wM`gm{>7
z|KoN;TVy;a(^wgDR*SLOUE5!zJu`?ti#T(X_RUq+!w+VBc-~#B@W*Ai7o$}U4+*hD
z##Xn6OiA>=Cui+4>*0I0hbVfa#S@bviD~t~xeZ8&b8&HnW=iRfG%1({DHm7nL<_1j
z=!?dW`-8f1qp~5+lZE?zZAb~;zBkd65;B|_#NP>Xdn4kh@SkSjT6cB_HH9g`fa0@S
zr3(@nj=5w10GSc<{C^=6byH!_-%3BqpF@0+Y6ma2@ka1p8%KcKP{uT
zYYQ6s%3V{po6}hkiXdP>f5%br{lyd2sH33o;-ba{pldIhZ?)dFYCQn}?GZ3qbNTGy
z9V0+^5K24!vw=#Z?p2UPeT(KC2KuYMX2tYaW)B_f_{7~dF!0*9h%9Lg2BqFJ~p>yI3@
zFit(_6SNt6NwuK2sbFU?sN)itOxr+_<8@=fSp0s0&`AE02IpU5&jXPP7QFoJh~}U4
zwC+r_Q=U?Wpf%GAW-2ELm{2h1;`-9_?Fq1cXY%~yRZqbi8@gG**#{8cK*N({@Hh{K
zU4Gwy?;~DDk?$Gb3l0^yUqj3khP6(o4G6>|4`onnr{PVy6y!fpAcW!@{dvpVIxH&6DeEZ9
zvhco#l{4&r=3Kh(iwmNmeq`-SuuJU&<8B|%e4{LT0IL(K&q^|^2
zN+PJkUZERgZ*MyJn<-(mEH^kl$yVJq60#)zm0Rf-PbzQacnIax^G%p(&i8s1F=p$5
z#A~;ed~w7neHbAZ<<}F{F6b|__l5tctXCrCk>025Vg&AM9>huSUUc$#H-0@l;W!pj
ze%pg4tNE<64G+&RZyFJiAFvjJqW`cbD2q&Xn;v7pliLn)auwNCWy1`v5+4n1nf=u4
z7Fu^7nmtsy2Gv_lf_oZMvEL%Q3S?b+p4vZ@-s*)(batSHL(M
zpdRFxe>l;Zt3+~D@XHEUoByNN(ZXjD^J@+>Y?8)K2
zzy0Nma7|FXC5U|2-+3F9ROW>6W!;5+J4zCB<#%Pga?~CXziv~H3^d(TK5omu!>{9q
zE$alICLxUjIhhe7dYnY@@1EzKd-v3gImO%HpJt7
zo~nl3H6~n$hM9o_?H#Zs7}$&3T9|CO1jaB1`d{X+qEhIN_njqLn*c
ztGdyM)%;1s*Y4$pU1P`h$nTDRjqO3p%5cy?Rc8B|wsU
zHMM#{cAG8fK4=emE
z!AhBUJ3&LFV958s`y+qnegpD}mU;WF;uOE@#Gf4A;ROmy;72ab>Jmbvq5)&J;?TH!
znC^skUsw-~pWH~*?|4o&83xCa9_xWPQbwjpAql0h_#kszb~ULFK8LGl+Vlinn8qNm
zNkZMxI!UllDNCo9P7fxxIb@&B^i{=x5+IK%}A<8cJ
z+NEpV$=!e?CKVAVknwb!50kxBNT|Vp(mqK+WZ378jE9pYfgt3kVuWClJJK3A$&Y^)
zUqr-5nkB%i$Wvh4LkQ@@G9Tc+uVUeoPb?slTlwnyE|ua15g>$oVtK~FQTwK|h`Kg{
z=2mRal%0&bCi71nUe76$0g08cx?>+AAm3f3=&p~0-Uq94@tK7#>dL}Cm9@j1Q`l7!
zp5~t|exi1&1wHIj$5u;ndwyZ^*|DF(SRK*vIz$#i71vw`1B-LKl0JRv+G9S)0?_5u
z*uQ+2z11>WY(RD0ZG_TTCOw1?4(4tHp0CCW{f(*$}9mmapW@%F5+G8
z0i9gXtV1lEDZY#u?bA!U;$x7^I5r?~bXWd6B>SIKL=JQ%&a$;RD-~1!BOwvD^iSe-
zQ9j`gD1DmPCJjjbl0OYv`Fr#4l=!xAjdC
z?R+en&SVio{X3`Oe;oIjS$$xPW7*+3bf8Bwv|bxw34%6+!$u74#?N-oDP|HMB#&nH}p^NXcFrawOR|Np`8{5
zNTAEY4Xh~Ax8%5W%DN2yknmwG-)h+UaQnuC-U%>$(Y$2QOw~v*bR72y$IWEwtRh~Z&uF7AcGMyBY_*$)vaH^uK
zRME@~pFOB}|AB^z@sUe`dWQ-+()jSd@*Ubp$5(VT>f=44dap#E7vj`{3nqe&qPO?M
z*$zoc6FcET#KfJ#UBm$??I}@JwGRH`eTLR1IXW&4twcy;2gL{O0tDDu$HhH0xn(r=
zU}2cQT_Dz*Qq;yTS!#Kuz9tsUu$cVx=Hq$#kLxW?W=iw2VmCPo-TZLU-p5jcbanF4
z|DC{*&iqO}iR^acUt6Uk&@WeGpEU=b{|2XZtMplPA$>M8#lIO@36T%bWlDy9w;6^X
z!+07B+boZpt>)k5PsO6IgD-OSO!)9uB~hXSI?|Mb;WQQUFNf!Y3uC8+Z6xU^`r%X+
zyPp-$4bN}c;z0-jLaTVUwSx8Qp}O7^z%l
zn@oz&`#&XMI}LfR{#ApM(Ww=V)pD(RI5p+@Qn?hi_~55a23R=Jzu_Uu&F+o*D-X3@yD>ssR&WtW!4cb7P^_Ia&R+cT(ko*A&
z#$tNO&0uZO438xJ7)SWhqPbLZ3p&K*2KtV<1!dtb`yg6YEaQ|gK{GuJ{2kXfT7!04
z?~Xw0FUT2JC7y#PkUwthsK(+(7n0l;IQ7V*Sf804nG8O1tbC9HnE<8st~r{D-};Nz
z9&P_h$=heC{HOk>a*?u4neO(tBPGGUQ+r;nh1%7xpcy8$O{QBpoyGjUIkRmLUno-q
zW1O%Vi#(NFceot<#vFE?v~o>dq0(g;;+2hPS#jdJQL9J(J0JV8e8%<$KD-px*?u9j
zCNOmZtR#xXHySUUm6dGwH4G8PtMTVg2kq2M9|c2h8{59&VfioyU5tjh&x@aJYQw1{
z0I#t=)jJTnszVxC5ibJNjvXvgx?HZDj=6G92c4~nJBW{>dK1c|8y(o9w^AD|8p{!r
z3)Zs7ErC5DJ&86CeZ5yoQE8iXj_22C)VGk@s+Ya@0!p9rt~P*FDOZ*?5oq0Hv>mUC~QN$<}*+yBjM~Px46v2vLDGZOoik~64{yT
zN%ozZkzIC@7>wOm1~W03_4iDjbH3+Xzu#ZK>zeC&<}Z)udG6<)*Zuyy-=AAU{=bAF
zcZq%@LP>}@?r0am%fAe)#`-hhuY{lFSVr8faYz;RW~BoH;0wDLm@CXoA=Er~d9Oy1
zI=^xCN^0gtipo`Kcwrg}5196V&lu{AxZ6RkY#T#)@X*9SaLszO2+?57&VL)^riYgd
zQGEbo7Cy)-C#34y6ZV2^_=Qjo7(i2)>0S|bwq)=QZFyXB)KxXBwV=lhhJGB+uBs6q
zM7bj&Ks%qOre1jT({%w1)BdpwNVCHxN(|=|1-uiWWAFv?lC3uaQ5|abXp#k~UlMQG
zz=$O$;nT>8bFrE?e_v(9*35bT+w~biRPGY+b;gaC$ejR2fnwuWEhl9lH1Y%>z50uy
z^;S#H@Od1=2lKpfhbBTSd@k-qnaSMDLfjyR0}X_L6c11eId;7UNcsX_mgJnJJY$WPYT8@t0pKl}qa>2a-J{37FH+COyy)E^F_=S`s(TX8bi{e>e3F`ghp^|Fuc6#5=
zplY{N?ZhV0r|I#Frb81w9EG4$4&(m0c;!T7;ux95h_~xt
z-f`*AbgvbyAB!mo9=f~@8E&J~&wNR@+DrRR`3>LA^OEY|`9LjnOuFCN;gQ_cUQ~sU
z1qyY@U?9n}fZn6ux(AydM-8P3gI{^2I!BB%yQ;+|HT}4nb~CVc+ae<&sTR&zhB}ij;#+&
z%nRX7zbRMN>tWqtI~BS|D2iidil6N^^1Xv%ji9Os&fnSMNoPjY6E%}4bU0#h304gF
z;XuYEz^f-M<^`YF0`3ZDt?9{rrAMP6GwFTg$>aCKwtpUC-kVJPO`VQ1yd$AZ_>JMO
z)UfEwO=%!DoN!StUg+!=g=fM5RLNOsNO~IGrqgnR{~+~Cn|?Z9|1Nvoh6GOWuz7-GM`<97T<9z7tD
zJmYHyOzY>HGEQcF7S@zM%J*R2TX-V$=%@$(@Tfxw4<(jVEuRcM(0A~2CTqtXhE_QX
z{=vzHHQE{A@hf#%9s2Dy<(@%D$q~`=5VYN@`f;DCFnJnQ}ev|J2F;L=n0Qu+#l=
znkp5Yy|H^^D;!7M>1B=kj$Bd%^D#9G?Rjnu4JlFZiOWmuI(KtCdN+B8Isc_#bcrhe
zf)d%3&zbCdMdxm3w+4nst39tdWcTMwBDNX&zySS;F@)adj|W%$10H}`js+*7uuc
z1YQSgQ{sr`nr?ibvi=lRJ|s2~dP8bl&NcNp9j@gnSlhCYy+k~acT9sL!&v1@5n9E%#q^TT3zFWsABhI$6Yby_VXLM-U!K&l2b!Q~e(XZ&>vDGOvR
zHqz&yM^$M0ZBY}9uI!-D!p6|ov{?ZGsdMqG#eWS^L}x>-KxU#2GT#hLG#ZOz(c
zwBC$oS%dwQM2lp@WrTcJMYpGchYdY+T7Q^sfRf7TmJU+h-fr-UWb@I;~9@}zcq--+k6PXFoqP6z&uk_zkKHOKVwSgsz3xSL+V^ZmW4Ywy!tzbwm_Y1
z!tCzO>co5-T|v&Nezyb%Ee^@JH`mQQ(tiE{vDUEW8?>Hcr2%=gH@ZCMG~uyRj3=4a
z!CmKEkaWVTEdrBQPc}_55m^W`yV`6T_o0(^rte=_WDRXKc8^@n>nJ7DYy0QI)}9dtJ%O|6GLBY=04D*CWaOuW(f3gG
z;r~T!=Jyx64Cq;Thp}kiwB#Uv8a(pQ_S@12VI2zgROtm!%=KBDJ7
zPgRnyd-`m`S^OezV&h3m=OwQ0tJCf1x4Gc`tO*cpqM!u5>!L*AEnn2sEMu2Caj@1r
zt;6FIbnxpV+Oay$LJd2rJI-*W)bKu%q-}}jALp=ur)52aUduVyJvqLv&td)$TTR;5
z2+x~PAn=WH)$dLeXpN7C4)0<05zC}l!xE1}wleiablG+Wgb+ABihY2x6eP82Oc!c)yJ+WZNy$
z4`noe^z+z>9>oe?TAu-@n?X9}6pzv$f+cQ_-^`7E)e%
zD;v)_J$dUB8>uU&=o5{aX}LhIoAh~b>>(t7^3>YUmiWnWjK}NI_DHXZT#=hT7!EiT
z@uHp4j`Q3J`~K=@#Db&7ol#TExdYxwc=gp;=^Sv+bnLoDubMUnf?Ijax>^#}77&6s
zYwcMBvcZ6c&Sj3ptkb@o8NBUXXZ@D}P=%MejFQG%e;@k@piF;Dga
z?4VyN9e8^E2KK}>g*KKVJ9gU22ALNPS{&%vyFbICCr!$#p^51);P8#D#{C`C5L>|F
zIM!HLGzxd8Q1a0p`7`xD5X&?TmCUG_f#*xb45agF=~n_`b`)_$zMSgz1bW{E^O{S0
z80xSmaek=toiWinfi!r9gI!otyis%IHP0j4gPw0B&+n@ZVWa
z7l)R+>dNF=A;NIEt-QW)nTBPisO4qG37x5TOY)n^!z(m&05rBwsTws0AAHIRHdPYL
zI%9Z!R?#HdynoMN)w$PT~zk974*a!ey!b^XVa6mv=qo$=*}~pI1)w483)?C
zwoLEkBZ6YB_Qq=G_kGXh5E#8SWr1m7y`5}-a{s|+l4SZZr}zxgwwJuMQE?#*cP
zddRQF63pu26lDm?flTK_5?R-b$UYsBMV2OqH;%|{5tNrbzJsk9(o3=4mWzy#K2x6R
zi8lg+ZKi4{=_dE4g~xdbwIIs3jY3!=pM7RMI=Biv|03OpBHFv(AW0#AIas-IH7_`9
znX^4QztpP|#($A=F$A75>7jbibQ1L{e*>X)t-7@nxi}s#Ak@?)(1p2XWi#DE@fpZf`+;`SmvJ=n8RK{e2iZ1}r!RHc5PQ-%C_V?!k6So$DqF)o
zdp}{L?vTb=Ufv{2J-GJ{-p?ESqR`2HtBEGxcQn|l;Si2aN5pFA)ir8N!#55=4*Nae
z6zCUrTHlz0EvbwRF-K~!TF)JaC`<_{Oc>dY*`d0Jm!zacqi&+EE)DFuj?+tW&y$Ms
zvHlckopbh;&F|Ft3Lj9BUE8qzjH*p7RM=jTlS{a8%wJ>mGcZ<1?|c_BlKNq#u4VLb
zJJn9kdMjzKAt7R3?uCwZK&MI8PG+{VQp)m(%FbeXI{&^3Ct>9wVXyh~ojrcZp5U$W
z$Xn{|xXsdAaeNEB4E;29QqX6%zFI;k&r4BrYYuHc+4&2pgdAGxNM3ny$iT=(^Rw$1
z9u^(F?uR4~Xy>4YC&klgMnFIk7RDDL86-q_iUMyIAT!VII+oFwm(Vlf?7Ori0yV9FY6hcJLZEiTVu2PdO5^lH-O`0g
z%5r80vK~g2?NT78EqK|ldk#hqn0X59*9JZ~S-E2xpAWwkTHZIxt#GF^tn52k>>!(E
zgqd)r{`K>LH{sW+Nj9^HQEQ5+RhG>FhqhE=E@#-~hzbEEZC=@wbl8C5arUP|*4dgg
zv4FtzTd6N%vk^x)ySdp$IV1WQLgZ`wbv`0Fm!QU`&a(sDZzWZiHeMh_NSG5&G1Z_{
zvfZ_}MdG%SpodVIUUKcnmvv)mC`U?3b!ogiqlMdIUGS<*v@>IRcgz{ROx?(djrFO`
z!}wG5<-s=O3mTU$%^{Gx@QhWj#!sDSm|}BT<3Vg5`ZE{*r1D`joi{X|N*aswCOi^&
zK6woix~*71`C+$ewzo1F8gyOZXy~8wl6WKv(M$|HWcCsICi#O##w4Kb+;M>4@IN${
zGpWOa`=XY{nOxbZ7zrNvBa~a(_xp|{Mqln~
zy*#7IUm{s~$h|$xe03M24t>-5={v+t^i-DZgEk1G5}7%Hm(Md@Dmuf;vj1abu)x1@<-?m-ab?pcEFEKS5=~4^c!I57MDK~w&<}%xt$mb@
zXCEquK^w3FRjPWAG2n^Hr4E%UP^D?Aj*h~{)3E?NlCUqMadx^#f&3hV#m$lIN7sl9
z$TDR!ChZ)m)dRdqgC9+$;$QWj$ngMYN2WT1letgR0tUZ$1Xa$GoZfyDa{5T#Nztxl
z8|NQ72v7`MRpDWB5yh)EM9WO!Y_n_yG?_JL;Xc{sr)4~ilTeRA-DP54FNBbW=eM)t
zj>Bi33t?P4AHYyL`5TL9)Fz@qYIe%P&F1FZC8zCVzb@?TI14pG;dxJb6nGtu!xM4O+f2sUB0nXT0WS_
znI7do4sU_L)rHBZ*paU<<_u>&=bfr$lgCoff^$D7#$3S?>w4_zW4uvZnwanu&FWv6
zRO$C*^fxAjJ)qPm&C3W+B930r0{`6c34FD>GZizTia3t9L_sou)(;NdMopFFfN|iD
z^}jDm2ml`=isGibyl@jP_g3{uaITu*$tnZUyWitwX2nnj`JcEZNZh;q(8c~r(E(Tt
zm#P?PG@eWQ+Qc@udNf>2eyaZ|-DBJNh|OC3^UX})H$JM!-k`hc|PCOP?Nv7nG{?3yBuQDb-5z=59X_*=%f(%nGLpQ;5Ca
z%9&_u%JEWD7xc<@^&~yT{$=7qw{$8Bkt_I#Arbw$ZkaXoDDO*|stKlXLhx6jO)#j}b3Q8c==;xdyYI$t
z?R3HtGL&|&!qq)mlbQb-7HySOx5wp*iVVdd>b9D
zt#U!Hhii|5e7{q757X`uwlgKdGzJ=#FyMQmRixQWDZ6<}59Nn+%*>d8f1?{sc_+B8
zf6Kbf1N@xv5;wUO8$bftoz5emrD(fi$*N#I74>)rG*zTwEjuEi2E;OLf4?LtHhGXb
zy9){Y3y-RpcqH~2+dzsCP8!{Wg{qDcX`R`TbAI6Jb0K#0596hBklHbrClcE
zmX^xEbf#|Fa>0+57~|8RuP|;xAj;hh{7IVju9%5BG3$S$4)dQ!w$qZ3#ji2bQ^C(b
zY#BxlCo+u44OEM2*f!aZv{R2VtU>(!{urF-f3DFjALjypEm-(?K#CspH7KkrIiUYV
zTF;hKN{H%b{OakS+UG`Y7nE+F?ktLL)hEU{pF01Lo^z6G0X7$<7Pz(@WT8^k0s-b@
z?K6ks)E?}+T_vNgh#}~Ch8c+{KYG$2`n7s_Rb2w{sC6l&qB!J9OvG?YtM$g-%}dChxCR?Fl3zJ9M(p+a08O)`6e=|60%Nu>
z%AoPpZ7iKuiUFOnz%5d}@CyjZoF6`h)U@wcFEY?FA>qxwIRe8Aru;}32>>N{v+^d0
z6y!u@E3`z&y5e;t8;1XS@BdR4u^b6q*!{KuD`3*ZWG#Tc3&c}8ZiPldi_ag3(^u*c
z3GLKw3WCH0gf`l!J6454ZQiXDIP)EBU^J56w+@&`KPp3H8p8ptA`5|0*iwq9u(N`U
zD{O5nTz{)A#CaefLpx3HKRw+(5ZDKC|A2t+*>Gew+6w~pgj@@DJ)QqwabrxNDo$2r
z52bnP$V*TKSG#^Aa29TwVW&TE65xnK5Y6u9(5HWIyYRcAEMIP>wvfXY?tS~O`V>#p
zuD(sf+14e>3qH-8FfUcpEAk8ST{+m@+Zq{d%+G1%dCHUJ@&}x-WMzAH@*fH>uE1We
z&D^9q4?R9Ep^MAqO|%{rFR|{3ESqNMY!ei}y2RiP$)cYrSCYT*XWV!xao<=$$mJxG#1jZp;vY-sNF8$&GL8s
zS;O&jImOsJp$1ytR9)v%aChxyWW{fBY+A-{vasy?-lFw#MC^NP`3iPP^h2JtWB74)
zOUpXJo+pDuF)fV{%}OB(g0o*lsY!tH|gYaH~Tlr1v|
z*-shXX3OIDJ&yHMMCAr<{y*r6$#9Q_t%e)^~HmMf|vwWL~bkj
z@0jlY*vNBY?h)+|S4Q44{U$*B{2>f}7V4hZE&WAI<}eDfkL7O(Wc6_(%#6QRKKAGd
zDJ^hON1dUf=imk5o}S$3^)KlfIO8{w_oLD>WA}npS6YMBrusv+Jcle71hw4QW@|t#
zDGrMQIIoxEyH>@AjpSJ`{{n^aQExzDkazc@rMa{Sr*76DuioX3YCNJ02E{dWR-Qd4
zB&ZU#3YsJ1pa03GR(iQSopMF~qVn|I8Hy2&sYyKe<`*=yZ@(vnJw1Xuc%})5_1q;b`yANv
zIyKK7)VD8|l1loUCcY$VoWK6{apkhXL|b`co>RTmD|P$fb3%As&G+P&YsB}u_rJ7d
zn`Q?wMdd_c&l-#9>wCk-KsJ+oKJ{8UD~0@
z;NJp%$%T$3nrRxn4`10l1t+YwHr%%lL(}o$|3`Ikd7!wvWnDU;WFjV3CfW
zc5K*&WLy@Zg^2=t!#cDwP$NZp8Fi6~1mB?}_|5xBhK^szV4P4w<1L$zEJ1d-
z?PY42))n-2Z3@!6y%xzs{hrqsW~Y*!$_D4AI_T?kgND*RrUF7d5a`~3_~uXPaKzHR
z;8h-uwhi!E^U~NW)F)7?Q`8qP$h-@NN(^6ea*p~WNG4}2B>lw^Isiu;>u*&KOdAlH
zJ;FW>ZF@+~oNl=+eL;MSMN7jYw+AYgWW*2uO$);pRcj}*19D&EEG&5aq%9c8Bt~oyM0#K%fF9*~
z?APodzRfe<3S->yQck&f=QcUY`ILg@e10d!N}XM=YZQLPhx0SAph^>(aDkL(AT8K(
zg&uLMs7mJZ+!)nODtng@ZiPUI-mbzWyj?V~pQ8y2Xx)RfC`ylH9zPATpQ`_AJZr+s^RHdD(#3@TQ`1p*{ipcD>-)_8@c6akP1UVui8_5O
z?HpqV0BvOejeky;ymv_+%sg&E1J4+bg3S)3|EpoY@1NcS|E~E2vWXo_j9%!J(P~P$
z>)?v^%F$tk32`p
zB;3#KBQG0MP5(4!mFj2nGX{kpbAZ3LQ)bc_#uEqAsc9iH%U0bBXvRM35<>VAf38Oz
zgN;hrSSgpZc!DVGIQDk~I$sEN9j)%F|A8P#s66|xqE@&tlEI;(j_l=2-3tNsd}A@V
MYI3DS$Nt&>0XkMiGynhq
literal 0
HcmV?d00001
diff --git a/pictures/hive-emp-deptno-20.png b/pictures/hive-emp-deptno-20.png
new file mode 100644
index 0000000000000000000000000000000000000000..26e731029e048902a894b1b42457a45b31a78dd9
GIT binary patch
literal 14357
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
X7^>eKO8`I8N2PvS>sG$9*^B=J+Q%(k
literal 0
HcmV?d00001
diff --git a/pictures/hive-emp-ptn.png b/pictures/hive-emp-ptn.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfa3db25679dbbdfc1385261973f3759883631cf
GIT binary patch
literal 33288
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