From a2a89998b66e3554df606528feac4acdec04a086 Mon Sep 17 00:00:00 2001 From: seo Date: Mon, 8 Jun 2026 02:33:05 +0900 Subject: [PATCH] Initial private import --- css/style.css | 237 +++++++++ debug.html | 175 +++++++ img/30c0fc9d9.png | Bin 0 -> 111184 bytes img/language-empty.svg | 1 + js/main.js | 1074 ++++++++++++++++++++++++++++++++++++++++ php/api.php | 306 ++++++++++++ 6 files changed, 1793 insertions(+) create mode 100644 css/style.css create mode 100644 debug.html create mode 100644 img/30c0fc9d9.png create mode 100644 img/language-empty.svg create mode 100644 js/main.js create mode 100644 php/api.php diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..b5dd668 --- /dev/null +++ b/css/style.css @@ -0,0 +1,237 @@ +html, body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: #f2f2f7; +} +#mySettingContainer { + background: #f2f2f7; + width: 100%; + max-width: 1026px; + margin: 0 auto; + min-height: 100%; + padding: 0; + border-radius: 0; + box-shadow: none; +} +#mySettingContainer #settingsHeader { + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 12px; + padding-top: 12px; + font-size: 17px; + color: #000; +} +#mySettingContainer #blogBackLink { + position: absolute; + left: 15px; + color: #007AFF; + text-decoration: none; + font-weight: normal; + cursor: pointer; +} +#mySettingContainer #blogBackLink .backArrow { + font-size: 26px; /* 더 크게 */ + position: relative; + top: 1px; + margin-right: 1px; +} +#mySettingContainer #blogBackLink:active { + opacity: 0.5; +} +#mySettingContainer #langToggle { + position: absolute; + right: 15px; + top: 50%; + transform: translateY(-50%); + width: 24px; + height: 24px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} +#mySettingContainer #langToggle img { + width: 30px; + height: 30px; + opacity: 0.8; + transition: opacity 0.2s ease; +} +#mySettingContainer #langToggle:hover img { + opacity: 1; +} +#mySettingContainer #mapContainer { + height: 500px; + border-radius: 14px; + overflow: hidden; + margin: 0 16px 16px 16px; + box-shadow: 0 2px 5px rgba(0,0,0,0.1); +} +#mySettingContainer .settingSection { + background: #fff; + margin: 0 16px 16px 16px; + border-radius: 14px; + overflow: hidden; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); +} +#mySettingContainer .settingRow { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + height: 36px; + line-height: 36px; + font-size: 14px; + color: #000; + padding: 0 12px; +} +#mySettingContainer .settingRow::after { + content: ""; + position: absolute; + bottom: 0; + left: 12px; + right: 0; + height: 1px; + background: #e5e5ea; +} +#mySettingContainer .settingRow:last-child::after { + content: none; +} + +#mySettingContainer .settingRow:last-child { + border-bottom: none; +} +#mySettingContainer .settingRow span:last-child { + color: #6e6e73; +} +#mySettingContainer .iosSwitch { + position: relative; + width: 42px; + height: 26px; + line-height: normal; +} +#mySettingContainer .iosSwitch input { + opacity: 0; + width: 0; + height: 0; +} +#mySettingContainer .slider { + position: absolute; + cursor: default; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + border-radius: 20px; + transition: .4s; +} +#mySettingContainer .slider:before { + position: absolute; + content: ""; + height: 22px; + width: 22px; + left: 2px; + bottom: 2px; + background-color: white; + border-radius: 50%; + transition: .4s; +} +#mySettingContainer input:checked + .slider { + background-color: #34c759; +} +#mySettingContainer input:checked + .slider:before { + transform: translateX(16px); +} +#mySettingContainer .settingRow.locateRow { + background: #fff; + transition: background 0.3s ease; +} +#mySettingContainer .settingRow.locateRow:active { + background: #d3d3d3; +} +#mySettingContainer .settingRow.locateRow:hover { + background: #d3d3d3; +} +#mySettingContainer .settingTitle { + padding: 4px 12px 4px 28px; + font-size: 11px; + color: #8e8e93; +} +#ios-pwa-tooltip { + opacity: 0; + visibility: hidden; + transition: opacity 0.4s ease, visibility 0.4s ease; + position: fixed; + bottom: 30px; + left: 50%; + transform: translateX(-50%); + background: #ffffff; + color: #000; + border-radius: 12px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); + padding: 10px 30px; + font-size: 14px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + z-index: 9999; + box-sizing: border-box; + white-space: nowrap; + text-overflow: ellipsis; + width: fit-content; + max-width: calc(100% - 20px); + text-align: center; +} + +#ios-pwa-tooltip::after { + content: ""; + position: absolute; + bottom: -10px; + left: 50%; + transform: translateX(-50%); + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 10px solid #ffffff; + filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.2)); +} + +#ios-pwa-tooltip .close-btn { + position: absolute; + top: 2px; + right: 7px; + font-size: 14px; + color: #888; + cursor: pointer; + line-height: 1; +} + +#ios-pwa-tooltip .close-btn:hover { + color: #333; +} + +#ios-pwa-tooltip.visible { + opacity: 1; + visibility: visible; +} + +.dth { + border: none; + border-radius: 8px; + padding: 2px 4px; + background: #f2f2f7; /* 기본 연회색 배경 */ + color: #007AFF; /* 파란 글자 */ + font-size: 14px; + text-align: center; + cursor: pointer; +} + +.dth:focus { + outline: none; + background: #e5e5ea; /* 눌렀을 때 조금 진한 회색 */ +} + +.dth::placeholder { + color: #aaa; +} diff --git a/debug.html b/debug.html new file mode 100644 index 0000000..51124b5 --- /dev/null +++ b/debug.html @@ -0,0 +1,175 @@ + + +
+
+ + +
+ Language Toggle +
+
+ +
+
+
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+ + + + + + + + + +
+ + + \ No newline at end of file diff --git a/img/30c0fc9d9.png b/img/30c0fc9d9.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecb6881cb6a5de21d7808e4cd6983a17e8ec8ec GIT binary patch literal 111184 zcmeEuRa6{L^d>Us5F`X2Bq0gz1a~KRaEIVNxDHOR0YV5GGz52dcXzkJ-DPl=-=4F( z@B92eed<(obv@j=UDfxy-@Vo0%8Jr&Fi9~H5D?zT%1C@eKtP23SI|*kdmz)T@vjx4 z^EYWRgwj#a{_Bl|nU<`%f&v2lYa1N_G1LkH@ZXTvLi$<|5Rfww5s+VN#Q*v-k^aw9 zL|7*B|7-s@@Q0=-7y&^9K~_Rk%>(hMMHgzm;JOA^*Hm}EZt?10#~NVE>yG5Cl&C5p zBM$lXRpZ@&{~M+6pOv8qQ(vJX7#m@z7gPXjbEv>ahv7d@zuy~v5C-4@0Bpek3VLNz zUF?6xsWKI=#+QZfcW2>^n%gfAWi_L`Ynq1Yn((XRqJ^e|)E4;SVeK66nvTV3)fjKK zirfg&|6Kp0f&bCK|DOg#i_U}r1j_rY&_De(B{gj8{9=VlbsGp8hNC4PeT=k9N&R30`y*Mlv~*uA3r@CJOT zmHB0moxNRDt-G64lef2|5UC31>T=B;zVn=-C4P)e6H(`7lfJuS7h zrj}7uf{1G#U{2BfP|p5*c{hwvJtp8PE9$27;+>6uc}cxUNJvQTQnpgh*4Wazo_X{W zD?N$cS!PY{&evBlxpyB5fVRtj8@3gkxoG|??7rRrQ2G& z@4b)bcCc&yx4&M2cMO`a9xSUuQ*iK`e_CBxarKwPk!sh)tj78^;cgs2RUCUBj*_U9 zCcw*A<6`Y{uvIXTzE`@^%&W6DPh7%4dwL`_zLMual=R>xH6ig*l}Fg-^gR9O@G{&d zWq7~M(&Fn%X@|@S98N;HU%Q0Ttxnq!CVc`C|*Zsb+3=MRXWX{}`0}bepc5@J^}^vlK8-9u=V^ zQ|FnRCrEEVoTdj=IWJHJY{X#>1AEuzmq}N&4arKZ7QHN#uFfL;b(+A!I=b_Nz-x9jWERUc0~XYU%y zna1fT@B?MmS4fY3_Sg0(fuT~M`Bi@bz-ktURUU;kg?fi%5~azKhLBKTXhHcnSBYeq zGCfEvii~vq#L|(F2$crC6SJP?3)9HE>jKHBu$ufx1jx=X37Un}IJd*vO@ET4{ux+A z(*nKzY?iZmC?SoVfhQ>D$GCv&^Ht*WgoEF8B7Tn92$E7W$_DpCchSN-Tf(F_uUj{g zrFdDp(dCZpboGvmd#+Za=D?#zMZK;1zCv;pSuX>cPd13mZ0$|-S?aO2t_-mZ5#7rF{0`{_t%7k;fmGZ%c#WCo2btsn1OS8%-GNTEs{m@ z*#pKAwI*U<`LpO@V7cB{JOO=D{U*n$sj0nM*0Jv;C`yuJMIcen3F`HnDY@)8oo*Bg z#H1cwfMeiwY2axBS73Ra9g2y|pntKW^B@kSB--^&kC4~?(b@~;Gknc2MCTQ9DE&g& zNWA}OHSJy4P-O#4UWydY-hPF8VKm|?7b(Ju zRIEE1L9?m>a}Dk6;Km0_nhA54-M$MRi7qm`<{ zOsabqJa_%M#52me0^_bA4(d;&W`W`gFw4zRIz*ucSlWi!1~%OBpV_-tJ|KWPl4G6p zK;2<060=QhnMqS!{gka9C#Qb<8PzHk$5U=GBS?=wbgc<333&oh3|gE#@8D}%Ugv-2 z99p*|)iJRnaPiQoFSh$@aVov2eYbgkWmr7?TL* z=Ez$1c3b6Rmrvkot%J)omqPVEho5~W;{_3&G>wElHQgX^QSoO4N9OXkaIlQ z3E->{ZV1`w+-G@tq+#*d7rqTOY`}#7_fm3DKKo_Fd~=JN`QO&7Ncg^U&h6$#hD9RkTf?TrVx}V!KLrWM)BoT}1`&;;i7Z`}Gdv$z?CfSE1T}7Ga6i z-@NR7N6Xqw=~H@iED{tM46hFMm61!K&`%uF>-}bpWUEV!?s|wGx&eHP=-q6;YI`RK z;8oWVrCc9Qud%Zxk$^sQQ{lj|1-R?{eg8PzT!(|F^I~c_{)#Ko$`albDLrm zZ}34R82sbvqnEAO9$PX27qe+K6H9Yt3+84FZ7PujlbH3tAsJfRs*8#j1_yfi1bu|+Xf7}35L2tg#>8vO_N4@NSee^HLT)2YDb?4Q`)z~AIp((d1h4HG^XGr7 zBmqSS!B;E6&c|XFY55RxOqR{!1HWG^E5skdPItNisK$(Qsvk^{h$gaU>jyG*i0Psj z5GuTpZUX2XaHN3_L7q+a^|Qz5<(!g=6RIuHA4QA+sXnOkUEyTOlDpL0b;{ruLd$_@ zJeR}RPYQy05Swck6l1AASN`_5XikUeE-MVHH&5%B-2}l64tj7XMkgsoWbA2OQRe=6 zkx~Z#)3)L5b6lhJvW9}mW&%Yq%GG)0tK2ClKM3aqUH2&so2on|i((SdTX{^Sn&eVQ zuM71{malcwk_cydpJbKd>8XZosFl^msc5|qw0*3*xqg3fHbcp6qzWH!nwh~c)ZFTk zyq@B{eSE_rWs5)ZaWC13*%bXR)S4uu)ZuE4?DJ0!>rWj+*_LRhS`uc0-3(iykkCpy z?}-^Uqa0Vm=uP&rhmrAYWIc?|ZpX~QM2Av`lIQ2TQ=fHb;aj4e*83Xn*1x&`sXFOD zRU75nLd{o@UbYP%DrPP%##(Y6_6?YK75sT}GQYyMnG}8VDhM&vVI|TQ=2!sA+aP%@#od46J{auq@r7goi|xaX~aa zult1WmIrtJHdN=@E<)Gp>G7Dp0Glm<;L_Sxpx#>7zV^IKqxo{wdtw6}{BRpx4YODc zm<9TC-kTx*3}T%6XG{9Ub?o?}n3;CrmKmVZUPtm;z1mmA9E` zy3bD$7I$@*nu|?VGT3}}7hRQP=hR$=KV#+oGxJ`@^txOcy1FH@-uK}SJpZD|Jww9*io-b8^k!%N? zvm=q94qEB7DcB4Bx%-8^)JpztTYmeW`mxc>&8>4^xf;_TAU9kXE%~5NaBHWkEe5Z; zlXx|+!ar`%P2Hk;pg;be1R|X@aX{W82xOwB8=K(hm=M)^gWcWWKS&KT9hUzQcR-F) zLEB=0s_~{tbO)Sgt7WHJedOhbAw_0o;>yokfJ}%@L+`;{hHrt-~U+(!e#kH2W zfuI#6CIreAjW?IXI!!8f{a=S+zS|3QESA8t76X(Y^?i}}(XdGTQd9V< zCh*b7X)I@zl0mJIiARkoo?HXp#qifK4U#I+9x9Z+9kFr+giA;Ew%pbPk&K7YhrbAi z^Q<#U*Zo8SL4j8p&xK6^8jSHq*#$=J(JlVv2|q%vzxtM|Z?R<`q7g~8QC zl*>$D6im|SM5>;|C@Z+UUQM)uFj_Ruh3)N5l-}g0Q}WCC-*ad#yQ1K4{syhS7ADt9 zYYWYfWvx%MiA;INughXk&FY}jf{A3(yTTI{mZ_01 zVkxZRfZrG}?-Dnan-kGG30K4%1On|s>`vc*))0>d)9=|?X=>!5W+IHB-OhClgvcE9 zB*q_2j)%2Ga@yK(lvW?``{`YAB0S%L`-g6Tu~daC78}4No|a>fOP+u0L9y(1MkZ;u zS-X9k$kVbh7zP5Kxlk@*8P(?zc^{SdY;;k2XhmZ{e+)UnuZI`K+Eah_px4Rpv5(2*Bll z+<{%2FN53lw}7FxgiC`K|7bLgm%|Ib^9D_|idEP$ysmj(+=H~F@RulCAb17;v%eHB zvnLoMU?*T0y(b~cho$vf`Syr;F%YId)!YzSgP21^ee6TeJ3X0h5h{Fsgl2H3oAEI1 z@IvW#TT*0i*<>C-M`(%Y5url5=b;PJWEO6^*m+!7gG~^$9ldPPtvCpfPmPk^d1Vo> zSf1ra_)Jnv8O8Ca9-Oj`E3R8Aml+ri&O6}_Yz7S_J*s~gS1*qeu#FtS@Q=vzQj_UW zMK~E)YlaLVCb}Wfo-zOYrrB=F8BwtE*Ucz^Mhn-C7tOsNad9IrFt0*Tvcx$cmS<|U z?z)#b47MLzPQQ|MycI3wuspBzG(eQzbQO}JZ3X|qW-j;epRR@CINKfT+MOvM`iZ#Q z;TlS87xAjX-a9S=)@rXJpO^Qe_CfO$GFFm%nE6Th=L14UIi!_&a8Cs}uL`en)Sd;w zEyCYyRsEvBP0h=UUCwjm-G%mSgniI2v`mG!om7VEYJ|D$wAp-HCGM z0&JWZUjo@=jZ!tI;XYI{oYoKvQnnvxqDd?wEq5obhUK1oIz%?KxS@^wu)Ss zi2%i9A~-RD_&~6wY|k1FkoBh@FEv=APUQ)i%Hs z4AUbaRu8~-d)Bat5q2&n7(_#X-&C?2>5AKN_XE+~fUll)`4;pNW5YXY4!fL`WSOEe4F0HC6WwZMPLS#-Zg0558-!;y%CQ zc}BhUzVGi8zMJ~vm)XZ-2xHPHwltf$)GjGDGmgo)>^WcLO%%-6^h{E69+xJ*eETo& zg6yL8#c50@r`72ND@KC1yr-pKLb3?siN}}-J=USw(n1M*nJr6SMiR7Tl4QH_ORab?vj8eFj@NL7}VW4Twk;SGE0Z=dXq-sk4l6a2TOetD*;0-9Q-7we zIm(K~~`@YoC*T4B|NfHPZR@A8zTj+e_|dF;a4n ze?#UswVQ+8)Y6@Kjww-*okLl9<0*qaN(_^LZ%*T;N{H{69%oCG`#n;Xmg9Et3fxQe z$smU#by7pSqqnoDPL{g6hhM#7IJXD7>tZmT&+g85nV)TeopFR-e$z|ut{ygdD4Psg zy|ym~d-BqsI;Dl{9}jfvxJqqLk4m7f?9yBSj8stc9hC4?Px}2;Bg@-Gefq4-NY8Nx5m5SFiQ=f*uiYnJUc8eYeCLA*5EU1PjRPu8Ae($dDh83DM)DOl)&~ z8jWwe+oXIsUb8b)Cr!DXPt-*ax(U6#bvYBhXGm;28_tPr^L2(i^xR7odDEb2V&ut^ zA=c(%IR4nZ>c@*LC4RcNmpyr?G$Qm-p*`in8bsmOp|B2SUd6cz6h9q5?JWb6>$lgF z^^^-X{)Not86O5Q;8gpRR~Fxk+=*6H(|EkS;?V**^j5fYei@NRLyQRmCd=~HKQip5 zO$c!ndjCu5nA;6dLZaOuPGB_c<{_1-M*Db&OfZ_8u3#`#XvvJOWk)W`lTIe}=`db? zJ&p24k3pEC%0fbp8h0 zs$5Xy4U&~=S-R>{y5vQbf%JL2-Kzh^kF}mQ;g)?qN-eeg^`~6@gaLUplt^$Au?Ohx zGKSN#<=XHPs@QR5;F)It&sWN%z67VO*&L2rzgTs1ma?_Oz_;MU%s@mmz4#ga$Ph+DO z_WtH~W$S+Aldd}Y zDjRfUUdO^{-EO3f=g*FMuo74s!nDXmKHWZGJd1p^3To1flVqDzka{Km75gMg=GuPrJ(8WnqgR+he zBPqA%?|-Zkj7+msQO@(*=0Py2BOf|AttE=_BSttra3akbGIo4hDad0%KMpsbVwv9v zq13x|WZ@z7=;<-ghh|Y1{s0vjt!S}9cCP3yy*795589j?R`5@-yrIC??X(%hf2hBd z+IAbW*3#lAITbDk)ge}xcQ)$-oAPLY4hFDViN?~dHzoZpq8vP{ho&hIlM8kw1wRA^ z6|-z5r3t=guAB6=&}E9_Rdh`{G9?J+zJ&BNS0zcSfB&d9wfx@7nw5loNmHoN;Aie{ z`lHPoDg^POH&`B;vuXApBHF}dprCg~Z;pTH+k~)52jWmSyFTUS`K}*^=zIuS?BK}; zllvJ47ubpJq8JJkdUu>?Mz|!Hah%K2{N=k^kRtHibKbm3@$iyZqV%qr%9WfFwGEtn z^I1D6+4lWZS{|pLLB)an%Kd}2K4k+XbusI z+9!xJJ$Cr*DztpZjRP>j-%b8vi&=~g=de~g3{G7Q>9KiPtnmv{s| z0nWlWH$f)`WIA?6?M-i^CrHTpJHD=#jKvX&&0QbEBvGa@e_>Y(_5O+-_7Fu2=Nbj( z`Zp0w=>5~qSXW_=you%3@g8}yGdf?MMPf5I++gFb(UmHd9p?>f-TA9uxQUbv`y`m> z`;`cwt26V|qDz+e(n9HRU+24fpgUJ=yF||aO8EI4Vehl;jo(GKRn!*17*5}fGF%*x zFvnPl=cXnf@Rv+5b=*u3e3Up? zv6}(1E2?B02A(!@y0JLMry@Pigl`V-=T=4_JKtfqQa2Wur|b>DyW}_Fr*vh zk$$mryp-*Jts}B3uPT-P84}d{prELbF#j!@2N$f zsa^Y$qmbKvrGmPxg+etJV9Z64A!>^fpon|#8s9_&g#ZFYL}4qQt2k15*MeuKmbsV$ z^{&Ms%-iSGr-5bBXuAVV-1eTP@~kG;YzLlQqvME|DCttogI1=be1wXh6!(cnI#oKt zsVTRK2M7fM=^aKstbAunK(d1R^7>K3IOt>CbvWK)*Y5qczMG0<{JfRUm0{f6((trE z`O+P_`@H7RdPl%v-(+I)AOA3tmAVrBxM-oN;R{0(zV6|6C^Zb9DSDEb8I{wIgx}Mj zjdGOa!5^&EtLh?A zq-h0KZ@yW@yNj8S-}XbG4j|9ZMPHmT5%SLhgx)jhV=*1n$K5RFUKUDUp#R39?LLPI zK~{mYjFHA^c!TxU~MS1}+BW>+Vp z!iossKmdJ{R}AG42!4ir)`r1)k#$c(cSOvE43oreK5&yew|ZO$L=q7wUk`{ZET4Z9 zg_=}vwoCIy6A;OQ7!1rB3O2hp8g9=zm8H|5(LYU9!Vsbq7hrEo02iJa8O!twM(@+j zE>uvN`ll#&86(@jfByWPcM=9LyvHMQC^jYbOhewi;4Uj^vlUq)C;RU!X^Xvm;iQyMpg zDx|RGd2z^1wewBYDZn#ZnE^8zw_7OG87bfsQrC4Ok~a=k0C9xXaoRA8UnF?z%M+R- zit$R@p%U-?oqrCGyYXG)l3t-Xl6-INyTFqKp_Jg*sJeWkcBA;rJP8}BE}@j0y6d2} z0vOrms}5uf1Mzv!I~DO;8TEH`rqDx z^?#1dc)=YR5o|TL*Hj=^^gLB&iTm zZ~ett`RuZ&$)pb+f57JheL^8@jt+!4@WA^n?A7AX4#8;$sq0ku&BP(;Q%mFZ=u>%g z5N4yoqW~XV-E(=WQJO(Cib*?nzE0k&gj8Ci4R5mZxr0pcL3s ziLtzoId#C@z>_1|q@@D+UftSKb$^%f7+H3dI8Rk&{@?tM!^n{#FMr1T?63dKaT`G3 zJ0)gPs2@|YqerGj8Gop}GY^24J!15(g0+5chCI~SuT5NCrkqx>-=m=MNfD~Hn0WFG z9CYRx2ciCMu!(?$n?RY;>ZI#aMt^sOwzX+9SSYq;`44we4YGA&zIQ8C?K(jG8fKJI z8^e#TG;bS3LK>}0bkFv}M52>>aI*8==Je11Gcn#u8J71bG zMbD{XE}1iyn$f=}n9oSp!7tIc5vrT5r;So=P_9Il^0UtxBum1Z74x|{0jJWT;N=c? z(tEWebcI+0j?`j}iW9uxWT#o@OwtB?@FoQq)m+JOHM=+qiOwDUZ>qI?Abchk`c(Yb zI*W#Yj_7VSz0XE)c_RNgrkDj*e>>QXd7GD**zz{r%98I$80q~=U-W2$Yo6sPjN>u)oiCFA|dSs?BWVXR2 znOtGQqk-2NWHqt_W{_NC;d&uf*Ue4(n=$5?wlp=W$;^W>%|96%*}ylKL=xy`V*$Sy zGko5%nORF1OMgX*=`AK)RirOzZO^KPkK;LJWmq%7U20<9uRp3f*I~uYztpK0Xsc4R z?Ny^?eEXwmr05z?izZmiq!M{FR>OMUeW{NVs(}7rA?KS73Pi2^&VizqhJ55P@ed#@ zB@YEB4PLqAN_E()esrVSS^c2;2ViB_AL5ro3$Oe+=MeHGHqx^Fug%f@oMoWrfB1B-+|;s44xn?-zH7Rwv-! zJo(kQALIEuRM_sL7#_4l#L3Z2LQ~SisY0{2T3I?0aWcye7Zh^6Mc22vlTE=J*%3#@VMkd(x2|Jjol*%dztxD*QRyLl)?0B69shpY(CdK=?dR<#^+QK8TMwaOc$C- z51i@ya>SNhaLm8$2B$p9)Vf2KaeCL+htWHEWTohD8Te(12eOj?uDL3d2HwY4^?hu_QzY<@0n%NU6U^cs@H7)Le%)rx5&30OQ(!Bi6JG2 z3a+^hjWLt$zi@)rTnJFV_2Sm+uLn>3R zv2;$EH~X39@1{N)s)bdXx%4rmMD{KfIn@s|q;n}Evc3E{Dj9l7B6NUX_vP`?Nil;% z^`BwHXhBQ7;q6d{$8ls4!;ty78^?dh*i z*WfiyB~U~$y{NRV$|F67R=ZL*JFy_&vFxr#1FrWc`y2?%0q(l$bgPvszH?`@T|hIA zUID*5dg#RLb{!7f?MM@4(FrBSPH)V=YRGEe|AO@vL}Xs<4I`9W2JYO)zVlKEbJohM z${Srj{6i!*KV_L>z>f68*Us7fx`^LmNv+zJUC!!JKJC-UpVHTS#M{P+vFEePvNU0L z`*_X6{UK&-#2O z=|9IoI=)l)+%m4I{7GJOAZ4voL!eF#tiA+<^)Um8qNZuaNrOg`ouIcDw7FH7-N(8! z;SOofZ})FC%b&FCcObQ$7h>$9pSN05|3M7@=IbGPE5c-om4TQFOy*%3wRum-FiCP8eh!B|bm^yR2XD@1yXSN#gAtxgQC~nCH;sj4=9F-x8Q8p4I?+*W^M#lBUv0DDA7u2`=MkEn*x5LsFvDrjBR zJ%Ovay>nGO9OWn$5nsBZAI(lAzhO4&!8}R%q}ykNa!oEMf*O83ji8P?PTA_1R;rp1G)Q-v6cbfLG=%XohPHKgD-czvqe(&P08i2;DN(2 z$y{l`@NOAcG&fskaNiLhbLYzxnUjQ6%@HfUzDl5Z1z#fm{qJZ;tUZ#qALu}aMgWF*s?U!pC29>poLhX z(#njzhv=8s_R=tsCwy(3eXpSH>2Pj<{C!_+Rl#Hsv5O{9aGSzLi+S& zQurFa%%Kj!Q%1G=gmE>=d>w)SGMW{ky3dn0x8Xy3&h~41D<4aIU&lYqO7Tvse&e&` z4r1P3$l3t|c9;aJ5JqTMi^j>rJ!FXIL&w-&d=T~)=HAB}6{jyP$%C^2&79$%x&6O- zW8@0SqknVqzL5QCAUY71sy^y9ETbCiyPWe**>`=I?(jsVDU~0a{L#p=R7J=%rgytu zg-uF@%`2iE&&TWOK?r*x;aPlMW$@|?kNIwlST#;x3%Vuia;PH})p;JAzM!4t<4M#n z%wc(~I_^#>K2{;AjsCk#lMTIjs9Lgid#~=@55_OpJd_$(Z$iC#`?*Fu&i6MCD;O^!KKOKK7DED+g445i?hd7WoqWOAyoO zJl`iwhjm-UR5-o&L1=YUa)I^S^{*s_^dvxXBz^o1nl6EDKnHH^pxl00m$fY{iIfH^os$hFg~B z$(RP*EVAA1eD@$a(Rhr(Sg73x5vNFzJ3FkuDhBDMy7@|v=?I7)9E$k~VqzGzyYlKE%fs9SsX;XMl4Q2@uO zC1$b@J+7UyZmipir&b!tq1q*>M^Z5*T)9!=YvaEzgGuVUF;#ctf%V;kW9_X zwh9LcfsYB-QGU5;vt#gd-J9~eb`1~rAPmIL%7n*abRM~kxc(!kce?Kwb{G7X6&h0Q3&?V%Gt|NR9jmF^^={ToDOVTdM=jY)hpqhG;>8hDaL{5b%p*Q5z;1A8VV zb7Z;=``BM>k9C4J)4{HP)RnP+><~X>xY^@NwTyhEevKq0aaLg|@Y9m6S+w2t7_ZBM z66a^nGW{)#sLw;Y6MUADd1h47eRz=mWb*Z{Hv^SP$$rPd);>Z5`$SD)qeOTcJ*Pke z=KRN&IHJ;b`a>D=ulDKDlp-;C`oO_veP(gz=0MeJ=Pk_!f~d$~=AT0epOENmBcNZv zA#v`N9@2WbM+|d-fQH~DL_gPYsA-?Xh<8R@^)Da3FwM3~sA_^0E?7B|uRb@DaPLUI zLk+=H?LZ|z^}X5RbQL(5o`W4vYu-_5Lbb1UD43Cf3leI2yYWwuye!%OO?m)fF&C}6 zYoUO3mP34>v$IqzJk^$n`28c|SyPc%Xn&?A2!Rr)$dX}GEG4v^oLreaCO`({mpaQ~ ziZ+=aAyU`)T>oSKT`8m7<^d9j6U;Uq&`n8#jwM(hTI9}u*(jSv)c^VY2qWj@r=GHZ zZT?Zxg)S%i-?OAf4S=GC*YMHBS-H=)O*FHwfmGp&Q1hF25BJxuPcZl6Ev@sW)&fmM z>zU8?-9pL_9_J!@1%3S=Qzh%ku1VV7C8w!E-!%-bom-%h(9L`1c%GT;Y|2DC9~`4* z2zBsK?a%6Qe{`Rq$0XoOO&9%{xCuxH01RVl>l^ejl>sz|8PDBSJNqoh=oxrF@%XZ+ zD1Qa-PL!DwXsP&K&X!Chq!*Re+4P`@2s2Tp_9o*TbJ2xAFA8jajI)$3?D}w9VCqdC zezf|tJF%@Rj@g&<+ZAu#W;FX`I2yM~L4sQW@)DrX0TSAGOxH9g z)P6;>TSUdDevEP-#_nAfCNYs#B7^p?=m$F9>Y)lPzDpy|L^*lI#_#N-!*8cXmyp$QZM?I=u?(JH4NlA;yOZ@VeWZ(n?UF#{ez=>vf#&Vt;839%lz}d-N!P%ltR9`%cK2 zZey9R{+iehSwEQ$tan%>DkTEVb5CV@;_VIb_cudk3={9Px5cZyX~pgN|H`YK1bAW6 z+javr&~ovz%#*1kq36P09+SDbI10;JO_YkA-sE8{hVq~8~N zzs*<$A-g7yELRCOqX*L<{iWN(cz#6kkcgQpy7*)KPLIw51*hvV?tQ!UA}K37V<-@y zAu(mh)9G%1RXb}^o#;FdQrap-fze!)52t@4<98OOPUN~DR~^c>Q^+|V?6(tmbMom? zlm{*KFV|b_z_(hqip>91@dT-*PCj{iDT+o)|Lk-`y|1F2BrD$nM_4$KSnwG|f29-i z9dqV*K1coE_Atq>byNgrMr0E1nUj3cpILb?~ zO#Mn^C-_DnHy02(D5#k3K+nmJb4_)5eT8b0l9G*n^#0svWPJ397aBAxhCjtqIjzzj%* zA`KvgY5Wgkoh?eBciFI{UZB*NFYMdy?_bxg!_kc7@1n53F=K7#d>-Xv`bu}mWeQ3u zP&&|Jnis`xTz_cJ!K#$ob;-~{r$A(2(RFFWO4eN9gL~o4JJ!#~M@7a~4kXnPK4qev zI8+=tU7lE@5yCdxrX{uKw?rbcx!)B%u>T2Xq6U+W?89}avAY>=e zwEungT;yMVfH4TU$@hGwyy)fw>U=URIw?c-Vy5L04|`nkC&DhF!6_~1yx2b-Haw0= zQGqtk%MMCFgxIVRzImTk`E3KO4j~KqJ`*avUg*u2s!1CAJ53wYLh1TZyW|HU1tL{4JrQeq4anZ-dl&22zQ%Ah2q3p7b|5>+j%Y#OkL{De7fsukqJ=RSw7MUNg2OA z^4Fpqp+3*|X;m-Hc#&n)cwt4SAlk$b@smph@~&EJ>vq?4^%lM~#%#>!5yTkfkCnm5 z!&4t}qxqS!uOcV=P77BjY-6_GKFa?5)MS+6ec#j2>z&)NZ2<$S>i-k%sOE12(rmYZ z?>5UmTMeaC{b%O@Wf3*0TXmnDb2~h~!7tPgW2&n=!H@9P>F`MJ@YXS**-#onUn7N1yaG{N`m8_U% zTO^*?7@nzOE4}*Ta{q1&L7I=@A-D>P2cZGdp%<2*qk2a5qBldm?g%T1jy+Ip6-EE_ zC~vmf&d$5(Ahnj2P2q;J-e>q(;ol<{b=|XVouvbw%SFZX;%BOK0_PC+jGjG|NR#LZJZ%mp8w^=Y!fTLbyeRTiIrcvJoJy*&wTM;j4R&>CxLgqSQ13&JQgwi z9p#CpfMSc^BrBr$3(nNf^DJk&k+8-h_eUp^D zEhu7Q)eXjNGWP?uG1kHd9k_d!WyIuECq@*Z)nS@@JfqWpzqyln1WE#$k~(*j97~-j zq%x`B^*IJ$HBBHdmfLN&=$8aLRv+3*EnJ~WdDcs#vP{Tua=#Dl?lDi}Shg2s-i=f3 z<1Rdc7#A&5>u-zIQP9Su`*I|pb;yKVFYmoH)j)dUYrVh!my?U{Olz(bYj|H_p~+qA zt~rsap33;#ZUrW2jYAB}@Z*i74T=gXV$#F)<`?=h{$r{LE`dXiU+rin%&jxa?XRz> zz3u~+FzP@v@0h#Jm(pG5VF9U{dVfg5;Xhb}NvC_aQK*hO(->A$QeW+{J#fg$x&2x$ z0n3eM8DUJ=&q(_M*?GMETPROOi+@Jn@8Af-%@j5c1CEgz5yZ7FGfNNV@|iV4`P z=Rw)Fq`K-CKB{%VPh{N=xDz79myeD9`)@ECiRx@^{j z@HRQ)KT799Q1?4sUho=-vV(X3cN~IdM|n8?!=ENO1_E&{tdK6Fe}nxqnhy&(&8SMD zDo!b#KFYUD5y)CS{nd`C<`%NNQ*so{QtT*XavI1ZzTt3DbKZi&1mDR#$+np6W z+KV;TNy6!5Pw+8`)8rw6T^BvhZh4Ea!{=Es%$oBbg#YMsa^=75Y2pQ&t`S9 zzoFwjv;H{ThqUpR=DM6+)TEp7riI?}st?mu@MP)!*H(C55US+u_Uz`e14aq<3qRC( zU&Rg7C%L<4l180o^)c?DolnbgelH`;gaLwX6|RGN4MPNEF_QK7J5ZZH`msRR5O{I z)n|8GZ}W;lPpDbDF52ArOY`s2E(KSUxZ*aAew)vA;~4&VtDT@{K{QI^e0D5=UJW2s z=x`MNUjURqYro8nh|!-KP2)_wH1#VdlP)xXmI+?ZE1WY92^32-Zs)XdR&J`i@Qh|w zNzma1hV(?fI>zH5^+O6dL3{4Zk~@wg?5CV%8`b@3Mr0>JWY$E)sb^Nnu%8zMF*4HM zmR@oqD|HKYun)YF(h3x}s#Lq{xdR8;p~o1-5Us}!WD}VmGEFbg6pDudLXPzFk{5Icj=drvMhh%S9(}6Z2SG;5Tr}xe5QSARE<0#kF=f~0rh-E! z1z3q~p3r0hh4XlLp%5=@;lgu(X#D&YkCPa_`(NQH+EwBndd6G59(kkC&i2G?HOt>FEDg4T_=aWMP;fu zMD}(@Ne8~4|21D~fm<)14?t3Od<>19Vd*fD&^g7Ru`>lzaHQAHWmmIQ?S+$kae7=I z_~jbHp|7N;FI}*6oY(!v1$~8w&*719mcHlbTE9arG$0QhN|ksX8ooP{#pss=E|0Bv zYFh9JN<|B^?2oZ?XYfG4pw04QS4;-2hZU0_^1999-HnnqnID1UIDPUC15Hww>~VNm zAObKiEHzSZp5lK?gQJFdEwb1icgX{kA4Z_p}FLUbzQ*fgp3QnBp?`X>Nm?PV^f`$J!T8E z0Q{H_z^sbDbz*6?bU%OQOpI7HTII)YCs&Qi`Qdk70}r8O=OVA-KY{F`Xv2XNj__jI znGrG0CB7tN214Z1at?Mu7T|7QyrByO?d_l}L@??AoNGT;k4ivQHjj=s90XLy{N^I@ zK+o;e(fr-#@O*Rn+#EJJxyZ`f;AJP-$sS`os2JILA)gBzWtKI^`=xc!!xTNv8=Hkq zgB(2T(ZLOfMp{&@o_D}3fa&(6HJ?eOyVlL67){NsZ|OIYrvl@2`($RHO*`I5-+aun z+pJV4;1c9mpv0>o#~(!s`mjk70aCH_bQM`X&NR8vIOwZ?!@A=D8^g${#Lpm$uGfy^ z$1F+6kJZqg1!8g5SPDJ{#p&gX)j7ZN6*0jfavn$WrEkZ9fc>?1@4VCjTH&!;patN^ zYW~?2&S%c9Z*0Geb0P7gCZI5~g zP}_+PU6a7L4&ZU!&WckU7Nb8oqMiW}SR+an(hPz4p28{zNZ#XErt3(GRPB)`Tou{_ zC-+4leMsyXMJ+7$)0w_dNS*lh?1CQ0T9lsQ{9^1r5f>pb0v4w1 z{OM1AB-%795Z|uVwEuub6~i7?>-m)o=W3?!C2Op0q7rz8Kg^{UHXCeeouIzo>X2{9 zoa7{ols(?!{!0yx3mX?oT>KDx7c~t%u3_;|uH!=+dw39ZImdmWC3s9t3q$ZgOzf4Psa0`5|^Sp*m~vj@j}Ak^Fj zEItYm3w7c?upHjts^fxIJrj5tf?zLR0O8chGUJ57JGKB&5k$uG$R>f<0lbfV@cif_ zPhU_VKz@vt=s(FCsvNaolUlo-hO$)v2K%u#I24xw&Jl~KV>#$@z~(*%;(<6c?@yr{ z{c^u2a5{JrvMRwr*!Cj`>#Imwh{f@m} z5ZcO*-U2NEKYE+byhOc!cEz30ub+26^K*~sVmT=P@+Z3(AsAm~XJiU0Q3t!|Am+Sv~s2g@~s9JGvBL zp3qrZ2!&TyFTBL*bO25YRbXqGaomdEKJ1{mk3F1fI|{iqKxgZf#7SsAZlf`P1;b{H zEO+$66l}%?(ZWJ3$VyZb_!t{E`t9jvgbANEj&q;TqjW*Dps5a-uW3`AVAGMiJr(un znihg-22?4kR{iPx58U7r<@iknGkSw;YKd#TV${y)*cT0fOjp2Kxwbrdu|O?VZocyvT!=eFQ>}sBn(--IyV(@J?!Knh|j5szpBv z#v~kSjbwumZ3ZbT1@i(OO?8u)jxXI#i9fpR5>!e7^fhMYsuU!_`}<>Bu!7Qf({{$A zkI~PdD7tJkkAuq7m`=j>({^$!coIMQ=VKIxNrcoZVT^dOBgd+rtqAuQQ@%alAnElO zUI2QQr;ax$^w$J^Zpp|>c!$<$*2{7<%;3&>%`IC8U^s^&Q;!R{mG~V5O^)UrxP#s! zco4zyE`l{b9<8NcDIP6opbfg7WftE0IX1vmiehfN?Npe!mNZ0jTO zU9#uN8fATT#-2b~O_u@MOZXg4OZ;#=I6bzS+72#i%pk#|PxuoOTyc7KEy;t%XdV{^ zE<(&Hgv%EtHK=N)4t@GRDEcz|%>-+&v7Q25UFuUwGz_QVUNo zrvZL}#&URM8WamOB|jS06vBNVTW$)wX>ico!@PLGj@Xd%mo|@b$0P_U`*EDvB49I# ztt0@Cf^k#9$0l(Kx61=Nd7zaLJ6P3v7)`EWb8VF2l?-SeOEjUsJEn?@Oha?7Q1^Ms z1qPUL6J)3b_*;7?o_Ay0JvIxp5%6O({p<-|U0GhfzQMOe`T36gUDbO27pJzN70_cT z(8fSju?w0Qvt?INOo8tyQy;aKCLp&V;@12}ZZpx7rkR7~`?+Cyx4K)1wKV0SkO^ zdFe90_xjQEo?{0G1tOf!xT7fdLC0_=QO6Itl+7JH`%e&o55bL*3H|HW}kw7pX^s=5&035usUU}0v1Y%)Vd}#@~>a*!OJ|dx9v;#PJZWG%| zAvWNXZN@1+&`#UTF({2HqRLCgQSzd(CKGb13-Ad%bWyp8#^BjN1{@?JRQwwjfiTV~ z+Fep^+#wzGIt@7=r{=C zx$w+Z7pwJa0Y7NqKzsZZsd?)Z{iPp%cC}zFfAkh;0r=6|d}bxy-a2`COnLptH}law0P`kc?*s zHNZz6JlvXeSv8-&Epc>#0B&3;#ENX>m&}iSBWyk0q^uA?&unA!?{VDP$qaZ=n5RHo_-HPoBjO17o~zEPv{+fI%dteAb;$K% zsXPh${?J`(Cfv}k+M+)OYZqn-o~{D1gl*l&=a~AHr4s3jT;;w$?JF>&7SUL4TqvX$ zE1u2KwCJMWndoV&A5W@pz}L6tUmauCDv#6x{n_|P#WrEHXn}XuH~&WHtzWf%=8Ogi zK*N=x{P^9a`_`GYAH}Lq_77-?*+r z(g#&83C_Dd_S{3o(8)#!l|#Ew*kI$S?h&s{PVQi*^VhcmdX{Ooj*(jkUU31%{dSE; z4Mi>mw9CB!77L^+M;lmmP6ZWk6S8;3)8Q7TI)RkaL+9G$?6mPGb|z!TC|ChE{sIZP zwA5ClM&FxTx$?rZD+O!$qqRT_z>n76Gc8TO;}yBCa2)E%sgoMr=~ql(7<(pHb*IY6 zvkbhNUB*?Yt!vJLM*?^Z)rZs29z_a{v+8Il#eXmoL)uDC<;XLh0f7S`9HUEaHy-dP zn5fD?`NMhH8J8?@EtGt3^!!IZF zE%+zuK!p%bd*TeZO~TB?`hh+%64XKTg^dLTJBu-X>Hu%(lskaa=8G*b!BNHtwbY?K z)l$h!jbm(A%@1mlFq}A^+{od)^0}fw>ifmn9)hZJa4t5%6voztSsM7lct0Kezjo&A z>i(7nc@!3C0r*i^`54If#pjk+xA*o|sw?5-8IkD{U5EFh zPkEq(+iwVs`(7;Y!fC*}OZFq_Oq5xVq8;!KIoXax+Qi(l$+JvO>fpwu9?&WQC>&a9 zl!1bFZXLb~I6D|9V-XhZyoRz?Ez?Y+Wozd@3$z52mVG6umRCZPXk&YKd~HWDYxzUBKnuVR-NeU3z|F0> zmxnz$rwry_W9n0t!HaU=9wh<|e{PkJfo-q{nyF-|YBsRrPnFJb zQih9RWFZes68pf9O5g(5A7sV=GgHz-C)X$(jYh!}oY4>?b`ydwMbDnr{aGtqT2~IZ z?j@RmWtD#LXA54Ti}5x3^(=$DD^vfzcc~!$!petCVV$jG(7+{BR&IW=>&j}3Kj2Ch ztX&6Bx@e8Palj2c zcYH!KK*2NesAQXtG4|&xN~S};`J@(R*uzpn@&g&}kveIHNeTUP4*3FYfJd&zz{r)*s-Mybn2$WLzze5cWYHIs2Mj)D=bl+!a10#eM?KpUZ1_YQRf7uWD0vZ0 z%MYRN(X&J+C}s*Muz*LMM)jiyXFXxAVNlg|5#xX-SZ6<#eXw9gF)}#%SW~6RU%;wX zczKJ~3U(lZi<~Hsfg3s4@CV2HC=|djgM)lZ@RVbv z6DhL9>GUW$Y8}8js9=Dp+iuiViOQW|l{h>>W^B%-KGjjoGt+Ou>PdoU@JEe- ztds{vsv)LP3;NijBNF5MP^D+?qE0c>*GM>+_4;+Cr1NQkBnu6R;8+Xc)OlERK{hw~ z_Ri?#g0=k7Ss)%#e01`fq#3lpt-1Nj@p{Hk-algf!0mAK)2>k}zj?pKF@OEMS}{_2 z13W;2a0w=mi=zOpGGnR^Z(sG(B$BwdMXT@!&pN^la$1OK$fpj`9G;C>7hDDJ-6@FF zLt!$F90c2!ixIj+Vl))8SoIw-P&`$Lt_I#|y@C=QV}#1RJ$;aYsY|6EH}r&c|0+yZ zEWv$(U3P|P?-;f1jn1AqGg>?uFZGz`lZ?|+sFMAQQL@KIQq)a|!ZM+_`;}%gO_0-D z@Fr669s?(EAF_}R!yn@@UJ0@!9`NYkDh$9D)Ez2nRY|-!`f+Y?PH^D_tay0DI_Pb| zk;3`Mv_H{u=R`0J_HgQXLQ`^`3n~79=eEyAabBIsa|Da$VKJ@I3ove?skP{5G?fWF zn}XhxNz7rrw|8P?vZ>V{z6HW7JbXD#!VFtrZF}xBLpQvrsZYKtLlDBr#1>NV^$f8&r!i~hr-yn()8{jZFZO5@)V?+wPbfShJ8Y`PZ88-<~QK5%SXP>pA*F@q+jcng-0 zT#JF)puo1C=E;sWxJMqdA1P;$F|!kAJ?9kXc%E0BW8hi9fZ(8_&$n!}T&^2J-++b< zdU8KX*q#UO4f4oJEdW0#@8mB)(l(|2m3D1*qzoen2+l;+gV63^^Aom=pVFx)0E`^8OT&6RS}h z<|a7jNgb~`Kh*3#z?)R3sd3CFw)!-GtMsP@sUwske55KCNH!=X%G(fkf(hfi4as)Rc zX;;3ZrgQC7pogS35tk#3b~R+AHp|opd{XBu5$gXz?slVj2MJD*y}y6##aGM(C;)S_ zF4H+JP{T%x`T0QtWjRKVa@-O4D22Exsvi1RLtT&5jLXqh8D{K1Bl?UKqKJD<~(|R8l@+#~6)*WXpRmDZU>ceJz>R1`f1BprkyIocTPd zra&-C6jQLp=jvLXthSZjB*@| z-4=RSQYeq)5S4nM8`It7b+3JSdD%R8$%h!*CP`-9gGX{orCjTGA!nja)th!E+g}L` z8mDf(7L-h$`LJaOkMaOwzRA9$O)Rx#v)R>gqY~=)$R$UKr1{F3$y_INX$IDLUtDxpC9e!4;p`=A`6d5 z-E)pn(;j#t8CE;N9MqydhJn{HncPAJ0ze@`O)9va?gL_INXnvA&JSSn$sn2tcAgd` z89`nGg2^xldsVU-3rF~+10Xw5F{q%2123nmagzJ6d_LaQJe<0${t$>mOK0Zjeh2}L z#`;4*7r=1k<>Z%6Cx7t@J+d!WP#Pi(x&gRWnuB69$1dc7i#mo;AO$h_!vwTo$$r>8 zy|D`5J@L?C@kF`Z;tZFtI2Q&!Zh4-Rj5^-}GxjNd2#T`Ua@JPjmqR)b zKN0V2ZLemrWsk@LbtXI_aZSvuS>Vpr?v+|VRJ!Ac!f`R`>m5-4lMl@92T#F`T>&Zs z3sO!CcSo6#LcQF=@kEG`YZRh3=!+&sdA*E!yvUCf0mdQ8lc9ofv#zR=Dg++$mu!2y zaJt=NNp2J>Xoyz9{g)nGgfJ>9HWXMTj!^7`8`xQBb3>jC9h#;F(Q zJy4$qQHZj6hGyts{$dnzLT+cHVB6WL3$mO$+2(UYb!fbYSG9G80z_{9LxTwn>QwXr zaC>KOB{;PGqq0DEoFA3ICTDgmp!>hN**I{@sIDI@3yJuB*Kb_@!4<=dLSw>Ia8Xr~ zX{tFuK=+m6zMJIm=VsgwkKVwe$A_@wb|ahwmgI7h&V^j`eH{%Z;2mGLn1&LVIPs*g z?45x=KlhWL@d{;vZajt*PTV$iV!Z=-xb}`-g`0?bSQYHzsy#yx-23DK!o_oE ztTT2i+u$-8Nu8L}<4D{~G^gYvZauGJ-0MgHfDd}H+WgY;`O(?)=lybz_z(l!izCM& z6+@@uJ=E1A0B9p+vFsFZ+RQ0*>u>@enz4oe3>(MG?%;sQut-_heWE7W=s#>2tM_ea z>0_3-E(ZrQPHqEUflqLXMNeRq{ensHKqqWp)56gjxYp0IL;vWawF&70Fiy67>mGGp zWhthe$iOg(VVozGK!*fKjio&_s*rJD}gu|_?Lc|1%#0IXp^Ft+EWC1NW{_Ek&G#jyv;`K z;sp&3D;y&gZ~%~#vJglC(!PRQ0K`Yrz}=d&)Dc#m)-I|vLdoJ{gnom5?(9+oTa9$N z2h0L27Etjh(s#c5mZqb72Wy=y!vdlY=7X-Xrug#gFH_upA%{lZ=gyq&7Xm4WkRs5# zm@Lz(ViWh(r5$DCvX63^gu0JgnJZ8V%VrE5=&;5_>hLGvN3Nz$Q}|$mK8@q~49w;p zFV0K)mL+#K%IL0*eyTlYGT;uAY;!pvv|w8Y;Xz<5m3;iEmz-vnS}z-kwIl zI0SyS;TRmhC{qp4U@;aya~xLmwMR*O!DFRwM;fu)@SuS-Vx)L^*>n$2aRDgdT`gs+ zZanSaRp z?3wv(O2ERYssXuV+QsT^)y-IXD6gr~m`>aqomYVOV@;yro4_Q?a0$`~k=Y%%szp#` z?hCv#MW3k9$CT?@B1BW@V;lej1`}w5YF|V=39>31kh@;&5UR2?>O@7s`@-)U$MFhW z{RtY^Y^ShQ*raB0CIs6~2nUx_g}g4DYFf7siq;fu-A8g{hFs<1)15Oem$Yfd2ws6< z!7g^ZsD+q7Iba{0wKriPMPK4v9+C}Ee0X%dy)tZX<%es57JwhFeP^1xuGKH{1N9F& zf2s9ojUy)w3GeXS<8VTZx*)E$E?1!f8m$gKrb}Gf`BM;!6oUFa&AOpve ztH=|Jo8S!xk`+k0fZ(8Tl$I>TYath?CL@Bm!b=Wva#3xNP=o%$xzkB65){x4L+%Cd zXu*{42{WB67%bssd9YOs_sVP0*k*18hx^B&mxI18NIvw`vVwRl^16BJj{6yy?31&y zvM(}Fg$V4ULb>b^=!pwFQi8K$0+q+0st0_mwJJfG^n=PI3z`zvH}$0<10R|~&x-p~ z^o0<;G~a4Birf1$z`O;sebg6nrkZ={(V6=2htEe5^+8*h{KJDQHdhU>28O4;g1Wte zcRf=K*aD~7O)z-S?q==k*I>HCcEW|mawqYo0(+$0y}6aX)=CfC0xbYPYzxmYe@)Tp zxj_H?J3rx-y$S1n;rVNKjM@j3BPhp)GwJ6-?IEBsh;L=Q`m$+f_dN%5}j2}24{#; zjv;1JFd$Qscof={)?i%?mQ$7c$$JKa!(v7p*DUmPfecM#<8)}zSafj#la0a2Up8`( z%ep%X3LVzwA(VNd7p4SK)`*UBJ*@2SdKoJ^_@1t{Y4mkZw{s}^nfElYW4K_-&gEO%uevcV4 z?zN7@(g_)!c1KqBq}qL7K#hfqLX^qD<}dyWC!mHIP4g6@k8?mII$(WSH65hjOfIC@-?g^IA|RctzqOY1}1qY^|IS4!;yC9!5mv zOz1e!1D(B9`!ElpRi1um>5*8VjesACnP*c73x{wd@q^{ZIr#Aoi~fP*9=cz>Q9)r4 z#?Rkn+M@tdB^otq6WA|`03wh_nJU})WNvs+XdelfY0bZ6hnw;~m?cwW@Bs%#Apt5r zc5uRl1L{$*-UYCCMxS~%872L1CteemAM$sA1!t;RG)y+~DoDKum2S>*Noh zK{o(UEW4;!?L!qNusfVdcvmkb9U%HJN$9gEaU;{dt4DbVud;28y+AJ8F>jpZ5F4E; zTULMKaX8g{D?l``5J3e0$Q`(8kPQDJ(51qQz|SgnW<-2$4Eov?AqzE3UAn+}Uz!FJ zQh@tLR52gxG~m*s41iJ8hb{@g*Y-6uzyr5H3&0QDq{oM$9@EedQCH;rSR;};pzvF^ zGt92~s$QQbBp60ZxcI^%0NAmZD%^ZB4c5tLm^lbbP@jt;oklpk#7^BDa*PncCY(-c zK!rBc$RHe8^i4eho+?^%!Bh>$r2>5g&L1D4Aep6df}q8!%m|p|7jHP&#+0*x+7Xbo zchL3%GtHgvXvD+CM>yrkZ4_ZLLc?iu&v|EiYxIGO=Z%Lxp5pe3YIrIs;}x0ua0W#u z+aPO(K>5`I{n z<3RFJuW|tsUO^WdaSV5K?1xj(X5d}ej3URubSh)>|DU}#4btASmBw2AnYsQttnVRz0Ra5iL&U~3q6O||9N>Y`wV#kTC*s&s6 zvLsuSxQXH}kOWB(0Kvw-Z@r-R?)m@z=ic{y8vsZ0nB6i|@9ln{yPtdRx%WBep1VEH zt9%sUaFHe8QnE{rIL8wg4q_tjwBMg<35vheWc=NBN=X0G%Cl1C_s%8MW-1w?{Mwk} z29LOk6dJ|P&yuwy%&;5Vo9hC&LX-J*)CKVT()X%|&O4fUuIo~}gR{K9h4qA};?aN!+Q=R5fDh&tI7(L-GFix1ZowkHl`AM^5VmNjz+wuT0Yll0MZNgALX+|~ zNCVC_bJqFUot#Z=tt}R~OhUEd^P^6vs#ktM8urL*(0kGTya#P)LrvOfw};mKid9`K(4->yqgsb5x4$e z8{Vxf?f}E#MaQ;+>kNMQ1rHXZTnb_XlG%et{=t}>(fI{av1kJ*q>VF;Ng}JlCD15g zXt9aOCFX()M%6M4Ot=@=Mnb`I;quB+aTcEfYQvnW!u_%U6{DP#Ml-|Ow^HAX0Ff{Gy(k^JhoYc`IF5v)2 z&_a+Pq)jhE`Oo-LJDjd%4v)B8Z-rs9mGf2ODsW1IoN}(WCVh!_f=CspRC46PB2S5{ z#44bYmFCKZbkLv}_oW;_aEXiX(p41WJPIv&fur=$iXY*DLrI`WaL^B}*H?$i4nZ43 zK{6FTz$g}D-o}L&ANT1vLvn~w>u_a;$0%3(BF|)dbq4y;3e@UPT~>DOP4H8Cr_O87m+~H;dW%2 zDP1{wMb6lKg#ezQVyUyeO*B#2(!84+T3mN(z%=!E<7ApZ8wYNN2@G&{Ip9E~Or?yR zwuDEzNKd)~rwSv7W;ljc>(1pyDK&6%8ggSIU&U4NySyA+abLk-@F}eaA&R@UA32PN zerTn3*owhTeAhV&aK8~?AO-wt{Sm_6jh^#bpawLjkMfn%c$9vr#Qgimba&hV%^nKs z2B^!70;Apn0dGyo;@H`Ut zY6d-?QvYT6`(@=JHX)`8UxmS7%ALpdAao@(iQ?%i79F8SO(s}^FX<4F!lMb3j8O#Q zHUpOzZp1`fVX)qPTvC+Gq?0k+aDqV9IASgX!sj}aisaPcbu8SQRKZLsQv-uo(_@G7 zY+BRToo?8;+Bv;JOyyuVHOH52Vk){Z-LQFMdf|na9q0Ohw|?cXghenavIK>umPbd& z(r^CSqZwwir@mQRUcPLxaM5KQOi}9(IPp*0@WY$SkY!&bEaIXpr*fXaM{z_rNA*z) zGoowCnUfxP#2G{dRs|k7Wlt%^b_p&Sm8O&v8NfN4+VTj>0I;Hu*yY5~CjaL)j5M^N zO-_op6zvOB3^Ur2bg|~{p5QXv2bIZSvK{UK>vB~v{n!FncA;UUsC|M<#z!vtIyAI# zR5fmH$~oC0eSTJR1RVRFxf)Y-RkNz+Ry}psyi%YpfajIGS1<6%)YxCJFG3H0VJf)I zq~TcNI$XDi+zhdyIKSv5B4sc&J&R#ILrw2@CGR}EK5D*6aZkTjKUn3bTy~5 zBNM4vnu%fNGAPH!>E!|*(~O1(6AaDOno4n7qa=kABUoJv`Ev1IZ#En~NEMdTTgV87 z4XZcAdZC1Fa|@Sosb8YmVZpOMmVjfd`hPv9Ja}Y zqiD`VW#G1)+prulCycBv$5{-NAO-S>xNwyq@VX?V;*apiUkwab_RFe`F)WBkpll0W zY_+xffdXB>Tx6jMHbNMK8xZsn=TRppHt^hQ+%ZT*%3_gD9+l;p5+OlbV0c#R8R?^p zD33Hiw#kXX!zKsgwo?zvi64$ghHc!H&9G{sDrs`ky7kkcKwSX;bm;yMzEo>+SHRNm zc6q@SZ{8pqX2sDCzy0C_EbSs%VG1xi@1AzJm{7KzB5TXq3uT^w;GSv7U;iO91yn6F zlv_5fOn>w8{xstop`r{JOfW@>P)!SajZebWQ-?5HyGcbDFiU#5$r~2W@HxO<3D_l$ z?`m&J?b?aFxLa2h$SmpUNUN4~r@p@B!YhOu=wgB{dWvaUph>8$>RXb&{QJL~28Tw{ z(PPKb;NWl?xj2$8oIRDMHO~?RxiU zI&DB`l>82@_#K#oB1Oeh6O}W`D%r7Xn$nr3)EC&`7Tt>!;6Z<& zTr$fqoPBwU;-X&(4*f`f7P`0@+$oQoE+m98{s^$8DBcPNe*rpUR;{37!x$FJ3;81( zC7k;5cc}^Zl!eJi*d@3BBQA30{1N5U&X#jVenKKoiL2Z5OM$uoo?rT2#n7`v^b1*D z{wu$nX1AtHXyB9 z){`E%c}@Dx3wz8cK{3(`3fxfX{3mC)WoHvitN0Wx=QV4Vq-8q8yI5Zu>h5SweZ6s> zcZol)P)+;3E*Q2@1WoUpgT`naTFY%sZA~+2>|#%v7#~ZgyR@D> zp-KNs40LVp?A9j^JG|)%#?0oc7Je;k!kSI1S1e1{ZoDQ9o=Te zp={f3rME4CZQ-5c$)5$c%g1k+zz=sd+%98fJgX1mqa2Q_rjiRht2rw1IOrGN*p`oS z5mwS7gk3M;Ks{JGsQn5OeI+z!gsLF9tI1ZM3*k!`f$nyW_eL)X-#8-XA&$$S+{+Cm z)YJz&M8BFK!*o89QqcRDh>m#h#G;X|Ha; zVwHLqVJI-fcu9ldTv{&}#;k-wv(_RxuZmas#5`a=z(Lshg9-UvcMiqlwKhz8(uh$N z10%L6{785ZziE{|NZ-+sw)U?~9bG-?&%g6R$zt0@mK_m?vxF{s_BDgPwmEV`1CcE*Pzb<1z#@w9^792n4wb z%_wDw>fGBEbtL8Hb<0WyX@6*dT3goiH3s*j)|y9ju?J>I_TccC-3aaBk+F34!l?Z` z+%%MzB|`{J$7DfE8sVvg*r6$7>xUrDLK!z<7RC-k;FNgs#!o2%ZZ6z4CJsO5{oF*6 zs*;ed8ArCJv}A&tvT2t{62gvhjk9bvU;*FSFQZ5iH-s#?%AbQHPGy!*Y{rA$OsBrf zJ7O~zr3mAxv=+E>s>nHpHvKypWuP7yte}Ge0i=4{RIG4hZ^YG~3qpavKlfP>H0y;d zGzF@nu=>6h9IA1=*?MjH_e(97gPS*A%t~xbQ4y9|f&GS)nSj@2(I?<-XbSqlgh=m? z4gg#RO?l($p7fDz8@0|F7gF4^WqG>&rt8xFW9QSpgU3>DPiNY&yeAEwJ(+rcQtj2y z|NlQ=a(w-WPXw|t3dGCh8{T|{kdbhX`sZ?@N~PPm(>leACV{>g7auC$I*c!m?S5Fj8ILfKdK7aRx%()7~B0?FiSbgRxyU548-vl z{ycRp8bsNVoD%uNaBJ}FQa!1GDnp8?ps z_=RDZ31kLSs#cgAS|3qnT7H|QvFde)vD&K)vB62~Ma+mdABN>AJuxV>WrVM%kTaWT z)cwaWVITWZ+>IO72P2k1g8{X+>Ei?n-+tq!bjz0YX>xobjSLN@#tFX5JO2iT+9C}V zfy0=f^ zR6+F*@?b;5EQHn1LX!@YJRy=4(_K3n)D-0&UA(Iyip0orVzuIu%JlaKK!*1PfhJwF=_Op&^<&J@GlO269v+=Y7c{;7>f1+@ zqx2-%>R1flilHB2u+XAIs6tEJMfj@TSr9|pBABaMH0gp;2vcq`3;71U=$j0LLI9J$ z7zUA?v!*{542diK0T>p!29|{{Vg6+yjIfvSbh}-bK1zlNCp8mGQubX}u+AjNWkotA zshV7V&@sa^;h1JnZW058D01aT#+VQV5ve|7U;VKV6sQZ}g`o0PScVk@7(l$1ssYR- z*0cPsQzvr;9_7u3NjZ>M2@*ZT^w4tQDAstDIRr1tg_vL#!Z5TM1TWffW{#9|`_{E- z+jXm~c{NHSY;I|jkn1pGLMTl(Ojwwi$+*;DbZFGUsNpH0#TTYo8%~y(0@XzyE|(qK zV&G!JW_)7mkx$_gY%MAuM(*`lxv6ePXQu`O9jQZW(`=4nfPfIB9DaqNTf>sT#4vck zuvv=%N3(>h{enlm5wsj>>g?)Hot<5&O|V-nlv_Ucc7>lhKjO6BK!ygb zsbgwU3?v9LKx^Ex5yY}B@I+rOzbI?;q(PtpBZPDaUZ$e)mv#1-S)jj50Gn3TGAX<2 zi}%7|IS@fs`J-Pezlx0k00>~R6`l;QLlagx!kCJ1fdP;LVO2@%#7sFW zL_&=?1R{*cn^_ct&D5L)u(XSalV5odK>Qy4$PH=p+Un*Zgj&0VU3X89@j%$YQoyBf z7MO371W?0_G-C-;G-Naz;8rz9&eAGeS}HJ!L=Ylqi||Eg;ztWb@Zv9wy`=MQWNE$# z(>C2wW#Nb5m4G&L7ffh^rZ%HpXlSe8%v7@JD73+Sx|1noeacXH_#+Mo0{tl4TCd6o z!5&l6v$L(%xWNa5@MsqfXnVkhrsei5>P=lSXv0$y$dofRHDQ`7v36ijC! zD{IrDU%(0>&60>`Bm|58Sl}5rVK{`IbKzWN^Mpvgi!>jHQosC*Tc zAzn1#cUb_fKvKW&so!J2)LIV{Ge@D7OtG<*6To0#Hl9E8TaKos_gW7aiG{7)2r#>? z?c(Q0y5IqyxMxeccFoetv?c|$NJH#iyd?E5S!V6fTB8ISQ;9yWDTHBiFjIt(a+rBG zHERHn87oW;gO)>K2v*{(DLH?{Q{iUfBtWs1CY?R>&ney5!lo>F`ne4wpDO9TW=6yb{?M=&FNfmtiyy*syAj2YUiE*%}6 zxm@kK7EPKbVyfC@Q5V5B-63*#+(OWU@QRUpD&H$@fvxk|3LBgk=2PL8|%DtQ*r zap^iV+B3Vjhc3o3F4myYo@;k<4;(w2&XrxPTfn4BW7r14&}c1e18`=-i9A4&x-f|B#F9h!!3VQ9h#ZXWsTr$NmOL|$nz}ma!=Y_b7iK3|xA(w_L6m69 zrzY8)ML+YVJGCY4c*WW(&~z0Ip%a?42XwT-rL@TaqW{s~N&*9M8JXp!a)? zM!*?g&Iwh{3zJyyG;6#tG?+`#cmYIMPGXyzrtZCILt3#!0#?kl)}ZxuF6z}5wr-bB4j7UU-+2)(9n1q8r6oNi(_KM z<38^?s-4uvS2)8iU54Cz?hnSy@sxJ0#kMnbsWRK-?(XVLy~1nt%4KOq-_o?ScTrl> zyEyfz%$Am{32QnZ20kO9I_s%@p^H|eG}K_)g9*8WGmPDgzA*bNv`I@i_^}zSQ9{Dg z+oDCg)`$_<2uieYaE(C^LLe9__eLWOOnZgJ;0WzDuK~Lq6)nL_8VeE9%f##jfkj{| zR&M;Js|EoUz)FuznP|{OFx$;wO!1!a$mtBjCCu-mXwJX=`THyD%@?FKPfFYMX0YLL z_aoMt4;{Y{brVXo1;25f9cNI5AoV6Y+xTO{7j4NOMpW?+8hBb+G@|VSmXlomFdc)| zhLg(;h=GTpx?N26YDu&MKHIb!ZQ_uOlc3~$PM9A#iE+gpew{8zvjes1>hAfYKwSXO zA8oH{$SH1a)!l6&6VtIwAxD1TAcQ(31gCUM76Qz|STNYwb5W!D zQ)kE1fz!ijT#|Q4J8v(J>HcI1t!bUzZRFd!`mtu(I5nz^I#eGH9ZN2HYFdI9z8cJ} z!3=w9Is|rH(jaX(Yq77rDNR@cxvR57S4j4x^=nt9{&lO;N?k$OsT;7`BuHW6qGA@L z(!NDom~#=5_$dn}k3mcKktX@kfIY?TIN>RwjmGV~%E$UHnj7%SQ5$Pt2t7kX0LlS@ zBfz1x56X^R+q5<7lB^lW`Xtl+G+cpQoA1i*Tq?p@{f7J@lx15;OKT=vIP;BTrhccU zwKkpm*p*@a{X@%obJ3bFg?MgA=bbNHOlZpxioVTMa)Z9NJfTg0(3c-=H0Osf)(^wr z2iljmv4B<^1@WC^&V$Wf9vqQ^KB1qJS5hHV$zL_}{ffb@pM&zF0z=shOJ&f0Hr0gL zAK`w+mVpSbKj)PKbpbrDLD&)8s%d1VoSD|`%)%Ef55EPL7&zrpCf8FQIyt1xITPvVsq^Xl z$YeSzjpoFVKG+~8SSGc++?OspGIZ{d&`GI+sw(Wo!#3r44O9pqc@?DtiYizSfPuI$s*kxQj5cj+cB zb~VS^vV~9o*hs+;+tF_Vaas3 zh;I4|K7uv|6_LIYqj0o-jS-X<0V0iEnT(@oLL*MHflC4j4H~~;fmMb{dpj-{M%lio zBxQD!!y`R|0`e-4a4p)ig|dXdr*I{pLz9m9S#7WbrypnBE7dP%=~`y zGxwykgQMyAx#9Gl){%XVS+MBe4QekBcGQ1jPXJTY`gsok%M5H-R9fgSLmD;h6%AD( zJ&hAdpohIqkK6B7&aK!=q+Ix*zHKtv&jV-zY|!#YI@yjRKAYkvFOf~N=Sx)Go?i;o z1@QdR_bP`TFLSxKnac34!c@>Yiz)9fFMMc8V%$nora(RInDhGOSB6I)&<^LC>k+*n zN@);gTrt_9HDAuuvb&dKIPDTxY&1eRz>HdT{&qxDh+lhpS9)>J@q&uuSR*E_6vi|* z7FQ~gz|1A5EKC`1(PkDcT9lS8Tb8=Iy3)mqx;Od20SR|q&)D4MT& zfF(^zZq|zts+19SXkHeq%EN$x7Aj?1fJu-sNWtya6CSu}Ic6UaXl^G@J1dRir={6N zOS_ulzeP|YY?MGIXeT%S3aee)kIPg-=u!{I%Qij|+SuS~f5sV@)RphvdRG(yS28M# zylBXL1qzKE;mj^>j#y1;=E6s#HBfv;xp(j5kb ze}8Qq82z(u)~b?TK&$NO=hmaPXSwFpiR|KXN39-uk4bLO=-tH+f2)%F`9PD(45zO zVbZ03XzS!h7za}hCXd!g8U!IUsA!W}OQkJ>DeF1Q?(onGjg@dP)2(_;H^QuqBB&LI z@C%`(DQF3=M&z0V+?9l41*kyEjwxVv)H7>iLMtUS5%Hj1?itZ;3fG_8m;6faSr)m0 zgCV}wM2>*s7}bF!VO7(*y~$6+70i`GuaK}F^np{LE`UF9lK$)hj2E>*A6;N-H`co1 zjaQxZawE(z2mvz!gh50F>yYQyAN^2TsymzEicHy|Ik0P(3pSW?ZkO=oSWmkywqVVZ zHC43PlV>lazkFtQ8j#S1p>%6n8sUqEOL-F#Y6x5GRjXE|+itrpEm^WeYs)Q4+Xde? z10tW993lE=?QLlAf-ikIa_qQa3`)p8{q)loylCJEx05GNT97~d@WW~6&YkJ(*|Vux z8c@^7NLr>Fx{A4!$sw9;vW1)SCnPl9*u6h}=+>=i)pB-i$6BM2QX0xE8?p$?JlJ$C zZs;A%9D%~D1TbRileJ>Jw$a9LqaFKVZz_n)86>xk)@=l29g15xOJ9KFkC6$oa8iy4f<2)B`gX=iq$mZLvtByAF+XuVxMizIM$szwe>%<#YOH)>*(WX9n|2;ZeI+~6gIg<7tJYu2CwDd83$9Mhu z^=b9$)y8#TU?3gWk)`eyU525lT<_v8l@_c^8K2o9JXNN%qusO;3ND{8+&1FQmArN- zr{Hp}XI#u6ztU2NCjDUC82s7c_HdOY3`mSX3PH&%V+c^_fuO6j6lFjofYi{+VG1x$N*xT?v_ri^Q~Rx&Lhh6wfypNzTcwpYmq80T^$#xWv`27H zvScuRQ6I91Defrf$3GFoXvW9Rj-TA3O!>0{DZc>CX&A zz3%5dHJX`wsaVm53bQvOwouk5*Tl@Yyk4wUFMZ^|Lik>PjRc$mS&NG)MQM)mBYe5a z5v`XSrF{F71oP|rj-~(l>^o*+tjjVLjL=2PMHoK#;DhPr8*k8#^$!y=#Lit|&DyfS)_9;dWEI|L#$=E9IcP$|rW zNhl*X?Hj@sT58Q$$)e3ekRnhlP;+|cyX4{gz(x4dH?oih&cKnA>8Tf9ONWo1)c1?a zv9A!$F6Q0~GE}>Kna_y3;CcfLpVCslNBzqd}TB<7sAq z;T#{-utrSZ(%@}evnnHlX9VL)CBJ{z+U1K<|C;6L)=ewYAAbF%OxhT1jE%=dA>hRz z740}$2VA3hq8}i9qkR7*FX*Q)t%l9d`AWFk~CTu1o=sjg49e1~W+M zzHQg|sF4Mnrkc@!Ime3T+bSW~$(pYOEazCcQRejq1{b z&6_u;`?Y~-`HEF(MtCsQR|W*wm7k`g*#Ofb+&kJ^EMWNtaF4!`+ocONn3^tAn5JO%f(DF}V639$-#xCbre`P9s*Pem&&8J_s&}FR|jTkMQ!2ufa>YnDbth>$H+ZX~y zI0lQ2Cu^E3bTsM1cioz{-@G}>4teQxDn8p0h&O@)Ke(#@P?PM&A`UxJ+agzv2ckUX zKfKv*Pw;3tgTceJ-QEaWHE^LZZk7$K*-H3f3iB?u1222bdOG>FxA&*#UVbB;K7Gzp z&PWrAE_ttHlfd}Uq29;vdBN1A+rLByQpNB^j*>-Hr!Co7)h*%Mtv<1;PctVH$er?c z$?v{Hzft`rG=LjdKOP^wSh;xQeTsIlg}ut=;~5j9Bd!lq(_EMN`rc#S9nHY9RehZ0 zg>tC}`CMlqdQmejBDMz(F{ol-rL^iVEGf7udc@#X6oGd9)Fuo%JowD-A#2VYheMe2 zgFM7n@_;pYoL}#d+f{?D>B%SGI5zaq|5sh>aUUE7>KgC|N6Vi%NXQLlz4TvWSijT- z7Q>qI6Em@vnO|Zv00}|8@p_RX3ryp->sH&-+7@fSd`y9l3v_k&SnDjpmnq1(sU;4jkCfPwtQ(z0n5|Y ziU~oiJnIWehm^zO7oxL!W zUU>D*bW$|IMBSoA98mL!V$fy@47h~RuGpiRmTr{hI;{;(oag>Y4Ew)_m3Nqp@nbV- z-}%9m_6?@R+T68jNk`fy&2^~;PQKbyZQib7m;__nOV#QsS34UZF+iRyVI)41Y0ObZJAN|3$CM-M= z#JKrMAbsvr52lACh<~(ePx|T;&!@NEddv83-@e`2@sBix{tFM@mOlQGJG`DbIDFBJ zcg3iCR42-HXIu03MNAJ zv?J#)?iw3JE_(Ta8IU5#DTh)59T#A%1YSrR zsvKywnqg^ZNt0Rx*QxB(q_$nGzOiP_8V?TG6o&v?x^$`imBFBLd$6Fsi4ETLD|WqO zn7N>>PijxWe|zz8TG!jA*^8ER?Mh8ki#xV!u*WTIERRg+vy*7VV`I{AsheTONRxi# zt5HR4`VCXs#jsIp+qJ9G!143x$yeUBfJeyFhZxkAzQ&SB5#CURL7+{Ara@we6-@#0 z;zvIJlp%sh5&aq%ksepoI1Dc!Y%#l$1$8x9-8GLCs0-kEB<|G?T5Mzh)@oyhs2AFA zEuL9vbz^2G$OD*BtjEdC3$5RE>-s9f7Z@-xcA<8Op|QIe#={67#`LGp?6aSAXuKm5 z@Yh{;UHZaj9!)o0vrKEeI^Hp%4LM@62-`Mocxupk>&4+gPfahEwtMS!Yjx|CK6Phq z0)tdqt(n5i_2l6wyHyT1UMYpcDYt}2Qg926rUAiQ7^U0{8k(g2vzEO~+Vv+MxWm^^ ze(B49;iF1uz)Y2Q>8nlu*ME5;J$P$>di=46f+#MiQj!_@+)+WG<0@pF82aGHKv$uq zeDcT+!3sRmsDeDHr!!=Kj&;2MTI0pWF0~Ssq7SvFk8ACp{;_-a?)3WWuU7=D zr;y!0VvX8>^P}KP`DpVVM5!&=-Cn}_`};kU@up@pUOf;3ddo`nt93ovJjiCjJaaQC zL9FTN3H5*aV&JYfMR0i!I7a84)zn1zV9Mnlx9dFdQ?DOPufBCKHK=aZcvUrTJk<0! zErt;o#YLYCk_NSi!(Zy-wklyzIU=>;OsrkN=ozMT03iirBuD-aKlupnZk&0N*t%I5 z3Y7Ld1 z(Lfj|z_1a-+~~wwwSN-8<@_= z<9BNfIzAczCK;hXtLg@3&$?hb8gL*QfhJ~KkI)`04fBZp)6 zwa$yPbaC+DK?`(_!_hZ6Hx5i@SJ03-|GjaE){GamXo^~cE-gbqdtbhhKTHwFz~bT! z$iU!l0wJwIBXp}Zty(7@n`ueMPo7f$9Z6l<@b@>b9Q2Y7Ex|ylS+h9|`f{UYJ3}!z zrBk2v8ZI*-3iIrfBscd@_x9-Mo%#j>eu{JqkkQ)tEBWPMc>ox^&&(wCjE--7{`}ZL zExvX4{86B;0nZ<8uX@NWGmYmt_To2IOwIhAX|dq+WPqE0Jf$fA&o{Mh66+CVlz#f&h?7X zz*C~MaPb6>V8w;4F^J%@4vv{1)LAQ|UZJ4@Bp4dGBd_rlAed;}Xr!q|?es)6u#GW0v(_RX8+ZDk`a^#&S)lxbV$Z#ij_~b6pG1B~%|U=qRj~QIo-} z+jNK|q>HesKj2hh;1A4|)VF?Zzh$%6!*{;9C!IKXrbL?#)N@d49)nZCmY^Ghv1gxs z*1O(mGx`YA%v`2&-#vF}Du0P*A$oPzo8xig5+Y;TOE9iBwl*Eb2V(iTZdISkqfK?U zxAL4ibt*NgO$W4r?wjBIriC#A7=h2!Hb>5;C5WHi_pa-|Q^j#SSb_^^#oBO0i$CtZCC9GK&_WlE>p|OM`sxS>_ zLzo=7PJZ_)^i?43p$_48SF&o-%ZV^2#QCBv>%uoEy-?4(0A46cUxnq2O{IaBbqywxx1h?$CcaaPkzMnEaX!cn+Tc!lYJh~{Mxsu<&?2aG93`E##boYtBb zM`WxWR2Wgzu>h#mV5|)bU)Jx&$Ml&xF=_-bnlNrO<=*c0^t-?L`ShQ^@nrhjr=Ig! z;ydrWGd-sZJT&Y`pLwK46E=e2DTh&prh&Q08x@cpQ_b=d#| z6d|ni2B0*#oI)REjIeO=zY4o!TAKremHr6fE?$sXWxFU6QB3GKAJF7-`tEwx|ffPrjtXb((2yU)Tc{WmiKa1skBJp&@!zZU1}4w zNv5dj6Aai`Dw&+&C=vs?*iXPaF*DQZbSw2GunRg*&YCcNh+W;&(yqNB%!6KK1#m$e zuZ-J+iQ5R~WpX{n$3&qs!)$6>B$G14eMYwC7}cao|El_;SAY-h1y&zxv2s zsYf>&A#8n};A|GWVr&+I5+Zb1?^?zdV}jY3;mGE=1qm!%O1RRo`_wRnR4^<})2WPU zO@U8xq(*M9_X;<|P#)^XhAYRZoF)x8d~dO8=<=zcm^W*8q(fWcA`yf!*Jv`8dFH}M z`r~iC;9Iqr4lO&RAKbPvJ^o7%R*9wZD#mYQt$0)nb+JX|z~f3kG-A@tO=D^ln6@dY z;=q$lv>ern_AGW5R+)BiZU2$b|6$kWan1|}w@pba4^c54nsgTURQjWDKI_}0Hf`FJ zuD$l!^u!ZSSkq;lmudWuKlG9GsRy^~#xZG&^bOR0rc-5?!4tyQel$jxoy*A{k3WR- zsFp4UN3;n`8{!V1Jg+Ziv6LcMqAAn0Ws@E4$nwUd;=cdX)1J-XEP9!uX3Bd&8Z-Ur z@g1AB#;blH7#w}`W-rm0<&?=hMNNGN&z(`dM!iPNk_>TU+SJ8V^;z8){%7CS^`u(( zMGN-Vxr9%%?mTDB+-HYfFWNpxTG}z_Ad;x=^jqQ=ar>L{Q}1cvNE~e^G~5D3a63=V z*El=<PJ#EO!1Au9$Mq)nhHx``S6Vng2*bz-Q&3p^m!Ndh zrd2wBs~fG_I`l2yMP_a(rHf+vh@R^`Fitcl6rr8CZ(*Dn_nZ%n(TQ2~qf%vavrr*p7p z(oNT`Hyuj3m)WjM4u$0SLE=(V!b%z%!arxRJCcyUHZvY`+Ym8@L#-(KpdPxv6baf4>I?2wj#Hn62Tyai+n!BmDJukNRBkQeCXV zEnL=G5uVa?*=z{W5y0&JXQ2cQ*aB5;v^qQm73Pvfh) z1dX5v^osUV3BCK`B^=LTG_A>K)*y*M6XBCE^6}^C&KPPFYlee;=+tm}`M{9;@d-eL z?~WZi(heO}>Jp!t)P@y=8SrB5%bZ2frKP zr&5nDc=+7U-J8x`oJ=oj9hj>uS=)SC?)z@LUPraoTKfvFYV@iP)x*=!s+Bc3u~Ud{ zA*{HltZGapoFKP>EL=RD3|v_*$hM>WAY(D%hISY;Y@Fc0AK|ziAGT9E%sF@%7t&v5 zYJ%82_s{>&|71aX>#etX-GAS{ectr+zylAYdnJ5-{v)@G{%DhIX3~A%w4>tSXr0G zO9|#GEmBMu<|?*h_-NmrUZtGOe9Go2Ga-c;4{}J5GOY}AWD0Of)68hP;109ohxP$e zThn2g9QR!rhEh z<)W>#E{LK0!q7;|%~qJ;Wnye%VnquJ#;Dxctl^(h427M#Ax=GDIYaf}{in69H^mP!laae75c9WlY66bt5mtj=E3wiM8X&WI` z{4^r|{BxR$Kj(=|&XKbfNY$|H`sPzFr+@d=XH#>>qO@`2Mt|Uf8_piO_m1?xe(@ir zTee&yjg<9Igsg(*)j_egD&3*u6|I$sfU_S z)R1vKu<36IF6H;YDFiVeZ&;zT<;x`ur!`PJr(3+}TclHO*WJ=RI;XxV^)6lJyTBRj zu~Cb){+Hi5Y>j&DieB%MrZ3U&TeJa<4O#AYa?>^l;j-5N%%}?kfN`Zic6ta*17YFl zhQTgjP&#|Dy*#4#r(M(F^i8#X)QRyRnRD7=6XwB*GF!uLoPFwOT>uAt7wB0Rzzam^ ztF@T*o!af&(C~QC{t$i=!66jIK#F$C#*wm492|aDyH$JBYJKp60-N-y*<79_ItiW;>H_q)LQWAv{D~~=wG+OCla6`NG9n9L8G^T;tm^LjTgb}zgTfs~TO9~obsXgpgA7a20 z=fy*yf^(@cXyNyCH8$;;B{69(P3J+BW=)_&o4&Bbk)ggtU7j&Hb8g5&5`o&P!NM)q ztxMfHDur0)%UKxKgxz9N|?M;UYc%G5CntfsTfmKRP@# z$yWWkSs)731@Hn9`f4p^!=mQ?(V2$FWBOSeNYH@AJkSQMC1!UK0Kpc-RK(SohPyc3 zl-?PP3l0#zY+m`)gLkKO%kqxaEPT;K__34;bF^SDLPUQ4Likz&8wbk7a4Cm1TWzj_ zxmFk|@#09q?DXkF7?ak0Ny8MSH)Kg0hEbuZ7EK$NXd={)xKcNSw>(4}222>blr+Re zm=d^XF?$JiOu=b!S9|K#caL9seYfEPI&ye9SNQ;m_Xq;}Rh57$}Iq%dB% zoLm&jxPeCmMO+Cl_8frOLme=-!)XSs077jM7s=)_^%7Y8V~v0iG~n-D)CgJ_eb8p8f&;bn$Ra4i6qAw*LCv}^Opg4l2Xj*r+6fmbz!;g5j!QLSH!Io;KhoPa zj&U;B3G-`X#nq!j_j z4;+`6Qny-LEHYTlK~yL(nmaSl-q0A()KZ& zAZXJjzJa6X+#ghuZ2-~62I%%J5%K5uAh^sG`E!=u21A8%o;FZ8Vs~IH~jvg zp~>SwtDA+PKwSVY44tp)QkHeL{9e(35xm|dECyiV>k)ia5EsoDrZU>GN+W%pkCYpY zgd2>0{_g9f@f0Rnv|hMF2rDyFm`Y}(#b3&T@!*EJOme}(bZoSNnZZ~EModMPwTlqE zXhMwi5p?a+DmbUhdL06oFrWQYe(y5XdN5ykBHRqU#LEUt>Q4Hy{tbR%LJ&~@VC=E^ zhd7w486bFphtS&Gzb?J>_CPv%^r(-s>_2o&*LL=%xTT3)Rk&3*;WE%i(JtF=SUO=f zKl0c3b4KS2cYabS*NmqTbVN1SF5wLmkDqh6LQZ?Ix~Cb%o%Hj|Kf9> z^wLC3HS=);rkQmfR)WXV&>AR}saW+Ch~{;C%4ep6w#H3c)EeI+rFf2%(Z;diEx1Hzi9oDs^&@6`BQqz;|Cpf9v}G^HL2>(1)xA(051TMul6FAcQrq* zODK9_@CehmEP&B=Xuj4uvcQB1;&16%lDe0zG!sPlvf1YIpL`%KYGcYam>3LzqcQLk zPsJ&3OvzDhok^=KUyYX7Gm@+~Kc-e;bK60eZFFt-G;abt&Ep&B( z20~YtXpjyeY%SPlHFasfrVS&Ui#EdT!GH?!phTsiJX!l!Sy3l692j(--lLwG>46W1 zuk0+=RN<@oJ}v_j&Y+$-dtSSxuknT~>VPpHmRc{S9rn`m-l~WDTF4!f3w_+;zLAoj>hQI$G#5?acZv z+OMXWipv&A3bFkJqhO zY#fY-U{E%Y`M3u-c(5wmy)S|?RIe5d`1Tw;ZFJmzr46A0f4nz2qN}UZ>%YP*%8BuX z;TS-EC|2>1Cxo!X^}y+o$=|O{Q+Lll1?mEL{%L&Gm(bVM{9Ag}d)bI(0gMp#FSJoT zGb2zcF#>))>o!}9WMt2-=Z}8$qv^(#ZDKMZeD%Vc@j#r=n$eli!m!B`EGw9g2LobWoSkgah8eV41Z*2q&+J&$2OQd^p>ssU!dU{CvcHR1<;&7v{>`&y($MF{ox9SA zgw^f3c)}n^jKNcwuAM<+q&f_kGK20_`kPic-0{FMJ?*&sK^gkFTytiU}bT&!#W^>G#swwQH>jB8XTM{g~`J(!Tv|a?S1T6!q*en;D zt3uGJoLmQrrmhGq+8uWY*yw}!X`85btjjYf1Fi>Wc}ai)9*`_}Bs_sNMPI^AySRTw zxluMXBM%sa3)}4~ff?;8zw#l35uA(l!Hw-VZA!1aeZT`x(lE%{x$kJY`I@C#Pu6=t zSuPK_xH&H$Q_qCA$-v^Ep*Hv^~x7c zpjtNf^rhA=eeYHRi#08n?>!rr=(Zn4!r($3bRO~*po^j;gb`oe*!n#9QqRNW~zzefTm`pUxI@Hkd{?rTs7&a^2b3rGcgD?7YS&;K~^W+rMZ<1{=_ua$06*o;o&M z7r>cP3ue^?@Pd*0>Mf{x83#fL?JqP{+{NfUu9()Pt2Ct+S|yuN?z!!Tw01Ec8%J}= zTtEy&a!brZu*6`P*0n%Hpvi5aMp*I7T^KcMx(MLlCak%J)}$n2R!k!^UEJ#H_|R_A zcF}4ZwSfjft&&xSEdN4KhBzZgfrMi!&YZ@$C@+j((XPMX1&%qK2mz-KPNeFJw_CGv z%}uCa))djFBS_~*XVQBIkN8`(%oZ%^ZcSUXL20fbH^6xY>?kA3GR<)(9Z&>Fdf>eda*od>*~$8c~5cxF`)#MA6?kS5RBV6O!aX)QQoV3Nz{HdJ7j zcGq*X4ij(zmjUKHVM*xb@>s)$wu{sBzpC$moV8yyDLQHWMa4<|* z4ct#3R1h;NS4##{Rj}ec4W~?%DPw5?xVZ}#yQ1j=i}V?uVQ2W10u!_iK;u@+xFQT@ zR{7!(f?WAyJy^DwxA7quc-e%znje2auEJ-4@ce7L6B;lK`pAj1=@a+fQb5=yb%7hU zYC?VF3A^}ZLr?xp%xZi9BzO7M0IfieRL~<3t>Wnb7%bG%GBvqtOVMVe-1+8NV-I7%X;uZ9an0cnM|wubQ*wqs_Y`bu^mQH=2=fa4U9g&g>@Ih1=oOjw$`XpaGcD zAN<8rUP~vQw!in*>(bBNbEDQ+buL%8TU9PfL7+&u@$m{YF@vBK+A6~(ZIeDt*x=cb zMr(EfvK`@-%A4|83W&;JmYr*P56m7 zj;1xsb&h!D5};KLaAi0%+}^?EBuvrAwVE7JyRzX!51Qq1zY81;rr<-S4A=NMyc$5C zt(%_?1?n2`PlxVTRjF%wT5i`p#yilgd}PO3FoH)?&+IQ(r==scFJ5LQ3fn{rWLijRl*9k0mH+aQkhvzGqM)^{LZ(nHF8p%H+8qx=(X>$e={r&yv3!l7C)QFD~ zOsnnCd=Vy0t1_yJnGBXC0uwaYXeYkrqq~?HtVx)bO>Wo>tY~kKo`r(|06+jqL_t(9 zGiXCyb(0($%+;u9l=Mm3 zn{+mrUbZUqQVeeUv7ps#x_0FvUCG*%1`Z!}9jNQcvxDjO>sCb?_a$gjXdXh5ve=}? z_py(k9rl@Ep=5)Nllm^vM;@RHv?M3x(n!Y5sex;U!-)4_RD4cNF3^A{R5{!tC+xWimUmoj@G=^wXb+<_u^onVhCt@YjjybPkXGp!7P}*4LdkT zFb^0Aj09h;2|v?-T%G{~q^y}KF+gcWX12l$hTPUBAuML>o2qI+6y{?{Vl?&_E(Ej) z2xf(!gf54Ygsb3Ju__qC)LEMh#%D*(gY+fKX|x z|2fQ5f-vP*!U-aMrejV4#9ez2rnd%;`{D_%V`Lrs*MIpD-Q?6{O_+6Grkcx9BkD{4 zKnO5EVCfYTIEv;1>P>EPG-#cd^Vo!0BX$^qGTMg0RtUz(V;qG$sFrfPyP7FzG+7D0 z2#<|?K2I(IM;O8mVOER>OU!aBd{$G&6N)2Eo9_u1vkm!~7=&ZpP*9ZNTF)cN3yb0NF)E2}@1$zUWKiYX`-Onr<_YrnL6 zlnWk0rvNLNWe2{{r~EwKe!eD2-MN4is0-i)B=*%>ls=L$0K?(sX0{6EhT8^iK!D7w zJ|6CL@-qd!Qnv$Xh^L4dOZt`NlX%EjDZ1Hgs%i# z!LK5GC@a9|8JkWJhQrd&cco01M@53oAsl8TtYP{v=b0v^LAlUFf~P5C2P0Hm>&#f%rYj4d z{?P@WVTI8jICeU%u1rHmWz2lZYI;>15gCDY6YU>(I&IaC#4upO1S9?_T;qTT=JUwbUAStQ}B-OkK}p#3s^%uEJfrlP*IEp*GM2@ixHS|~Wl z)~`w1<`F=&vuUV`l-FDxNpOKLf3lTP6F{Nfc z0T)nun7)%cD-2i>8BREY$-o|_HSf(?PuA(Yb_xShKD1o~AydwU2}exe!!xFfQyP&_ zJ#_4prv8qn<7duGpiigoz5JF0aID3e4G9J66#2jx0JA_$zvixQ#cIv1O`1iI?r&bM zTaLDDT$8TbuqLgRR=T98E6P^7V2soYEGm^TJO&K2Odc>`NG)dmP5PE{3@Tz^(4YiU zla1+y%^TDAUw+dx1m<^Nd@J33>z06+!GfluvZ**qKp|mHRN}#rB*h=@@_k^(K?9;y zfGv{Lm}qkXNGQvoX47-pbhY>B*~D#E`}gnnb)#G{$#gU8xH07%f{y_d^#&OPDZ(|@ zYhy+OL5sG@OorPQA*}P;jap`)O~~U}3E3FJ!W27uv8V^}`e(YjaYpp_6m^`nWjUi^ zN}>m0Ejx_bMd*30nL4VX)Em5~XhgL&{UuE(rdi7idB-ui9d01SX8=U-Z#YEXy=6su z?@)i*`S!b-xd}~rw=UVZ@8%7W&M+c@XMH21$b^4gljXLMKUiV!u>Fx1tMIwN3Qf)x2f}BgS@Q5i;=)trpg9`}>5s@!B zHA*{P*3<2Q3m+@sOF?@MpH=CZwVUL?HcDowxQWd{iYT;Gg(|l z#Ljuva&M(^GCi0<_=ErUw7>qtWgBR_zww37XvcelZ@6Num%e~7X4;+E3{08YH@5T{ z%@EMOv@LyzK??$ycmz&NH_Hco4Iv|nWrAeC9`O%Q>xM5@Z z;j6n0hqLKB2hOH#*RD(*ZDPlyAupDlda8~sEg`HqYBVicVi>5zdy(hxmBYQk`IQd< zm~4Acir0RnwL^VxcDAkon@|h?s0-kQr}FP{Lqv_+mPI{7l+2a3uZh3vW3NJOfvGaoehfRpKrQcjg?1n|v3?Cah5(Jw50( z&#yoABVV$A->uiD2kyKnE$R-f*i+PGa+Pwus6S3I%_dF5YvNOX1Oi*ro~px&RZA=Y zpyB4to70607o@$P)cw%Qm5j{b9e`u%7>~lUDYV5~83;HZxyfHr%Fb;O@CY|xC&6W( z9u@jj6B0-Uul-tZN_cYN#B``EP zoxcCtf%M5cuQk4|RSms8@MH(J=+veoO@;?fqK&oVTpn5G*4OCQU?ZmzkzeEJio1Pw zHqJ=RO*r@8@+zaV8KF=3izK|qtVGDB5-snAjq%vM_?kjKKtk+>93!B-qX;)7&v?~ ztzFp{bbuU|Ak;_sYD|Pje3=QD)J89B@dz@0N>4o*C@hi|53|mpijfP(oMDnSYDqvf zyp~Q+Xo{Qx5n*VKpST^8!;R7c7Y!Z@y`W%BzpE@I{ld>bnEuTlf7PGoL<`<^ zcre|ud03nA;+-+_;3>oLtk8f_%vHADwM&hY<^fvHM$V{bP7Jhwh^>Kv{c<%m)ivNu zqlLEW0(hY*ezlf2Jw2c|zdzPi_0sZ|^9G9_HE8n{j0`3W!{VkRc71xxuXIXcCP!l2 z=BMPdC*r~_?IN%D!nk6i4vadcB+GS#$Umlu&+A*O14mA!?>wig9EV2JIcdOC5;_?2 z7v@*|SF-Q9evM(Vrp)(&sRvB%xwrLkbzqQ5=1Q<4hIQr%e|GN6Uwtxd-Skd+?4x(5 z4Qp1Yej$Wm)UJ5WV2w{x&@)<>gpNcLKdM=ShwiyO{gpQ9@HHK9d3(Q(Bi(kr1(SuW z(ieeL$}ct-ctDFIC(lVkKT(3;*Z!Sf`()}Dp6gckMg3?5en_NRVh*rEw(C;!Mx?$W$Ngi1ohQ~n}j`7Jj7`7sxJ2Fz&fHSog+NulSg{JsbT3+*X z!@rttNjrjpz>Hud@uoMn2Gc-b*f?D4Z7`<@(6hq+91_eiLbF(Q3Iq~b1zH?}mrXd< zj>LFiQtV(ISKI{&+c$Om<%yTxN+)zaGVltVYTeha*0)52$-lEIuJJY$d zr_(#TUQ5Rh4W#p$I^~1#V?tGO!NQO-AGxvDo3I+1bbqmqKDBDP^8Db%G_2XlGn$j% ze`2sw|EOb1=SIfTYkLk!kWZ!^cifn6+R`5v@0%_~AVg|}(2O)G7(0{EaLGwsR?#9d zaWfX5?&H>^@4q&XKKH3HT{FloSs4gt`pVWnA3oT7@I?CI>+hz$5{P_*wzpSx?u+%z zMLOOD-GX-0zVL$^s+gttFW=pnjvqgsZtP!`KJnpg>6XpcsGPVLI_&I3^f%6+N1h@a19?9K0MK0^VGh?obCW(l`90AtXwZ-jo*YUyY*-e} z8>yTP5YTMq(t%NlRYe>n!0sARE64ib0wd1l=LdCHbq1;l>#l{SKwSVYG{vvd@^+mc zdvbH11g#mKrYD(R%S@tC+6;^i!NF$-5dxFLgB9jgrk1HX%*5QvZuyiC=7m8RjkESE zF5>&4tu1LykWs%9p&gIwV+`jm45t@%?Mu(S_HH^qJnHmC=mKZ++NHYqza?$EVQYHu zv44`f7xkt^5;~ZpI;Z-zuYEQB@QpobW^_m&Ax{#nObcp9DQ^Qm3C3v&+R?lQ$e=*g zbva8rdeXJad(x-2uTRgvb0WR;?kR@@8*_1dD(&2R#8cr9-FZ4a`p{k0^r*Nm#Rv*0 zrRpsq+@LzcJgs4Aa4|7HocdQSOZ&BPtgo-n8V?_!=(;Gl@7}%Eo)I3Dw3L%_s%0VUNDu>|3Au^$W-Z~skirH_09X%Z?U*{y z|A84P5b{xn(l;Hhx{w00bnBcnXQsKbm3}2^%N+^u_GP%&Obf6_wWv;zW(n&{(AcJ z|Nd>i#0Vwx5^c4eCs9t-1Z0CDL+lO?Q5HN9w=+CVg(O%fbnU3SMj! z`u_KxNI!h`*)%&goI2F|+oW>p9*?wc2+M2bx-FiH&Te>JcddGSR(Ugu|7*8+mjj!HNhclWI|LzNKrVHAU{iz4H zr{zm~m5y3RU9l0Tvj`^GI#Za6g5BS!<4ErwIq9mg#(G?9+>3SWsX?2!SPy*toq_b7 zAHJQAoFDTi{}2M@0t|#9-@@fPv>(20i)neSj!q%82PM4DTo_6}*ty5+^=$U~%2&SP z0n=S~-DU0gKm64X)3<-HGyTSA9!{(JV$cHfruN0K*$uqB8A){gl}|sMjvUzMbyJ_Y zMIZ?$ItYJ=SvFQN06;VKZBufyGrDG>xqy%UB?-k6!|AgZ+~!A5oJj{XC^@6S7aHir zu}N==Log#)={ATJZ2U}jw@dJ@?(0pfmupr)_ayhPU71!a>y^7FE$dyR4N&YX4q;25 zi@q0Vc(9^Ak9Lb;x*6Ig`ho_6^e4*lG_>kUdg$TJV*x@>YM+g15h3Iw^Wye~^zg$E zrQDy0Ra~UkKE)J`=9QOUN?-r)UriGu7gC#!q_pd}OuK~d zJr8|4eeNIsx~|debrv+L+dusA^rbI-DZTlM*60*kVa}>ApqX7idhTrMTXa4x>(&&v zH0)o#XH)vi=l56eIwu^TczL(ZA74oS?0@)JS|lwDT)++Hr>dKQdpcTP4D08e`ic$) zK?*InAcXbxF-^Vy)zhz~XWlrNR<2yBo3lF8p+ko}1&lCd_Tkq)eSdoRzU^t-jn}EH zm^mnG(1j+0LnG}|t+}&!_wL>4cfRzM^w4dabfeY7fh+j( zFM1=ufdy^|o%Ji0X!Di6?W=a5W&@VOz&E~frTS85)u(8_0f%W^SF-{anlK3Cc+>Y@ zcwKG%UOKD|ZX?=#{*xN;io;IqTAxhkG!T00yCL_nsJPaO^n}q?U)5HbT$gvW;pBR8PO+ZQh*IrYYb_fzJ%wpTp;PHWh^ar5bxw`;SBTsw^ot5)89xgT7(>#sBetN-w|is_QuiuF{DQrU^-qVXXrWUX+$R zaXu~W8BIUGeQi3f%``8+cg}dAIln0Z@NfU@Z_=+yIIdl})Iz|V8vH~Mfm2#;`eOZi z+JhJB0JDeo2ehl3bI*VM!?)6zQGLQtQ_~1c?uA^d1(Y2L*Y31@|&I8>L z2pFD}k@>F#MpL@~j$8cu#YaA@d#8`4H+H|5zV`Ia^sR4wD_wv6_5LWt^Y83Q>8syM zpZVC`v6dZ}O0cm*xWxkm23>1cEKSqnS`!yhXh)U`JpJtR&N1zcP;y()XMm%2FYScQ zH10_aRNmZoAiem;K5uH{vJ`~QPhxqiBi;tWgK782i&7kJg`4RP{7=%SG#IFVxlR;nH9>_T|%BX?r5-7VuIhBLk zq{M9pDH`g#pM$_ZwP#%b|I|qT53gW^?<@cHo8RYH1Ps#ut{DL`p zr}F>H-g|)QbyfG?dzz+dX4Jbh>cuLyT#*aL*kI#AiE$u=P;PKY2;avg+$1D77gD~2 zn=c9B-kZWr!9WNEY=S|i7&qMHF3XmiY)d0q@~CU1ku;K~-T&{u&VJ{Wkdu7h^QidY z-81Js=j^k~+H0S){(G(6B#;0F`V!evuTPp=i#nIGXmCjjd4%u?|M1|KG}s#!DS;M- zrbM1(i@B3QS6w^yXe+keGXGhWrt{`aP8Y3MkuJRUy~6^(r6(SJ zNSbf-^zxm$54`aE^fK&@$~Go&$=EkOW!T?D5Cn8uDw|2sQbrXeAV+<*>nK_ z9zVJ*b+KrOib8#IP(IASXpqoVEt5g;3@8YCC^vrl_8&-(s!#t%4?dN4?meK!Oe}!n zfd9cC(uw!ifOL}B8nuUNq-YkfI|F?cU{r>;^*ZP>FUzO(ws4V>af$QGF*Ch=}fl$Wf za0((p?H_4Q!;*sd%nwETrhgA}8v}2cVzX^ej|Solq>JW{ODo>|wzTNn3rhkGjUcB_ z8r&l&5&oSU)~Bb|tkH6W{Q?$&yg;~K;EM)4e!@fxvtz-Rv}lCPkS6@#gAY3G{1ZYf z-_d~3R3vG_8+XQt*3m6}YBcOlZ##2h+R-!Mfm(!qv`+_z;e*5k?VAg?Aq6xUe+GE zxcu&suE>!Kis)0uJ@C{^Y17u7Y5AhrY03PKG?gVs+hUb7Lei)h!Me;vK}g4=w^d+D z2S0f47=%_;rI!omu<$+d2tPb^@UJwck7-JeD=yz2=Iwn4X^h5mpB;%&@>muk4qn8i zO!9K0rwCS@@D0b65B)%AByAw?EP_-{r-%a;06s;GKi#q&dhuJIef;s4&cxISaG^=n zW+8(3mY`^!O8N+}CG~QD1aP7$6i>xLOGYgeI;y4d0hMco>6m$P?jJ zF9AoN8-j)SEX1%?eZMbk+?KY>w0qIKvFZFbU6Ynxc$q;9p+{KaLWA=oV&U+A;f3b~ z!Y_LP1S!`NqB`{EGxB-2cBGkpjOLr;qTO|NcKSA_ouB1%_9y4PG7op|&>qNI1G~AQ zMyB$f)ZWmT&YIqyp4hm@BKXe7)@hUW`t(kjbw!#SjUD|8um+1|J4evLEcen&FByEd zZ{KcnFMYgMo;NqW@7hZ};+Jj#oHr8C+FI~1z+|}m!F@NA6jD?MiyV(1^3LO<*^|MG+M?Yo{Z2xF3d@Yz?=Jx{JT$S}2u=}Yi_$=qq_U{AMs&*Bxfh>*SV zp?rWAxeG7t3BMqL?uPH){Ybj&(HFEihBinjKrr)@&?NJQg;UaaZDKIFZG=p-`vgvh zH9B1YrHAwl1IDEnOqT)nHK|GOYK`)49bKEwoHkiq1u_kfXiVRK^d-M9Qr!`0>Gz&>!(?sn4a&y>E_R{%^F%1f&kzGT+u|4Z~<}}03xY!<)!DVZ&Uy*p&1`` z{=h>(A$Ue$Tg%RZh@V10Sx|AU);rn*;45JX@Uq$!!i#hP1T-mj1!9qn3ucW<7hHBt zT6EqeIpxxsG_pWNne)71~$+8QH%O9|?N z1tuPP=%G>>%b(?Pm;0f;VT#^;V8AALMpz#_(wiEU;hPpsOlx1+lXhw%@lRI2kVdyR zrxnZQyRRF%RebY8zgn{x6J|6h0AI>RU+>4Szc^i@1`rkkMmO^Mvx1V=Nfw3MiuxW$_ z*wxkw(1dS?`>Hg0xJT2K7#&@g&YjVssY%W0u zK1GZ_ow9xYmhXKApmRU02xF=UqeTZK#Q0z_+u{HPj%5pGOJMX%bBaMIJVWr~2#=g^ z%m8c&Vev0v!Ho_DAPka%g*A`|UJF>B2!9WP5pWO&071Z>J9}(8=b|gq5^27;47R>0 ze#jdKC>0xCfQbuD$!xlIf$;UC(T_iSgz;pRkE@ z_OyxOsTwO{1B@X3E-kKsGcbz@fbTC~eNH-O(X4{cTAEPxKsgz-)rSTqjgrO&Ok)W} z9AN6ce5Ie$!k;_<2=hs4ptV~262Ack^H$d@mM=Ro9p}$Z6I!a$ zb84up(ZIC^503m0q%kO?oI#v<-bY$dWWP9t1P@iR6S)E`Zv~B zX^Ky^`cZ3Ai_UfG@7JsBjXDmgt6;AN^+{n(y}F*Qeu(SeFehz4(678$6kJyA` zm%2Zg5_bLN=V=h)9Pfff*MOJOlosqd7!ZHqec@=hGF7QcGX;2`hfz}3s%RUH{i+5C zH)#|#T^%gG!Was=8eAZSaWMTdAkB^>?2o01o8!BJr3xDF6ud4SMU++B4}RzPu`9kO zivwk9%E`*IlF#YJfe*j^lF#Y`Z}?CQBtp*AfBWRMAFsV&vfw1L|1Tt~aOaWK-3+mc}Ud%u+Fya}&h(72D$3Cd| z;o6&9($Y(>mR1q>xiOG|C8tGLu6fRg*ELT*nI3*hyRTStvcPrk5Gb6&T5Mm-Su5^!9{_0Vg0pCW|)43O2kv{ZmpGY(3FG>wfEvd1&HO-hkKTVmrC_VD{QyL$j zdBM=HhK`D+Z3C0%ZSOy<5$c-5t@eq#8sIfu4)G2LaPhl+-{G_`HKj{0zbd`;(u-5| z?)9lo0K2>AkjnykVky}qD@?1VhmFOjK z($k_LL;b(M?cl&Y$BA0;I*A;p0Psm<_UV|_(4$}c?ArBP-(eG&R^>S?Q|%$0>HkEl zLYfq!LLWVvaR`<<9aGbHzJHg6Ov|__9XeD&Q@5u2Ok1$5#6pBy23^kingID4aCzYV`_i*dKcxX! ztWV9n-x&Q&p4<2K%Uq0*9!LPo{aT>o$3OmYdiddo-N#wVOcw~Sa(C=~`7^+PyvC~$ zf=LvCi{C-nJvV9|(fQJ(UfjGRy|Qg@S};TNc{LIl8#MeKJ7G%t`j1w*&lgRLe&2KE zO-d8Tw3*ic8$9zNx&bz?S1dkLha8k2bF}Zp1LkF;m0`7Dxl3I-zO`pP1Bj1k{xLNz zVjU0u8X@G1>2;b`|GIz8OKu=hFT5XT&hPMM@&_4&r9?Sg7m6C%8DPV_@cwkyLrz=)Gbg1RKK6U*u{F=6N1u2?7K0-mo!%rZcJkDY^lP8|ozymNf@wk1 zr5rRgrcIlcc4$Sfr=EIB6b^$B)x<#=4-1Xal37TlK@BcInELQL={UMpxV;*M-7oX> zmDj!_UHzU9r>4Q)G_Ac#BiFaOS}7Bz@@E8sEsb^R6CR~B^v;S78k51N$k+fW0(9s4 z;(aDS&=ox5UPW;{c%inJ@~=8c!7A?5a-d>@KDGQm<+;D`%I-HJU}(7`EcrMQ z*ax+%4Xyazg9o&XV|yBG(;yUuqvcH>Bs=u{+&ivH-}&B;EF=)f2pi0$6WUvB;-zp1 zV#yZ^=6vt7JP{7$jX=fJ>~MsapMFAyh^9uZmN8HLf``~5|0P-ECE$xz!%~w7#(&Rcz{uf_z0dynjQGX84G4@7SkWKpL0pv?H}U5#`vYcq|pk6eKJX9MiQlCA0&eht$VR+31^(!BYZT zl~WSjVm)hK@F(_8mc>Ak15hP|Rp6-W&~D9Z#SG0Xz?b>F^v9zuMOQ;jI)CZB^yZg0 zr$=Af>4p*U_8->#=iUPa|CI)HC_1V2oZb;N1Rl}o;@cj0S`CnxA~ktbQ+nfy^V217 zRzLId^EE>K$#mx(x2I~=69x}Pr(>yDeAfA?WlS+e%vJL?3X&n-}l*wyspuc#{Ugy^tP$ zK_+22IQ*CvfoW4+Eu1|~gS;3`FDr-YtwuY74b;S_d-A67L&F2U=l9dRfj`Q(I5}O& z7_Y@Zh=*l?@GcVtC_?Pq)l*y(SFz*2k{SmTMEG zn0D2r=eb3W$r?=!Gc;N-Q&ha}E>Z?T5mK4U;=Z_$KnT;Tyrr2yLm|PDpw0)dz(mIe z1AW`pS%_GWh)!tbz~NVZ07`%df>426w(|S|$HQ9KAd5IB@*n)k<@vXQvj7L0FB%f- zAY-;fW2zGpH#Cn-@A=@3X{nYR?2=&Jrn#tSC~PygX^U2E5+B$w0bvY3Cu!v-tP#E1 z;_;9y6x0pj(KuZ`6@mdjSPSaa1z=OO@`NAs3!@ElX5=vqCE{2hJAPrlMg!M@qw9h3 z01@YiwPV&@o-=K{D}-Dm2}~JY2b2f zf4M>1T|T6RLOM5Z^SjR+Z+EK*)oAokKEG!Q?*u^|A@GEy_$*{jaWZ;{Ke`mLcwxqq?d(uH^xBvsPdXiQ^`t&D$*?@phXTB=wu?90!Ktk$B zOjs}@oa69)NlZyQQ&>iomJ1XF4?sZQB&JdZ4Yg}Sf`eP0HK1h1k!BWV*^e`H;LoBW zNF6jD1(l0j%Jagv+#N5y|1ZzU!-7~D8kpSwjV7eNXEY`yHfid#^vj?49hFc0kXr8; z)8&ZzrgZy#kC=8E5F9sNbFR7tVkt@hSA|lXV#KrR#;zy~fOuGS6M%czW=sGV^D>PX z8dh%5xL%9FTLmzam%&+`dOEkjMcr#1FnHjA>N= zx)x9Q)*X*&6mqOwcGVk}r9b(v|0P}i&i7i2rjFPgW8J!SN*e%{#XzQeK#@LrraJYh z-~6@egJn2zJkN(c%KV0(CwF6P*)2YZjrAIz00@r&h?N(cay+y4X%E_ie>uHH%g;;i z{m6e#@4xJfG+XnKanE;dP4_+Vd|J0*ix%_f)xa>V0j>9!zI?tVzmwt<-7gQ(_=sj^_*#N`2(WR>jXDhJ_noXf54TymmUrrhmNql8`HaKtu^(7z`Db1sXGM z;3&_!x&{e-rgo(??~JAC;~)A3Ewib8j5W%&PXo1H=zP_?>U4K^TRU7fcd7x6)&l|^ zK+PN7lMjyk@iRDz|6zU};f4^V>{dJ*5UbN`GL4C_;kMuD!Xl{fC%~^XBeNGR- z?dd+sPwBEl6#%SCG0~Fq5T?!1&H9#1NYvM)}kGk>d)l)2k^b^w%dk1imT(*50CK2 z)Vy=Qwz5>eKV-8cCje}1Sm!>O(-|{>*`EewPHUDn_;}B6{AqggigW$GLfb1^7-pyD zCHJavgsGYGz(atTGmeG`T^+%j;}n8G_E!Dn#uR?XIJE3x$Jg`IX=NX1=2|D6^~blP z_r^7<#z3=nT^iU^+5dN#pQrY!(g%EM`F~1tKh!_emUpS)t3|K`Byt@sd4pw=*;D4r z{rk{_*&#*%t8@(t)7B%Tt~Tffa%S zp+Oi1F3DtxxB(C(poxRN>`0^9J#Td@vufSOx40A+JxDjO0VQ)Jg73XD}O94C*%eiN(dD9!Sgch$WZ- z8tO)=rvWtz;BDlEsQ4YAJ6+trxZ z=4Zcf-R0@J_kK_V%qE*w=b^Oe&gfz}%R}n65N3G}ufSLB7HO49gN}OApZ(dNryFm) zF)doO$kq&KX3NE!Zo0_>=Q1DRL3X5%%YNK*jW^SlcJJ>?W3{k{P0^y8eVLgy#BN)g zH*fZPJYJh!zz?kF9McIbS?C|n;YAUGzc<+^eSdy?@#P_=M zP=9AmuW~-M9H;>BspbDE&0T|X+udp}`V0A}LmLh)s?mmgw@j88N#D{n_F6?iAoD81TNAR0@QrQo9=cZm3^k`C}N_>Og@R9d_kV6^jZI)kv`7vadZp}a4<#!jJ z`cN4TzUFRFQBNci-w9>rPG{vCji&;H^&b8A-~DKsFsA*U3qSDN9aUA0oeo&}Ii(!X zt6p(Gs~p(TeXzp-Ea8j5=D-{onq#9(m`$l!CQCr0Q3Ho+8T6tLd$$Dd0SPIlE9vw0 z>Ocr7HWf$UG5tf*-2w^0;sIXr*MIow5hh?H%&>s8xGAclxaNdY+HqNU=pOBO(x`@X zGLD5Ob%(W;*iO3H%#Bgv&>H zF#KB7p*UV6ed}b7^r&QbAb-q}^#aFHqKA7N=ZVv2X-BDsv~^#Y@BvjoZux>~0#D+? zOUg4~6Ex*Sv!wxqC4w_1<;F(Um+F9eBvumdsLo|q}6P;C5YWaY`m+3=Ajl1iE`PqOk@yqipC9I3r@-Gk5tHF1NWb%iv z9zZ1m>ZA!XPk8&*S2fshzcpExTjixLc&9k1=Nl&Yx(W?fB$1tc2 zG5d&T{%asc6jCSnkl06_2~(DQ;AXtWmO z61MaqHc6PXE!#m&2imc1n?~p!uy7hbrq#lUm6C|F=~WG$VMiDVBut;yhIK|02#3i} znt}3;k++h(I7yb=_Zvb5K}-J?&$x~=w*)4|b}6}y-Or`%>z@hl;uk?l`qQURcf$b% zgri?a$T(@y+OcU=vou5`f0@gI6R+~?7g~xT6;w^1mxOU8U;wP=WbqX1M@U>gmzDTxzVIFGsrR$I=Tq- zOkv#sGJuN!{zVUqnXu$1Q<(r<0G#w1)HvYGlBBueK>6S$AOyIwA{n%20A{aa>Ix3h zDB>CORp(6|ldiu0{b{sD69WdM!I`ib92m^U=xVC-P?tD{bh4UbZ%-(L63!z~Y=>nX?YSg<%PzVw}GVoPm$=H)K+ z-|Af!c>7%^O{G`mh7(-zYpwLS7^cAw{6iR7Yg7m1gY_cwCt?Pms^kvMd6>4i&VD2x zaiiZkwuc-@S6q5Qdha!F^tYMcm(4r6FWq+EO?MB|QMo!59LN&!RODUB^AvMH^D;FG zn)#yArX+|1fCGemFYN}wV690Y+$1fyQ7cj*B=>dimbq?UI;@qm8r0W0eRPB8uP$A> z)Kh1w8`~}H1C#)v5Kz9Cz|pN7LM4P$+=YaVi(>DuNqRs;rGtynNgAl^~} zY6K_R6##0dcxb`Y4+p#S5GMM4!|YrzIl>?F3;k$aUVmHhoCfcJ%+|aIfN*GY;!P>; zkd|VkPd$JXx_i_W??#5{!ZIvUKFO5c76b z#G_nJC-d&8hp%yy^DBQ$x-^E!)EcldjcH;!i^q&4KVH0?26W6@c20W3#c$SDj2hgg zg-WvJfcXBV^j&$e3<{?Vz0z1tp!}@IGUna*`_7 zCyxUa06uxVKJ9W+UtRP8OAsTB5grKftXUb5(UJgR0U0Jt%+d9_K63a_+OLt(XfbF< z7iiZS01xefkNhVZ0o(5l*%=88K!q9BLbMP%S)iIRAx%P{2por{Z-A8V5i|srAo7_@ z?r{=yZQ2~5_3)Nd*S$Wi*9HM-U5o;rJ$rU)8rd%GH-J|bNC~E(iNQD%+XQY1N+%QN z<6R#`uR|aG(^y}V7EB$LrjBoq1vm;J%wi7*G!M3Qw6;;a@DdAL(#q-W-@YmR{Xc!v zd}rYh_&96wDDw^81G<17CUxS#Um8VC%}t@PDvaw*^%sM#GF>XmaB;F{oW(fmgwgM= zcg4+`FlV%Az}yKGydmNlvnH7q77OA1c<9OJB2NRbR{K(aXvf0kX~CHqF{ihT<&sN zW}b0o`i+mgH!YkyOO_1=zQwz4iwbEgt(Xt5GzE^VS{6rf%(Ydhh{*~1?EFx?)O`#z)LAV{9|B*x4L$R)X6w^X|dBnTkOUjVDpH@Hd z@@IyIUc59Ct^A%$4pad6WODm7%M0PdM@Y*!e~btKTF6-_WA5Y{q2Hhp#h5A4gwZ%ROM+Vs*6qYY)^F56jMn9jsc(&OBZxP7U&j@KT^xFcyn3~-{l2CP>l>o(DC|ClI zipzXD>OO7&0oT9sAWgJkcSGoGP1x^9Gy>4dY1m*U$6U&~#i3ZeHhj}p(CetFu^ zo!!V9)zy@-3STrbMKSL+@ktxr)9;UiKjrDzvq+0&C^u}_;5vYx2u0f`xDDSsLZym#xqxAIG(FD5!W zx604S;6P;*^vU4zX_`mwvqD(V3g?5)0w#+YghmJ?jT9YZfR@Z!P5r69w=o^kG!o_n zkC3@?`_5hIh~`oDNhlKsfzD1cQ`@z@pvo_~7bDwL@1NI_s~P4_(Tm^X4~nhOe^uv&e=b!qMt zflqC3+Ni-VhowbW>nH@Ivs1pAH{54Oo=iDfIDL%3cWN4~{$EAb$X*TF5vgpVzF))5 z$4s6n06sJA-?K9ve)VZB{2+cJsCC@;+$IZXG+)4NocfO`5}GfXIRX?R3*Vw4B!Jgo zIj-Sz$t<0TGCxW;agq7Poi(U}k43Pk7lEwvi%kG9YxgOSIyDODFYfOP4o}tKw_RE? zll-@7EC6G?y)LroZ5^qu3Ry}1EeF5=NDL4|14bu>Jg`cSJQ#|N7}TclHiG|FTK|8Z z0q)HjPzLYVZ@QYjt^<9w)M+#_^QdLsw|u}OuBoH_T`#9`4Vrtc_h^U(P9VH+lnv`a z?LcU=gy(sUwrA9vsrN_))j!;1jI<~)E$|b|0%6&Rp_HbB>j#%l1zo%s&_vkMv?sm4 zyi0F9_YCuy_k&m2n||m_*#-^N#3fO-&Ft?;yYKjfZa#}o#hn}uQ~>zo@cFdO#UNY= zapZ!FR@(oxPJ+MgNG$TuFYOF1nEoYJayr7OXvIa4Ags1%C8XJt zW=cpg-&85 zkNo1h(uZ!iCavGNIqlZcn!9%HNE_F`D6?sgM=sCNe9jj2;cnioB{;P`9m`2F1dM!+ z1z$*{?|aJFCwyDB002M$NklY<6swM5}I$&A> zn>|`cWQrPEXjtu9LUZ8Y9)%s}@FfsYyd0l600i&J{Q2|KGmm#WPXO3mv#LV|$TigV zYeYTtM!wGcI6psCH`IUOj(vuAOJl9}Yo@N;q!UQ#J<`EK9qpQG)TVXMkC!KYhcxi8 zc5i1ITgR$msvjC#;uAbJuZw*7ZYU?`0rQ;h4>eWPErWwXO2zxSU*jkUNB=(q87GX4 zg<1$FLNv-+BdCjO&aeXzB`!2^4ampQpC*hSmp=CXYtz(8<6Wl={G(fe?}8;w=@%v} z2@#+4NcXw>p8CMh(4L#Bsz!B^UB#Vv4*c{NeB$%0- zKnBYA@UytgXOR@nXMWHUvddSTMW3I>bIMY3rMTgvqN#iuAk(0J+WB)Wj9A=aaNr8j z+?QC9>7^Ifr7c<*V*IPyQrDhdZC7|i3oanA5VX?jCBV=^+3R>@Q+=8>X>?lHG0F3w z0jai;O=;Yu$*HYgk^R_$AQm^YrdM-(u5>%0lV$m=5Fnao4gI(tIC@-wdX5M z_-H_sNf<#+8t^`M4{%TEU2+Ri?sV^Kfr1!Qjg`Pn2;~j370z5E9Dh0!*yrLo?*f1T zKmsn5ZJv@-RNE2q&O`YBJZ{F>+G_xYLuabrf-d&e#Y z$qg|_TlEAV^?IjqW5%S>Oj{HGapet&L;H58_TCLr(KWwUgqE9sp)DVf8(L?Wouj+O zY&Kw1cXkv@-$M7k9@jA@ebN{$9%e_a9ne5Ek;gww@C9^{4nRudH!mN`{f$5WRxJ}d zMs*nVLfI*IUK5w23{1U488jg9_e`OOP~9aJl;fB6?ft}Pyyf*&*RfJhjF9Z zJGDlAhvfi2mK=ag2#zX1Q^IM`8;dhgOH+Gvod;?$2bAp#=?A9oa_I1Wua>n#z;ekY zmn4=`{K~)nAbsGPOC)^|BKpuJa5#tN8p4EZvy02J-{P6%hXoHbBBToM9PRjL2g(UV z5S6YJwn~6prA7u*t2$=QNi#ZTIqf{i1u!J90|!+`X%0w0=s=*2R6j2u#b6#9Bls(* zf<*apznu)Jjub*r0#R{%DDQ58`{(}l>(+c&)Pku;|NYmlb9jK(4GJY3jUsuY&Eqe> z8Ya);08bi9IuFW}O7S>Z14g(Symb%9h$1f>bW%3rqs2iy<<9=R13o0=qrO7}M*E&N zX>1yNW~%|3Fq+bmW{sOvq7S}I7~Glqx4)PMM@~p1MyfxvaOCOwQyG{#HCek4jna-s z`?d;zAxESDg!S4eVY~*&?dZ{pUDkp{K1@E2JJ$cT?(uJBJHgQ{8UZhm6D`o{zEf<; zwe@N|wWn4cnMTe7M-HXIy<1ZA;C_fG179_C;J^8&amWjkZ@>5xS~6z$f_|z( z&$-hnb?uIM$85Yo0JcC$zkVat_;5(zH zj&t33uDC5FH6C%!H;RRYDQ#Y39Y!lr-ZdIqI8XuL6UW=r zK4rEh)8{84fYgpw@_UZZ^GT~eO1bC1hfBi9!TKSs?P2W>^p*z9=Iboz0Noi64yZY4uAn}^II;_6>)=?AE zLTTh^^Jt0Cd1&vhG_r52tRJ$LsAWTA2;R`ZGT@5eFw7dIF7h9K!87qfb%4Lj9%Sc% zdAuyDArGwEvPYYnsD2o+PeZI#=5Z%VLFIZ6i5BAfH?DYRppS14TDkwZx2(`&8)MvH zB0aA(r|g-jz*^o+`|4F=GQc-9_}W@^DXB5SyTp6e)7Rgjj2Mhn0bnuVM7s(ApJ)!B z#_6{}KGCN1H^KoAQw=PxqIDE_&zP$E}c~ zS*7)e52a_GUw2gB?>P%+mQ1DVsX}y9hZ)$un6<&K527$ID6W}G-FI-+J5k`N4#&?upw>U+n*+D zVTvlf8zk)d5)iu~(!VbaY`8Zas%lORZ4=T^(-`mT3~01zujwUAmZVPYyW2OgU++*1 zyaF3B_0O5ylm@mOOuP0A0Ly60H0E+0@4o!m2w5uTPHNLMs`0X3XrU36O@>?ZU_hgW z_x1LtjyY4(vgPM!$yKer+`A`L_3lcelja1&szSSkJLZ=zTtB);!!-w?PY0OHQyerf z$dS3{TvG-t86?UwrThA8y|(pOEzZIKEWmWim>7iT6!Zh1NY2HNWc}UHr%ac??3vTj zyRNuEeZJ#7Ee$IL4GgjYd|BCRzZy%dy-jxlNnn!p6gR%-fof~UbfUEbI#xb{XoM`n z4Zy{83y)mZI;Qr-Qjg51{?*_6%ks^n^eAyT@7JLd`M8l&>jgQ7^4aVEIF;#Uvp89rfOg+1{S)*Te z)>)~(News+Q0fy<34^o?Q@j!5+v?MtNlmF$efOAf%@24|96?#ZC-^2;{)}s;f=wHz z!E&=FrU|3k1nhbb)u0$bqe!%}FZ4l;nwvLoUOK#GZK~h3HZ>mFmKv&L`lS}c2mgV9 zD!<>gLh}tRSiu}7cmxf&sIzz%p@VkRgr)x8f9)GR;3}_x#uyD6Of2=;y=#}o8FYCkGZxP|tc@>dU;y4|?Hte^ zJd5dQY18(OoPXtfVmVOJfKM!cPwUh*)1%w{S5S#SE6#D!UC6Uxf9~;VYYjZC)eMi&QvULjKOX|o+7194 zf)P>-BGPC=fWxm$4J47D4hYrRr{el3zv7t!6~T(I5lAs|*`0)bB3-mM23HMf1pHyq zAJcQH(sh@foz{QzUJH5lfo9(Ko}Tk$Hjb_atQ=-aq!f9YPGtzQdb?7MK;Y1k?P-d( zn7rYd%hQAR-|PK&nIgsk5VNtx#8H}drSfmsb}((-tHwp4jY279FL(K#vtCh85o1}* zMKi}Mosj}v>EwFf2KqHWTkq5u?a;LJ+$rgOwDx_9r=n(gXa7H#pKh!$BUJfKhY z=`IbwpYgs@QQOyTT2@9xH`HweSYjoe7 zw3thm%}C<}4)gS+R^EvB{S3QPj0j(hTltDc4}$H4$&%;t9Cd-I~)Rt z71>!RjCY5^S|CTb)PFFwN(#Mg#iDfOiUrcnj-`2FTsk8Y|oSD})ZnL1u0w`G9=k@eoSwNFkHrcBk2 zN0T)$J_fbvfq719Vr}8LRvg=u<9+fY1;}S#IN9*yH*(2|gyu`XK927OJ`!sGLG7t6 zE6Mor1~qQk_7cr^ z+pApy-<@8uj)bZ;=r6jBWS%bKu&~Prfi{h38jH~|7)qU8JBK^$O?BnxL~)=3z$c2c zuZMJB-J)+Zgnc0*EyNIHaZm_}6C_IE?62z_27pmh-Yx7&W7`F;Aza6`x1>wv_N7&w z2W(zF`|PvR%DWy&GpA~xOUFbD1kwm$E#T>AfC>X&vKC3Eq62M#a0WN11caf9s~`+v z7IYPa#$$Xl*%603;&LjE@*sYI&?}<(q@NI}IsF($S*%z8b{UHqwiPw6>0n{!xLCtt^zS zD2uC)pTY-_cHR0ufYVHd(d0)w=j)5e-=2{|5sZi8AN()gVZ9Srdgv$Ty?DNJlj|BD zQid}owl-bw#=~%9{ozGo5&+iy!Y%d+EGny~`yt_1zYxmA=(voHJSKc)Y zw9<3Be=t)M-uHBoxSIr%HGRgp)Z|uiCxZhO06rO9K3($|mpTu39!`yev9+8b2>*D=taX$253wUbXsF z`=v1t2|Nvw24ZDQ8%m9fs6!`T{-XfOUj?M>?J{p;;-Ovk7hD#SF z?)^;RNG}I>km3hkMsNb@CP#DP1^7BF0daArJj7Fx3NQRclTJBJrh~yJ{i|MOLD2g^ z9=s==I}fJY?pb9^2#qzg-sx(JD(<9kAk>wUl2s*>(~bij zmp-{yD?&w|B0v&C%EHP5Px3y z9yf%4j+@hseDus|9q*jMpEB#3Lv+@nRWQKHCOw@QaHTRJSP`~+dk&;8-u#1f+m9dc z9=*)>1%N;GzAMyc%G$~?8r%RU&~X`*wlzm-Od+@hW(tR(wiYZQNxfMEw5eCZA1SYT zFgO%ofJ6`B9l|vWa?XsTb{dN3t?NkB=`tuQ26k}{z7&;joYA|Yx^K~9BbR9E6oY|i zWC4_)|Hp4?=}lHl%Y)7k`mtFA%Wm?%@R!Tzw0Vb=p5LFMz5zGY7$>U7=Tccfsq%Uy z4vihB5$PEC^1U=`(pMl-JNn3er95;Y@Dj=klT|t!3To;cF+VbSS2m?*= z9*91@4^>r~bF0B>FRXt>??|0j0^71>i_ONfrVP)QjucftMSYT-Y0`aTBkvn)vp4F9 zO*42`c4=?rT|2hPQqZeBF-bS2mezJ1ZQj?rsioK#8Zef*+L|*f+ldYiv|!%XeFqM8 zME;fE6U~7N0H0_MpT_A|Rh`w{y=QmG4}I9-Bt6Q68-5`Mi^ruCLJtrM5XReDnk7#W zN9oX7zjVnI&l_E{W=*>G+H2Djn*aJ2|8$#1y=o(Lffa(FUP7r}0wV)4AjTZU5S&m@ zfSv?e22Klas6*iS(6fAx2M>x9*90j!KO=7WQA9yj=jg@r@Q4S_0~itbh9*K80)W}X z0JEMO5CVn1zQY25adItY5H6Lsc#;9wjV?4&;>)ZZqhbTxeO~}Q;fTtrN?}&dB14|y(Jx+m zu{7Q$o1keNpbbB*(cK=At7S87?lb^XpO}b4TjRY65a!GQNFIC0f4CxiO&$86e)PvX zXW%XBDe9AW5jXCOIK(YQ<^q2j6Ooofp#|%39qZDVYTgY4vKhiN65uCaJ4yYZK$2!| z7+}Frx#0=##@+*m(_Ig*(TZE6)5eV(ZN`85In&%=Es`q|B|+z+Q)EK@H3Ob{&#h%@1S$nU3aCkH0=b9>FeLWKlNyl0b1SepOSE}xvW9+MKvu2vl+m~b8mQ# zwt`SoMy8K5_nF=jDdCTB2Dq_#<}f9}pVM&MC_)JBLUc9NT%6rqz-~F+t8=)zp{mz-xn!fhAj~leu%!2+?`T>!(fEg}KaF2ExiAu#muK)iKY97Jst^#UPsbE#7%E zd)+JGFfem38eB(&%?&Y^(G^qBMtwtT*#Yg2OMH%a>Wd;Ap?&Fc`Od`ykIP-$MgpZc z4xl?85<%}wwHgy1_@wgEkmOy#5>PK|&$>-pUC%6Hf+b`^OHEofcZ%yF@}f>iPNSK% zjb*u&1K&2RCVD4$Kd3tzbbHkB@jBJYuTkI5NX@TqZf?>3-2kt?C*|cGt_-|bCkoA% zvl>PvEuC+S21Lc36b|sVR@~1p2QGc*8NYvs!7Tcqkw6HQl91)j9>+2${6m<9AVpYY zhk(O5s(zT4c>SA~r!%LwCHA|0;e{8{Raae=?tSR7^!cycn)V*-vze9Am=;pfoZM&C z*sQY-X~tO_hQi1492gkl!B-JiKU|`ZZ2||l81RTokT>6Hq_h?V zp?>(|tblawp!L#d1AO;s3&Z{UqARIE-wP(^CV?>9Rzg+SR-}yNJ7+>!2 zgX4r}s!0anyYIf+)00?5>0dNBY1^)D*IVg*1r zQzS-1GXgl9j2)=-6J_Q$^8j#y5AIJjPojKL#^4Lj;~-{$3?etC4bksN-!f)tSw@sM zAOS#=hxfkKnLlWv;nu9a;E%oQLYMQ!7hiN=@X9+LOi#S9!9e4Nm4tt2V3=VGO<2>_ zg2zft{8r$i9^zV_`bP_naK6Wn{EM*o$>ZpwRK8>U3%Xr;u62?7cAbQHK)J&4Fv4(; zzvIP?X>hnAVtxw9X3(u=EP%n6vTMgMEj04^FMr$n@6Me&H*MOq$pAW6dkTw?i8Hd?j&%4ue0KQhB;7G_0Ge=W`Tc5A-$`J(yKH~OpZxiXDwA8EmP z_)v^`hVSGrGoqUm(;nY{-d8hx&`<~Wf>9gsh302etC}$^z1XJHfnPV8maE%mDY<{ITqZA zQO?u}ea6|`9D}aH&m;ErOw3M=brk@11)PMR3ILx3CZFzEXao2sv+y;o2or=$aUf-e zL3p?{S@>AsTMUs(;X+2~rgY&4VAZu3FHOrk+6}^Y-g&22%NnC?;J$FvE$N}PFRR~6 zo3s;<*rEZ!VN-8O11+>-gK=oZHCkvOgM#UnAW>w{+-U?TQKkSU1P#yP9A&kDLOal5 z&_x4BlR(=Q2qRpp1SF0}+5$+Sq^214d0y(>TH)%(PyV6JvGnf&ya?I(Q%0q){>iUf z^F@$)HyX6eLbIiuTmy{m1C|zy#=|8HxyHc-*P_D!MOnBmE3dC5tg{9g z&-mmEJ}5l=AYN1xJjcvg^fRk`*1QT+H2$s+4Jyi`b4^2$-p^lgp3BY>q!TAj^wNrd z`}OZ>J3VzVWX(`K^xz*F9DuQo7_b&~kTv(HC(4s)jd}#gj(fN)k%sI4sC!XKG0XqV z$n0a5_*F1340FM0SToF@vh=Z<=r5k>9d%j3ScHn5KF30sXMtuZ zjm+VB7TOkwdX020MU4bXzZO)*9nl)qhjqi{=cIFIk1uQ z?Jk?5SrrL^gR|h55J!v3Q-12}nNFd8E=G4+L#6even$Eli+PR~Dj`Kpb1n;KG%SP} z0?PxciuBO30bMlj8fi0CdM*hSWkx^(yb_>8GB-1Sw?{kaeEQFCN`L;hU-OPOG#&t7 z1T9lcKK(22P7}tod-=dVnWO2uqikrmIOe-rYmpGe#EWC~BZRI;IwOeXpgEr@S8gPQ z<{03Ma0SpTWJNQJTL2D(p^kdD@9+bt0J0Ff^~i}n!G5;_PeJ+ScMTnM6)@Rxv6wAXMUP532Ugf;@~x;LIFp|&R7 z_w1`S$xWX=J#}<+r2ALDkY0SXTPsAJpU%^&Ki-{2=CtZT`U91SelT4^D2BsGeK>3T zkdd5EE)29Q3Idfh3TmTF`0-F@2cjenOu&L@2oDVeU;<>f?cSFje`a0!;k}Qf&W&3P zH~=q#kwHnn`N3<_`OD^~diB}S-wWV!SY3YYQc|?2F&P*39o1-<0)i@HpLo^gbDPfyu08Tb7`@Z0VuZsYB>eb95pz?)Jq{;#+ z%z;*X-hH+d|<3zfL-`MotVr^jHX=u`D`F;H!@bk`%#m~R~&9qExr9&x|# zCx7m|G(iLLVwp+!N1p!SqU6SEMLEpOtSZKPeZg4^eC9p!JEBG!jnYPqcm{mAF4uP5 z_%g3~ccMSN^scEqd=KUj9|dIYuW(emJK&dFmA3jJ{lND|*sz{?&IS zP!J|{Hc78rw=R9|Z(g!M_{{(P;k01JI6YIpuZ4+(h0hv{LcUx(-=HThgC2yI>2j9( zIqFPE{Osvyr5^}J)73e42NHA%9O!#HqE(z$-urm^^4D&0@D?q52;FGBn4EWO>BMjT z#izWtFB%HK0w`Pam03A!G5}r%PJoT6R-Olp_G{D&L7z!9|Mip4*<2fGl$jaD4*-CG zlnfpiETLaM!7G53a78`KpLFBL#nug=idTSe6?@_;Z3H~@MRW~Y0#=oxN2e*JK&%^`n^)3x+`jpE>B$bu+K()RJ-m@W|krw<_nPXuQ zG)(oes{VYhG68fXa_C5Z`s2U9#jBsuxMVy4?*Nvc38UMT5RDBI#N~6`<@*}F6K!qH z+9!Co@~ukKCX6<}4ZwP@cn54f!JJQ@ueDzqVWL%s%S?f&8{J!r=b8Uh4qe;Iq9C?- z@XpU{c`{Q`IiFY#Q~>zI^7nO-dR5iJ&IiBrJDuut>;OpE@yAXdZU}kZ=^CIz2=LMJ zXFvQM4zYf$5Q${MSHGki|6X~CH0Tp$RPdjD{GHyc;RlbtoY=Tw>eQ(bS-*eyKW|Fc zyy^UO#=M!*q&iYtBYmXgtA10=YZ5MKR2ImY9%5Vm1f9@&v@5#@WeUPVs|#AWMmPby zfLzy}eQCp%?P=v5_okC>&LA%IMzYB11nBYo&^ zkjDQ%{>%H)7ykM7v|kMp$_)U0@oV2v@apu&a~I28%G$*O3f;R=rScC9P_OK93lK}= zQ=ezaxh$rvOwcvD-Dn0sUJ~j*S+3t<6?O5x@*@i@mrpv zRE-7B0y^zg9ODiEU;t12=N;6cgxk+B&qa=<0B1_ z<71@-ZC{;eEh>dFF?K^^>ptNfHMFF@DDme*dPc24YZM3^&58rn@cm)Xm#TUOS-2Fhh?Cgc9M!;c&)AEd_8?&}}1gH#Xqk1d{ebS7TxYH=r zok+>_6%USkGWh1G3Sn(mY5AQnYgPC9<6X&FsA$>%gXHw1GP)haqR!k)v8}5vb`An` zX@u}?=*)MJ(>hBUdgF8#{eFR-c3VrU>I`}9Gy!QSK&bV!<+u4bMsS=e4?p|P1Vt&^pWZd=Q~BnA{abB)FUw^ z$o;{FR>flRN3`T38lTNv7EZ-r9k&Z0a>l zHENM>-Q8o8E@n(tSz`G{(l1HEa}tJ~8f&%T_#@~^k2uiboG+WhJc)6epMn3?J8 z#iY1o*2Hw1)!fXAxV)>;S#J%EV z!EWKM2jzh3aQsA-xemz#!124GR1n_8$?pqwJx&A9mTG_KwJ&beNa%jk%joF)Rz0ru zqK~AxGbXElT%*c~1by^TLT^z{tQ*$o^_(EMcwbac_QRie96a<-kyez{)&jgKIl=T3 zx18fWbToqCcxZ;88QRD71uy9Wp^w#P)gKK7tQgdbHDA3?hx9&uLvz3%TeCKGbaXgB z_DW{8s}Ej%p7!evzG3;H0_f7n?<{`VoS*qm7|3B)r#aImB)V;|8c-M-!(L=Vv|zdN zJm2E|2(4UniHGph-=5FB4?%CXZjnAC?)iR44(`3_umAPITchNa-xJM&iUxe5Is7_F zzp83f=QH2_(@vQyJ7P5SaNCRz6$OY7K0aE2v=C?rHa+K~MpRgK6=mi+?(>sjAA;bE z0FVAerKwHQ39(?-lyt`28ENazZUNzr^trG6$RLK0L6ET865AWDdH(ryhn79e?!xoV zN^|DSOdZoErgrE?vaA$hpp~rJ_ z4iE6NmW5A?F z$DHYt(rZ=!twv1-GZ9tP z2k$L1SxI&!O~}UtMX6wi?+~3Mv zQ-E>Cj2YHO(M;EE*qqip`=T{e(&YJ>OBO_inF!@;lkky4x~fWBw(j;K8PEa16Nl%3 zCG>6Gy49v({4h0Nuw-_6#}yZ*vlh)x&9W9)(*CCxqqS{lraV+RaWSRCJIX}gF;lSq=664o z{{EIb)5}|9$x1e%zgyi3&%fN2-t)GL(uHR&Qgj9YW-wOfDw7iMRIxNz=QLwoY!(NJ z5z`p}P3&;-l$J_RSdMckTo(8Ooh}#j>O$f4*2!CC_j@nU)7gFLZny>TI+pn4S4n4h zM*ST+bR<3d@+;DO?@6z8ZTAXqSV&%a>7_Ketv0>?%JWQuwc3d7@2I~ov|wI#mjjx7 zZ4wI#gH}w@xClo*VGW@hfcGH2OG3~Xb_@!}zfbXfhBcsgpBzj-DhyU3tXMJ?byv;( z?R%6!#hoM$Q~>xSG5Yn8&75-={^Xg*)?Z4W5`r$b@@@80$JkNYuRip+j}O`sttg}g z6xR|ab|nGB*B(NGN0{46+Ao5i0ZMWR^ad?&Xb{sq{lhoj@Kyh$31=hPScNP6sr z&0cAWzQxcaLr4Oo%~}x%b2Xs6VN;jW0j!+1@&p`0&;@;fF5rr0o1c+4K#Ep?_WR4% zUy(k1!`sqGEpE>2m_JA<-9Wpmo!;PN1LY=1})g;XEBB{Kp7xt z>w@m_8$RHD0k)Q~AxK?7#S9BZXlUWbFR4jz6HiMbR%-xN%}^}(LHKIb@1W8u2VY{~ za$NyETsyAn2-7_pDq6L{sE)p3EfgV8fWN|XT3IgJc#Zn~$n}?}kNp1Mna9-4+_|wF z;~#$EOX&l@czwF|lCx7&ZIoXHH24}p07W%O7&JzD*4&HybA9o?=4-!X6aBzvLeJq$Qy)?K~KJl$b&y*W)hF%hyVfHg<%k<3LU(z*gG!`(+f)V0#2v^Dxe1?3Rd<6n*o<5+_ z;87kmEL?AZHBcepOB6XuoV8v6H~e@``qZO9S#dB)52`U_Q?k;H_$rC=A`R)j0u<3M z8fhri)=IlK;08Z=H(Yi-Q(~fX(B^gWm^gM+`qCf$TKem+txV6ovO7JmE`%vlrnsKJ z`p@4^t5>f{46qy3+~~f}D$M58A4Fu$4&JB%Q6;l_4ey1^67Lp>&!2%9diBhY%}4#@ zdUr`kmh!_O2QYV?7X`&^;D5?a`lQ9!0lhEOlY+eT%8s=1?uXK&Yo1N#op+u$qqyak zTilSl_>3v($`y;9B{UuD>__@M(vRQ8QXn4S9cO^It^iSjK(oI=y(6|rsqS13mxt06 z^`6VkJ>RP8Aj%pUQF6K-c<;z?_QENZzTaTYN&Bq;@JVC!>mZ|!UH2TgZ+|+XmOTBG z^nn#JK*Wczihf{y%$U7whL&ukb*_)!0;3Q%Az(tV@Nrwtzyc+x(1ifO%qxKokdOmu zNWdb%tx*|x3mUSJ(z!;$9bt}ndXf5y5i9`Q(^~w0PtSq0Q!5Ys!QXt-f*lYCh=;W! zh=2?zVnM5c^v1IncmUO90^HFW>@scggfbx>0_sRViy_1gG^E7_3J7BSd{~G@8PGWD zYh(Ri^2u6COx;1-V)2a{%@d8)u+WZ}u0$gQ2Oj{gk`r@C2M{1{7KLC6R=?7r81~nE zTGxqqL4FG0bjYjR1&|1|0Vs}w4+^gEA*2m@dS(zVA`=Xn+#FMx5!wtu!jEkS$&>sC zw07}`5j3b`PA`4ik*+9F7}mo6p!lkG=-~IzHg|;1SNl zt#1T=JV)kP@RbTIVJ1HddITGf`NdOlxJQ_f0sh$(%V<-=WYDQ${;7mMU>c@3fvSWf zLdZf`zYFI~lYl{!t4Z&=@?vSFgJ}o5EGcc%E}F@+y>(E01-tN!!-J=^I@o}~H-r2z*tzzi>?8_t@RMuNooRIW$ivzr4+$zk ztt0em6~oT~?ZQV%;RlF2LESUbx<<%XEpslpKu=#EX3pR}{J>Ois`TuFWed_@eCqva z)tYr_<^4~kM<0FEt7gHYN1sqP!}sq_KX=XL=`EL>lSXUGSEJ_LQU;q(c_(!Zox1RK zoK3zj0c_KT7lo$6aN+^i&|!YyUGO8rvBL*0u8d_UqiQreCtHKZtx+bdsSfy~% zdT3z?*dS!}BLO><_H^&@RHZE7oR)I%y)ptkI1tA81@O}682yff$5Ax$1atu)%4Wb7 zjrkhdSo%?W(>bl^ON<39=yT4_76_F$^VjJMgQ{gBu7L*S4PT(k8j$iG249tz2=>F@ zH~bV%c>}mgC$wjQj6tXXV*Jfv$`s)MU(DsX@}hyD@+*Iw-v;KlDJn691?Z}ZM(`A=kmTtS_{&dUAJFF3(f9~?M ze9qL=uZ1FV-MV~A44#uF#f)oTg@ z=F9k1+{xvDtLx-uS;_5m=D^U<=R5BE(w+?yCQTI3v57buW+4~Q`1HYID(%xUdwu;{ zU_z$TgS`hefq!?}v9-(EESr8aKb80h)Y$ktv_At2z$5_zs3I&7?gm5zkQ{j+ImjD< zfuQkJ5Noh8eTQ(Q3kV^x0E7U)B3%ob5Iz8Ic3IeQZ(;2RNGV-7SOGZJc9DFc&6>U< z4&Y~vhA4ot&VUOh(hUBT574EI24gL@!94;Ijh96_4rzeb0S)kCO4Gi*-4=wTN4eOA zi5-<#VBZ_sO9RW(Vafq__&R_n0}y8)7RH4j_O*zWi=q~QL>W|0%9t$*~{D;kU)m|aN+VB*??%w&cpeH=7VJ}eyZZm_UKmDZ0wn7()S zs`RZNKayDFglDXVMtsUhpZ=0F=BA}*EKFz3n~}zh9+k$nHhSR>l|m&e>X37hk1r@` z6xQ?+7FT)?D7W70!rSjrk9Kd`(77pX+0mUIcx+92>bdove@=fjb;359Y%d9LEtong zUHitf(wPf73P6jpGkA{-{Vpr<+-J}GfS=z1m5p!7hZ>w=wjXZTdHy=zoOlUO;X{2x zeQIiHHUF^|z$Yw1r3RiYF8T)Wqaj#4v&mZBO635I)rGyldwaS&7ryFK ziUxc#x&1oGtE%ch%MATnotn$qVZad0080q0D1bj=;WB3E0G;U9#5`yLhm4c(aU6WO z&VQw6A@kgiCBcA@!Hk>17hyA?d8e2)`?N7Ub4u|Gq$GI>UC^vb!d=e>)$d4(S-|iN zaCR7C0ge(#IQ+;bG+~{g&-Y<&B<&)gPaf$jlW}eg@YrS51#u}Wv@vxEo*?{y0sJfo z1-=NtymD05;CxmigK*@@TvvoJ!Zycud349~XoLW!!FT;ah|5EnG6+SP%lvs(98New zMj7=>+Wb)t^TqWLW^uIgSj|iQnYKzqG&J8~K1Hpd1y@(sD?EdGpcx*>Bt6(`Ko+yK zIYIPuQ${Qw0|Tt&G$M@~Ju>~ud#*`~=XIpDFLb7x?|jsKs*ILqlsbLHOzrvFH@}UebeMOA6~ZJ2c|7oQp9}gO1%K*L{46!Z^d3-7c^5TWT=RZ7tm=ca!|*H) zr=ytEq5G&0ALxXJiaYrnr~vTE=lN-$nF)1ZmwK-zvpzAC58t2l%h&k(fM zew8lwj+eC!(Fbrq2Mvr6zK*T@yZVc|ggWpNS8Ogh%$L>IM)qder9 z8#wr8VUL9bExuN9(e#D{bU4!DMIbKa!>WKEeZxy-mVU=uE=srF@nHJq?GIVgWRMd) zMGK`~q2c~jtJAk{{gLlkFy+jp^U`PyARMPDPvcr!)Tq)fOGTs0YDS(6sS|*nk%nUTrHO~;V2tNdRq$fcq0gTWFoakud8m)vhs?%N`v&w8@wQh zf0f&Rdd?r|%G2Qu{5(g1bN0bCWeMQ$a+=~X;0gF*repw>%St0d|VK-1n@!!bPfewOZ|LOk4Wc``?}xYn1!b>o%mDzH_%t z)6B`X*;RGMd9pSrV7+C`*4s6b_wm&adX4UQkBVfEbAq1s|HIy!KxuMab)Jz`m6e%Q zS&NpEB@0F+9AnHIRuzyQZen$38?mcf7x2B+E^E^VdSx6GXX?|9aS zeQC7zk8W6a=&kSfbtVjn>_-^!zW2@i%D|_$$yBR7Q;|n+P;6iZ;}UXJVuM3q1q3n@ zOwmOHCL-lwMA0FQ!L)}fBLmsnz>f4GFs5(u!>Ja14A0CA*ImOyJn7~x0SJk*)dQ9J=1O{+sS}#Kvu|vWTx(OCym%g>tspu2^3U6_v z9v%J|=F7{}A>re?zgka7IwKD%2>5t+{3zG>^0AY6=V@Fu9`*rk*!WU+jy>85 z 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 literal 0 HcmV?d00001 diff --git a/img/language-empty.svg b/img/language-empty.svg new file mode 100644 index 0000000..2212a7c --- /dev/null +++ b/img/language-empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..beb0afc --- /dev/null +++ b/js/main.js @@ -0,0 +1,1074 @@ +const deviceLang = (navigator.language || navigator.userLanguage || "en").startsWith("ko") ? "ko" : "en", + translations = { + ko: { + blog: "블로그", + title: "나의 찾기", + keepScreenOn: "화면 켜짐 유지", + settings: "설정", + location: "위치", + currentPosition: "현재 위치", + gpsAccuracy: "GPS 정확도", + moveToCurrent: "현재 위치로 이동하기", + update: "업데이트", + lastUpdate: "마지막 업데이트", + updateTrigger: "업데이트 트리거", + autoCurrentUpdate: "현재 위치 자동 이동", + autoUpdate: "자동 업데이트", + forceUpdate: "업데이트 하기", + battery: "배터리", + batteryState: "배터리 상태", + batteryLevel: "배터리 잔량", + watchbatteryState: "워치 배터리 상태", + watchbatteryLevel: "워치 배터리 잔량", + activity: "활동", + currentActivity: "현재 활동", + activityAccuracy: "활동 정확도", + distance: "도보로 움직인 거리", + steps: "걸음 수", + ascended: "오른 계단", + descended: "내려간 계단", + etc: "기타", + connection: "연결 방법", + editPage: "페이지 수정", + pwa: "눌러 홈 화면에 추가해 바로 보기", + history: "기록", + startTime: "시작", + endTime: "종료", + }, + en: { + blog: "Blog", + title: "Find My Device", + keepScreenOn: "Keep Screen On", + settings: "Settings", + location: "Location", + currentPosition: "Current Location", + gpsAccuracy: "GPS Accuracy", + moveToCurrent: "Move to Current Location", + update: "Update", + lastUpdate: "Last Update", + updateTrigger: "Update Trigger", + autoCurrentUpdate: "Current Location Auto Update", + autoUpdate: "Auto Update", + forceUpdate: "Force Update", + battery: "Battery", + batteryState: "Battery State", + batteryLevel: "Battery Level", + watchbatteryState: "Watch Battery State", + watchbatteryLevel: "Watch Battery Level", + activity: "Activity", + currentActivity: "Current Activity", + activityAccuracy: "Activity Confidence", + distance: "Distance walked", + steps: "Steps", + ascended: "Floors Ascended", + descended: "Floors Descended", + etc: "Others", + connection: "Network Type", + editPage: "Edit Page", + pwa: "Add to Home Screen for quick access!", + history: "History", + startTime: "Start", + endTime: "End", + }, + }, + mapState = { + map: null, + marker: null, + circle: null, + trackLine: null, + smallMarkers: [], + openInfoWindow: null, + mapClickHandlerAdded: false, + initialInfoOpened: false, + }; +let langCode = localStorage.getItem("currentLang") || deviceLang, + lastAutoSwitchChecked, + lastUpdateSwitchChecked, + lastHash, + lastLat, + lastLng, + lastUpdateISOTime, + map, + marker, + circle, + radiusInterval, + _overrideRange, + wakeLock = null; + +applyLanguage(langCode); + +document.querySelectorAll('.locateRow').forEach(row => { + row.addEventListener('pointerdown', () => { + row.style.background = '#d3d3d3'; + }); + row.addEventListener('pointerup', () => { + row.style.background = '#fff'; + }); + row.addEventListener('pointerleave', () => { + row.style.background = '#fff'; + }); +}); + +document.getElementById('langToggle').addEventListener('click', () => { + langCode = langCode === 'ko' ? 'en' : 'ko'; + localStorage.setItem('currentLang', langCode); + applyLanguage(langCode); + + fetchDeviceData(true).then(data => updateDOMWithData(data)); + + // locateBtn 즉시 재렌더링 + if (document.getElementById('locateBtn')) { + document.getElementById('labelMoveToCurrent').textContent = + langCode === 'ko' ? '현재 위치로 이동하기' : 'Move to Current Location'; + } + + if (document.getElementById('autoUpdateBtn')) { + document.getElementById('labelAutoUpdate').textContent = + langCode === 'ko' ? '자동 업데이트' : 'Auto Update'; + } + + if (document.getElementById('HistoryResetBtn')) { + document.getElementById('labelHistoryReset').textContent = + langCode === 'ko' ? '초기화' : 'Reset'; + } + + if (document.getElementById('updateBtn')) { + document.getElementById('labelForceUpdate').textContent = + langCode === 'ko' ? '업데이트 하기' : 'Force Update'; + } +}); + +document.getElementById('locateBtn').addEventListener('click', () => { + if (_overrideRange) return; + if (hasValidCoords(lastLat, lastLng)) { + const latlng = new naver.maps.LatLng(lastLat, lastLng); + mapState.map.panTo(latlng); + } +}); + +// [REPLACE] 기존 초기 updateBtn 리스너 +document.getElementById('updateBtn').addEventListener('click', triggerForceUpdate); + +document.getElementById('autoPositionSwitch').addEventListener('change', () => { + syncLocateBtn(); + lastAutoSwitchChecked = document.getElementById('autoPositionSwitch').checked; +}); + +document.addEventListener('DOMContentLoaded', () => { + const isMobile = /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent); + + if (!isMobile) { + const el = document.getElementById('mobileonly'); + if (el) el.remove(); + } + + const container = document.getElementById('mySettingContainer'); + container.style.userSelect = 'none'; + container.style.webkitUserSelect = 'none'; + container.style.msUserSelect = 'none'; + container.style.MozUserSelect = 'none'; + container.style.webkitTouchCallout = 'none'; + container.addEventListener('dragstart', e => e.preventDefault()); + + document.getElementById('blogBackLink').addEventListener('click', (e) => { + e.preventDefault(); + location.href = '/blog'; + }); + + // PWA 상태인지 확인 (iOS 및 기타 브라우저 지원) + function isInStandaloneMode() { + return (window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone === true); + } + + // 조건: /findmydevice로 시작하고 access 쿠키가 없으며, PWA가 아닌 경우에만 리디렉션 + if (location.pathname.startsWith('/findmydevice') && getCookie('access') !== '9KxH6236' && !isInStandaloneMode()) { + location.replace('/blog'); + return; // 이하 코드 실행 방지 + } + + const btnArea = document.querySelector('body > div.btnArea'); + const pageModifyLink = btnArea?.querySelectorAll('a')[1]?.getAttribute('href') || ''; + if (btnArea) btnArea.remove(); + + // 페이지 수정 버튼 요소 생성 + const editRow = document.createElement('div'); + editRow.className = 'settingRow locateRow'; + editRow.style.cursor = 'pointer'; + editRow.innerHTML = `${langCode === 'ko' ? '페이지 수정' : 'Edit Page'}`; + editRow.addEventListener('click', () => { + window.location.href = pageModifyLink; + }); + + const settingTitle = [...document.querySelectorAll('.settingTitle')].find(el => el.textContent.trim() === (langCode === 'ko' ? '설정' : 'Settings')); + let settingSection = settingTitle?.nextElementSibling; + + // 삽입 기준: #mapContainer 다음 + const mapContainer = document.getElementById('mapContainer'); + const toggleContent = document.getElementById('toggleContent'); + + if (pageModifyLink) { + // 설정 섹션이 없으면 새로 생성 (mapContainer 아래) + if (!settingSection || !settingSection.classList.contains('settingSection')) { + const newTitle = document.createElement('div'); + newTitle.className = 'settingTitle'; + newTitle.innerHTML = `${langCode === 'ko' ? '설정' : 'Settings'}`; + + const newSection = document.createElement('div'); + newSection.className = 'settingSection'; + newSection.appendChild(editRow); + + if (mapContainer) { + toggleContent.insertBefore(newTitle, mapContainer.nextSibling); + toggleContent.insertBefore(newSection, newTitle.nextSibling); + } + } else { + // 설정 섹션이 이미 존재하는 경우 + const keepRow = settingSection.querySelector('#labelKeepScreenOn')?.closest('.settingRow'); + + if (keepRow) { + if (!isMobile) keepRow.remove(), settingSection.prepend(editRow); + else keepRow.insertAdjacentElement('afterend', editRow); + } else { + settingSection.appendChild(editRow); + } + } + } else { + // pageModifyLink 없음 → 셀렉터 존재 안 함 + if (!isMobile && settingSection && settingTitle) { + settingTitle.remove(); + settingSection.remove(); + } + } + + const tooltip = document.getElementById("ios-pwa-tooltip"); + const closeBtn = document.getElementById("close-tooltip"); + const isStandalone = window.navigator.standalone || window.matchMedia('(display-mode: standalone)').matches; + const tooltipClosed = getCookie('iosPwaTooltipClosed'); // 없으면 쿠키 만료 or 미설정 + + if (tooltip && closeBtn && isIosSafari() && !isStandalone && !tooltipClosed) { + function handleScroll() { + const scrollPercent = ((window.scrollY || document.documentElement.scrollTop) / + (document.documentElement.scrollHeight - document.documentElement.clientHeight)) * 100; + if (scrollPercent > 10) { + tooltip.classList.add("visible"); + } else { + tooltip.classList.remove("visible"); + } + } + + window.addEventListener("scroll", handleScroll, { passive: true }); + + closeBtn.addEventListener("click", function () { + tooltip.classList.remove("visible"); + setCookieHours("iosPwaTooltipClosed", "1", 12); // 12시간 동안 숨김 + window.removeEventListener("scroll", handleScroll); + }); + } + + const btn = document.getElementById('HistoryResetBtn'); + if (btn) { + // 라벨 + const label = document.getElementById('labelHistoryReset'); + (label || btn).textContent = (langCode === 'ko') ? '초기화' : 'Reset'; + + btn.addEventListener('click', () => { + // 1) 히스토리 모드 해제 → 라이브 복귀 + _overrideRange = null; + + // 2) 입력 요소 가져오기 (같은 스코프에서!) + const startEl = document.getElementById('rangeStart'); + const endEl = document.getElementById('rangeEnd'); + if (startEl && endEl) { + const pad = n => String(n).padStart(2, '0'); + const toLocalHour = d => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:00`; + + // 기준 시각(현재) + const current = new Date(); + + // 시작: 24시간 전 → 정각 버림 + const start24 = new Date(current.getTime() - 24 * 3600 * 1000); + start24.setMinutes(0, 0, 0); + + // 종료: 현재 시각의 다음 정각 올림 + const endRoundUp = new Date(current); + endRoundUp.setMinutes(0, 0, 0); + if (current.getMinutes() > 0 || current.getSeconds() > 0 || current.getMilliseconds() > 0) { + endRoundUp.setHours(endRoundUp.getHours() + 1); + } + + // 입력값 세팅 + startEl.value = toLocalHour(start24); + endEl.value = toLocalHour(endRoundUp); + } + + // 3) 지도 히스토리 초기화 & 라이브 데이터 재요청 + 현재 위치로 이동 + resetHistoryLayer(); + fetchDeviceData(true).then(data => { + updateDOMWithData(data); + if (data.latitude && data.longitude && mapState.map) { + mapState.map.panTo(new naver.maps.LatLng(data.latitude, data.longitude)); + } + }); + }); + } + + (function initInstantHistorySearch() { + const startEl = document.getElementById('rangeStart'); + const endEl = document.getElementById('rangeEnd'); + if (!startEl || !endEl) return; + + const pad = n => String(n).padStart(2, '0'); + const toLocalHour = d => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:00`; + const toServerTime = v => + v ? (v.includes('T') ? v.replace('T', ' ') : v) + (v.length === 16 ? ':00' : '') : null; + + const now = new Date(); + + // 시작: 현재 시각에서 24시간 전, 정각 버림 + const start24 = new Date(now.getTime() - 24 * 3600 * 1000); + start24.setMinutes(0, 0, 0); + + // 종료: 현재 시각, 다음 정각 올림 + const endRoundUp = new Date(now); + endRoundUp.setMinutes(0, 0, 0); + if (now.getMinutes() > 0 || now.getSeconds() > 0 || now.getMilliseconds() > 0) { + endRoundUp.setHours(endRoundUp.getHours() + 1); + } + + const qs = new URLSearchParams(window.location.search); + startEl.value = qs.get('startTime') + ? qs.get('startTime').replace(' ', 'T').slice(0, 16) + : toLocalHour(start24); + endEl.value = qs.get('endTime') + ? qs.get('endTime').replace(' ', 'T').slice(0, 16) + : toLocalHour(endRoundUp); + + const hasQS = qs.has('startTime') || qs.has('endTime'); + + const fire = debounce(async (userTriggered = false) => { + const start = startEl.value; + const end = endEl.value; + if (!start || !end) return; + + if (start > end) endEl.value = start; + + const range = { + startTime: toServerTime(startEl.value), + endTime: toServerTime(endEl.value) + }; + + // ✅ 사용자가 변경했거나 URL에 기간이 있으면 히스토리 모드 + if (userTriggered || hasQS) { + _overrideRange = range; + resetHistoryLayer(); + } else { + _overrideRange = null; // 라이브 모드 유지 + } + + try { + const data = await fetchDeviceData(true, range); + updateDOMWithData(data); + + const last = data.history && data.history[data.history.length - 1]; + if (last && mapState.map) { + mapState.map.panTo(new naver.maps.LatLng(last.lat, last.lng)); + } + } catch (err) { + alert(langCode === 'ko' ? '기록을 불러오지 못했습니다.' : 'Failed to load history.'); + } + }, 400); + + ['change', 'input'].forEach(ev => { + startEl.addEventListener(ev, () => fire(true)); + endEl.addEventListener(ev, () => fire(true)); + }); + + fire(false); + })(); +}); + +document.getElementById('wakeLockSwitch').addEventListener('change', async function () { + if (this.checked) { + try { + wakeLock = await navigator.wakeLock.request('screen'); + + wakeLock.addEventListener('release', () => { + wakeLock = null; + document.getElementById('wakeLockSwitch').checked = false; + }); + + } catch (err) { + this.checked = false; + } + } else { + if (wakeLock) { + wakeLock.release(); + wakeLock = null; + } + } +}); + +document.getElementById('autoUpdateSwitch').addEventListener('change', () => { + syncUpdateBtn(); + const isChecked = document.getElementById('autoUpdateSwitch')?.checked; + + if (isChecked) { + fetch('https://ha.chaegeon.com/api/webhook/5P1HgWiDpaAK8E0B', { method: 'POST' }); + } else { + fetch('https://ha.chaegeon.com/api/webhook/z2nHt75jRxWKo2zF', { method: 'POST' }); + } +}); + +['pagehide', 'visibilitychange', 'blur', 'beforeunload'].forEach(eventType => { + window.addEventListener(eventType, function (e) { + + const switchEl = document.getElementById('autoUpdateSwitch'); + const isAutoUpdateOn = switchEl?.checked; + + if (isAutoUpdateOn) { + navigator.sendBeacon('https://ha.chaegeon.com/api/webhook/z2nHt75jRxWKo2zF'); + + // 스위치 UI 강제 끔 + switchEl.checked = false; + syncUpdateBtn(); + } + }); +}); + +setInterval(() => { + if (document.getElementById('autoUpdateSwitch')?.checked) { + fetch('https://ha.chaegeon.com/api/webhook/870ZNzB20WRkzjnh', { method: 'POST' }); + } +}, 10000); + +setInterval(() => { + if (lastUpdateISOTime) { + const el = document.getElementById("lastUpdateTime"); + if (el) el.textContent = getRelativeTime(lastUpdateISOTime); + } + + // 히스토리 범위가 활성화된 경우: hash 체크 생략하고 같은 범위로 재요청(낭비 방지로 5초 권장) + if (_overrideRange) return; // 간단히 폴링 정지 (원하면 5초 주기로 같은 범위 재요청하도록 변경 가능) + + fetchDeviceData(false).then(({ hash }) => { + if (!hash || hash === lastHash) return; + lastHash = hash; + fetchDeviceData(true).then(data => updateDOMWithData(data)); + }); +}, 1000); + +function formatNumber(num) { + if (num == null || isNaN(num)) return '-'; + return new Intl.NumberFormat().format(num); +} + +function getRelativeTime(isoTime) { + const d = new Date(isoTime), n = new Date(); + const diffDays = Math.floor( + (new Date(n.getFullYear(), n.getMonth(), n.getDate()) - + new Date(d.getFullYear(), d.getMonth(), d.getDate())) / 86400000 + ); + + const isKo = (typeof langCode !== 'undefined' && langCode === 'ko'); + const pad = (x) => x.toString().padStart(2, '0'); + const h24 = d.getHours(); + const p = isKo ? (h24 < 12 ? '오전' : '오후') : (h24 < 12 ? 'AM' : 'PM'); + const h12 = pad(h24 % 12 === 0 ? 12 : h24 % 12); + const m = pad(d.getMinutes()), s = pad(d.getSeconds()); + + if (isKo) { + return diffDays === 0 + ? `${p} ${h12}:${m}:${s}` + : `${diffDays}일 전 ${p} ${h12}:${m}:${s}`; + } + return diffDays === 0 + ? `${p} ${h12}:${m}:${s}` + : `${diffDays} day${diffDays > 1 ? 's' : ''} ago ${p} ${h12}:${m}:${s}`; +} + +function applyLanguage(langCode) { + document.title = langCode === 'ko' ? '나의 찾기' : 'Find My Device'; + + const t = translations[langCode] || translations.ko, + titleMap = { titleSettings: t.settings, titleLocation: t.location, titleUpdate: t.update, titleBattery: t.battery, titleActivity: t.activity, titleEtc: t.etc, titleHistory: t.history }, + labelMap = { + labelKeepScreenOn: t.keepScreenOn, + labelCurrentPosition: t.currentPosition, + labelGpsAccuracy: t.gpsAccuracy, + labelMoveToCurrent: t.moveToCurrent, + labelLastUpdate: t.lastUpdate, + labelUpdateTrigger: t.updateTrigger, + labelCurrentAutoPosition: t.autoCurrentUpdate, + labelForceUpdate: t.forceUpdate, + labelBatteryState: t.batteryState, + labelBatteryLevel: t.batteryLevel, + labelWatchBatteryState: t.watchbatteryState, + labelWatchBatteryLevel: t.watchbatteryLevel, + labelCurrentActivity: t.currentActivity, + labelActivityAccuracy: t.activityAccuracy, + labelDistance: t.distance, + labelSteps: t.steps, + labelAscended: t.ascended, + labelDescended: t.descended, + labelConnection: t.connection, + labelEditPage: t.editPage, + labelAutoUpdate: t.autoUpdate, + labelStartTime: t.startTime, + labelEndTime: t.endTime, + labelPwa: t.pwa, + }; + + document.getElementById('blogBackLink').innerHTML = ` ${t.blog}`; + document.querySelector('.headerTitle').textContent = t.title; + + for (const id in titleMap) { + const el = document.getElementById(id); + if (el) el.textContent = titleMap[id]; + } + + for (const id in labelMap) { + const el = document.getElementById(id); + if (el) el.textContent = labelMap[id]; + } +} + +function setCookieHours(name, value, hours) { + const d = new Date(); + d.setTime(d.getTime() + hours * 60 * 60 * 1000); + document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; expires=${d.toUTCString()}; path=/; SameSite=Lax`; +} + +function updateDOM(data) { + const textMap = { + currentPosition: data.address, + lastUpdateTime: data.updated ? getRelativeTime(data.updated) : "-", + nowActivity: data.activity, + connectionType: data.connection, + updateTrigger: data.trigger, + batteryStatus: data.state, + Battery: data.level > 0 ? `${data.level}%` : "-", + WbatteryStatus: data.wstate, + WBattery: data.wlevel > 0 ? `${data.wlevel}%` : "-", + todaySteps: data.steps > 0 ? `${formatNumber(data.steps)}${langCode === "ko" ? "걸음" : "steps"}` : "-", + todayAscended: data.ascended > 0 ? `${formatNumber(data.ascended)}${langCode === "ko" ? "층" : "floors"}` : "-", + todayDescended: data.descended > 0 ? `${formatNumber(data.descended)}${langCode === "ko" ? "층" : "floors"}` : "-", + todayDistance: data.distance > 0 ? `${formatNumber(data.distance)}m` : "-", + accuracyValue: data.accuracy > 0 ? `${formatNumber(data.accuracy)}m` : "-" + }; + + for (const [id, value] of Object.entries(textMap)) { + const el = document.getElementById(id); + if (el) el.textContent = value || "-"; + } +} + +function updateActivitySection(data) { + const validActivities = ["Stationary", "Walking", "Running", "In Vehicle", "Cycling", "가만히 있음", "걷는 중", "달리는 중", "차량 이동 중", "자전거 이동 중"]; + const validAccuracies = ["높음", "중간", "낮음", "High", "Middle", "Low"]; + + let existActivityEl = document.getElementById('existnowActivity'); + if (existActivityEl) { + if (validActivities.includes(data.activity || '') && validAccuracies.includes(data.aaccuracy || '')) { + existActivityEl.style.display = 'flex'; + document.getElementById('nowactivityAccuracy').textContent = data.aaccuracy || '-'; + } else { + existActivityEl.remove(); + } + } + + if (!document.getElementById('existnowActivity') && + validActivities.includes(data.activity || '') && + validAccuracies.includes(data.aaccuracy || '')) { + const titles = document.querySelectorAll('.settingTitle'); + let activitySection = null; + + for (let title of titles) { + if (title.textContent.trim() === (langCode === 'ko' ? '활동' : 'Activity')) { + const next = title.nextElementSibling; + if (next && next.classList.contains('settingSection')) { + activitySection = next; + break; + } + } + } + + if (activitySection) { + const rows = activitySection.querySelectorAll('.settingRow'); + let targetRow = null; + + for (let row of rows) { + const label = row.querySelector('span'); + if (label && label.textContent.trim() === (langCode === 'ko' ? '현재 활동' : 'Current Activity')) { + targetRow = row; + break; + } + } + + if (targetRow) { + const newRow = document.createElement('div'); + newRow.className = 'settingRow'; + newRow.id = 'existnowActivity'; + newRow.innerHTML = ` + ${langCode === 'ko' ? '활동 정확도' : 'Activity Accuracy'} + ${data.aaccuracy || '-'} + `; + activitySection.insertBefore(newRow, targetRow.nextSibling); + } + } + } +} + +function initMap(latlng, accuracy = 50) { + mapState.map = new naver.maps.Map('map', { + center: latlng, + zoom: 12 + }); + + createMainMarker(latlng); + createAccuracyCircle(latlng, accuracy); +} + +function createMainMarker(latlng) { + mapState.marker = new naver.maps.Marker({ + position: latlng, + map: mapState.map, + zIndex: 100, + icon: { + content: `
`, + anchor: new naver.maps.Point(30, 30) + } + }); + applyMarkerEffects(mapState.marker); +} + +function createAccuracyCircle(latlng, accuracy = 50) { + mapState.circle = new naver.maps.Circle({ + map: mapState.map, + center: latlng, + radius: Math.max(accuracy, 10), + strokeColor: '#007AFF', + strokeOpacity: 0.8, + strokeWeight: 2, + fillColor: '#007AFF', + fillOpacity: 0.2 + }); +} + +function applyMarkerEffects(marker) { + naver.maps.Event.addListener(marker, 'mouseover', () => { + const el = marker.getElement(); + if (el) el.style.transform = `scale(1.2)`; + }); + naver.maps.Event.addListener(marker, 'mouseout', () => { + const el = marker.getElement(); + if (el) el.style.transform = `scale(1)`; + }); + naver.maps.Event.addListener(marker, 'click', () => bounceMarker(marker)); + breathingMarker(marker); +} + +function breathingMarker(marker) { + const el = marker.getElement(); + let scale = 1, direction = 1; + setInterval(() => { + scale += 0.01 * direction; + if (scale > 1.1) direction = -1; + if (scale < 1.0) direction = 1; + if (el) { + el.style.transition = 'transform 0.1s'; + el.style.transform = `scale(${scale})`; + } + }, 50); +} + +function getCookie(name) { + const m = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/([.$?*|{}()[\]\\/+^])/g, '\\$1') + '=([^;]*)')); + return m ? decodeURIComponent(m[1]) : null; +} + +function bounceMarker(marker) { + let scale = 1, up = true, count = 0; + const interval = setInterval(() => { + scale += up ? 0.1 : -0.1; + if (scale >= 1.3) up = false; + if (scale <= 1) { + clearInterval(interval); + scale = 1; + } + marker.setIcon({ + url: 'https://chaegeon.com/custom/findmydevice/img/30c0fc9d9.png', + size: new naver.maps.Size(60 * scale, 60 * scale), + scaledSize: new naver.maps.Size(60 * scale, 60 * scale), + anchor: new naver.maps.Point(30 * scale, 30 * scale) + }); + if (count++ > 10) clearInterval(interval); + }, 30); +} + +function resetHistoryLayer() { + if (mapState.trackLine) { + mapState.trackLine.setMap(null); + mapState.trackLine = null; + } + if (mapState.smallMarkers?.length) { + mapState.smallMarkers.forEach(m => m.setMap?.(null)); + mapState.smallMarkers = []; + } + if (mapState.openInfoWindow) { + mapState.openInfoWindow.close(); + mapState.openInfoWindow = null; + } +} + +function updateHistoryMarkers(history) { + // 안전가드 + if (!Array.isArray(history) || history.length === 0) { + // 표시된 마커를 기준으로 라인만 갱신(필요 시) + renderTrackFromDisplayedMarkers(); + return; + } + + // time 파싱 헬퍼 + const toTime = (v) => { + if (v instanceof Date) return v.getTime(); + if (typeof v === 'number' && isFinite(v)) { + // 초 단위처럼 보이면 ms로 변환 + return v < 2e10 ? v * 1000 : v; + } + const t = Date.parse(v); + return isNaN(t) ? 0 : t; + }; + + // ★ history는 스몰마커 생성만에 사용(정렬은 생성 안정성용) + history.sort((a, b) => toTime(a.time) - toTime(b.time)); + + // 1) 스몰마커 생성/중복 방지 + history.forEach(pos => { + const pointLatLng = new naver.maps.LatLng(pos.lat, pos.lng); + const exist = mapState.smallMarkers.some(marker => + marker.getPosition().equals(pointLatLng) && marker.userTime === pos.time + ); + if (!exist) { + const smallMarker = new naver.maps.Marker({ + position: pointLatLng, + map: mapState.map, + icon: { + content: ` +
+
+
+
`, + anchor: new naver.maps.Point(18, 18) + } + }); + smallMarker.userTime = pos.time; // ⚑ 표시된 마커의 시간 정보를 유지 + mapState.smallMarkers.push(smallMarker); + + const infoWindow = new naver.maps.InfoWindow({ + content: `
${getRelativeTime(pos.time)}
` + }); + + smallMarker.infoWindow = infoWindow; + + naver.maps.Event.addListener(smallMarker, "click", () => { + if (mapState.openInfoWindow && mapState.openInfoWindow !== infoWindow) { + mapState.openInfoWindow.close(); + } + if (infoWindow.getMap()) { + infoWindow.close(); + mapState.openInfoWindow = null; + } else { + infoWindow.open(mapState.map, smallMarker); + mapState.openInfoWindow = infoWindow; + } + }); + } + }); + + // 2) ★★ 지금 "화면에 표시된 스몰마커들"만으로 폴리라인 갱신 ★★ + renderTrackFromDisplayedMarkers(); + + // ★ 최초 로드시 마지막(가장 최근) 스몰마커의 InfoWindow 자동 오픈 + if (!mapState.initialInfoOpened && mapState.smallMarkers.length) { + // 시간순 정렬 후 마지막 선택 + const toTime = (v) => { + if (v instanceof Date) return v.getTime(); + if (typeof v === 'number' && isFinite(v)) return v < 2e10 ? v * 1000 : v; + const t = Date.parse(v); + return isNaN(t) ? 0 : t; + }; + + const lastMarker = mapState.smallMarkers + .slice() + .sort((a, b) => toTime(a.userTime) - toTime(b.userTime)) + .at(-1); + + if (lastMarker && lastMarker.infoWindow) { + // 이전 열린 창 닫기 + if (mapState.openInfoWindow && mapState.openInfoWindow !== lastMarker.infoWindow) { + mapState.openInfoWindow.close(); + } + + lastMarker.infoWindow.open(mapState.map, lastMarker); + mapState.openInfoWindow = lastMarker.infoWindow; + + // 보기 편하게 살짝 이동 + mapState.map.panTo(lastMarker.getPosition()); + } + + mapState.initialInfoOpened = true; + } + + // map 클릭시 열린 InfoWindow 닫기 (1회만 등록) + if (!mapState.mapClickHandlerAdded) { + naver.maps.Event.addListener(mapState.map, "click", () => { + if (mapState.openInfoWindow) { + mapState.openInfoWindow.close(); + mapState.openInfoWindow = null; + } + }); + mapState.mapClickHandlerAdded = true; + } +} + +function updateDOMWithData(data) { + // ⚑ 히스토리 모드: 값은 "-"로, 지도엔 히스토리만 반영 + if (typeof _overrideRange !== 'undefined' && _overrideRange) { + resetDisplayValues(); + + // 히스토리 기준 중심점 선택 + const last = data.history && data.history[data.history.length - 1]; + const baseLatLng = last + ? new naver.maps.LatLng(last.lat, last.lng) + : (data.latitude && data.longitude ? new naver.maps.LatLng(data.latitude, data.longitude) : null); + + // 지도 초기화 (최초 1회) + if (!mapState.map && baseLatLng) { + initMap(baseLatLng, data.accuracy || 50); + } + + // 히스토리 궤적/포인트 업데이트 + if (data.history?.length > 0) { + updateHistoryMarkers(data.history); + } + + // 상대시간 갱신 중단 + lastUpdateISOTime = null; + + // 히스토리 모드에서는 메인 마커/원, auto pan 업데이트 스킵 + return; + } + + // ── 라이브 모드 기존 로직 ── + const latlng = new naver.maps.LatLng(data.latitude, data.longitude); + + // DOM 업데이트 + updateDOM(data); + updateActivitySection(data); + + // 지도 초기화 + if (!mapState.map) { + initMap(latlng, data.accuracy); + if (data.history?.length > 0) updateHistoryMarkers(data.history); + } + + // 메인 마커 / 정확도 원 업데이트 + mapState.marker.setPosition(latlng); + mapState.circle.setCenter(latlng); + animateCircleRadius(Math.max(data.accuracy || 50, 10)); + + // history (있으면) 업데이트 + if (data.history?.length > 0) updateHistoryMarkers(data.history); + + // autoPosition + const isChecked = document.getElementById('autoPositionSwitch').checked; + if (isChecked && (lastLat !== data.latitude || lastLng !== data.longitude)) { + mapState.map.panTo(latlng); + } + lastLat = data.latitude; + lastLng = data.longitude; + lastUpdateISOTime = data.updated; +} + +function animateCircleRadius(targetRadius) { + if (!mapState.circle) return; + if (window.radiusInterval) clearInterval(window.radiusInterval); + + let currentRadius = mapState.circle.getRadius(); + const step = (targetRadius - currentRadius) / 100; + let count = 0; + + window.radiusInterval = setInterval(() => { + currentRadius += step; + mapState.circle.setRadius(currentRadius); + if (count++ >= 100) { + mapState.circle.setRadius(targetRadius); + clearInterval(window.radiusInterval); + } + }, 30); +} + +function syncLocateBtn() { + const isChecked = document.getElementById('autoPositionSwitch').checked; + const parent = document.getElementById('autoLocateBtn'); + const exist = document.getElementById('locateBtn'); + + if (isChecked && exist) { + exist.remove(); + } else if (!isChecked && !exist && parent) { + const newDiv = document.createElement('div'); + newDiv.className = 'settingRow locateRow'; + newDiv.id = 'locateBtn'; + newDiv.innerHTML = `${langCode === 'ko' ? '현재 위치로 이동하기' : 'Move to Current Location'}`; + + newDiv.addEventListener('click', () => { + if (hasValidCoords(lastLat, lastLng)) { + mapState.map.panTo(new naver.maps.LatLng(lastLat, lastLng)); + } + }); + newDiv.addEventListener('pointerdown', () => newDiv.style.background = '#d3d3d3'); + newDiv.addEventListener('pointerup', () => newDiv.style.background = '#fff'); + newDiv.addEventListener('pointerleave', () => newDiv.style.background = '#fff'); + + parent.parentNode.insertBefore(newDiv, parent.nextSibling); + } +} + +function syncUpdateBtn() { + const isChecked = document.getElementById('autoUpdateSwitch').checked; + const parent = document.getElementById('autoUpdateBtn'); + const exist = document.getElementById('updateBtn'); + + if (isChecked && exist) { + exist.remove(); + } else if (!isChecked && !exist && parent) { + const newDiv = document.createElement('div'); + newDiv.className = 'settingRow locateRow'; + newDiv.id = 'updateBtn'; + newDiv.innerHTML = `${langCode === 'ko' ? '업데이트 하기' : 'Force Update'}`; + + newDiv.addEventListener('pointerdown', () => newDiv.style.background = '#d3d3d3'); + newDiv.addEventListener('pointerup', () => newDiv.style.background = '#fff'); + newDiv.addEventListener('pointerleave', () => newDiv.style.background = '#fff'); + + newDiv.addEventListener('click', triggerForceUpdate); + + parent.parentNode.insertBefore(newDiv, parent.nextSibling); + } +} + +function fetchDeviceData(includeLang = true, range = null) { + const params = new URLSearchParams(includeLang ? { lang: langCode } : { hashonly: 1 }); + + // 우선순위: 직접 인자(range) > 전역 오버라이드(_overrideRange) > URL 쿼리 + const eff = range || _overrideRange || {}; + const qs = new URLSearchParams(window.location.search); + + const s = eff.startTime || qs.get('startTime'); + const e = eff.endTime || qs.get('endTime'); + + if (s) params.set('startTime', s); + if (e) params.set('endTime', e); + + const url = `https://chaegeon.com/custom/findmydevice/php/api.php?${params.toString()}`; + + return fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'REDACTED_HA_TOKEN' + }, + body: JSON.stringify({}) + }).then(res => res.json()); +} + +function isIosSafari() { + const ua = window.navigator.userAgent; + const isIOS = /iPad|iPhone|iPod/.test(ua); + const isSafari = /^((?!chrome|android).)*safari/i.test(ua); + return isIOS && isSafari; +} + +function debounce(fn, delay = 400) { + let t; + return (...args) => { + clearTimeout(t); + t = setTimeout(() => fn(...args), delay); + }; +} + +function resetDisplayValues() { + const ids = [ + 'currentPosition', 'accuracyValue', 'lastUpdateTime', 'updateTrigger', + 'batteryStatus', 'Battery', 'WbatteryStatus', 'WBattery', + 'nowActivity', 'nowactivityAccuracy', 'todayDistance', + 'todaySteps', 'todayAscended', 'todayDescended', 'connectionType' + ]; + ids.forEach(id => { + const el = document.getElementById(id); + if (el) el.textContent = '-'; + }); +} + +function triggerForceUpdate() { + fetch('https://ha.chaegeon.com/api/webhook/g1M4dZrsiLTt1woqgDXL6wtBSNCp6HGsRSzRLnNV4Up2Tpy8kre0q33EGvB70H9ftw48oENbUngHhVEBRlBFLNA7x7MbcmwZnVSHU71BG83ROMy4MOqIDWGxpKvI1YPX', { method: 'POST' }); + + const el = document.getElementById('updateBtn'); + if (!el) return; + el.style.pointerEvents = 'none'; + el.style.color = '#8e8e93'; + el.textContent = (langCode === 'ko' ? '갱신중...' : 'Updating...'); + + setTimeout(() => { + el.style.pointerEvents = 'auto'; + el.style.color = '#007AFF'; + el.textContent = (langCode === 'ko' ? '업데이트 하기' : 'Force Update'); + }, 5000); +} + +function hasValidCoords(lat, lng) { + return typeof lat === 'number' && isFinite(lat) && + typeof lng === 'number' && isFinite(lng); +} + +function renderTrackFromDisplayedMarkers() { + if (!mapState.map) return; + + // 시간 파싱 헬퍼(동일 로직) + const toTime = (v) => { + if (v instanceof Date) return v.getTime(); + if (typeof v === 'number' && isFinite(v)) { + return v < 2e10 ? v * 1000 : v; // 초 → ms 보정 + } + const t = Date.parse(v); + return isNaN(t) ? 0 : t; + }; + + // 현재 표시된 스몰마커만 정렬 → 경로 생성 + const points = mapState.smallMarkers + .slice() + .sort((a, b) => toTime(a.userTime) - toTime(b.userTime)) + .map(m => m.getPosition()); + + // 라인 갱신 + if (!mapState.trackLine) { + mapState.trackLine = new naver.maps.Polyline({ + map: mapState.map, + path: points, + strokeColor: '#007AFF', + strokeOpacity: 0.8, + strokeWeight: 3 + }); + } else { + mapState.trackLine.setPath(points); + } +} \ No newline at end of file diff --git a/php/api.php b/php/api.php new file mode 100644 index 0000000..a4a422e --- /dev/null +++ b/php/api.php @@ -0,0 +1,306 @@ + 'Access forbidden: Apache environment is not allowed']); + exit; +} + +// POST 전용 검사 +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + http_response_code(405); // Method Not Allowed + header('Content-Type: application/json'); + echo json_encode(['error' => 'Method Not Allowed']); + exit; +} + +// JSON 요청 검사 +$content_type = $_SERVER['CONTENT_TYPE'] ?? ''; +if (stripos($content_type, 'application/json') === false) { + http_response_code(415); // Unsupported Media Type + header('Content-Type: application/json'); + echo json_encode(['error' => 'Unsupported Content-Type. application/json required']); + exit; +} + +function get_authorization_header() { + if (!empty($_SERVER['HTTP_AUTHORIZATION'])) { + return trim($_SERVER['HTTP_AUTHORIZATION']); + } elseif (function_exists('apache_request_headers')) { + foreach (apache_request_headers() as $key => $value) { + if (strcasecmp($key, 'Authorization') === 0) { + return trim($value); + } + } + } + return null; +} + +$auth_header = get_authorization_header(); +if (!$auth_header || !preg_match('/^Bearer\s+(\S+)$/', $auth_header, $matches)) { + http_response_code(401); + header('Content-Type: application/json'); + echo json_encode(['error' => 'Unauthorized: Missing or invalid Authorization header']); + exit; +} + +$allowed_password = 'XBv9z1IGqPUdtVf7DABFA16H0E154LJS'; +$password = $matches[1]; +if ($password !== $allowed_password) { + http_response_code(401); + header('Content-Type: application/json'); + echo json_encode(['error' => 'Unauthorized: Invalid token']); + exit; +} + +header('Content-Type: application/json; charset=utf-8'); +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Expires: 0'); + +$baseUrl = "https://ha.seoul.chaegeon.com/api/states"; +$headers = [ + "Authorization: Bearer REDACTED_HA_TOKEN", + "Content-Type: application/json" +]; + +// 엔드포인트 URL +$deviceUrl = "$baseUrl/device_tracker.seocaegeonyi_z_fold7"; +$geoUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_geocoded_location"; +$batteryStateUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_battery_state"; +$batteryLevelUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_battery_level"; +$watchBatteryStateUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_watch_battery_state"; +$watchBatteryLevelUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_watch_battery_level"; +$activityUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_detected_activity"; +$connectionUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_network_type"; +$fascendedUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_daily_floors"; +$fdescendedUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_daily_floors"; +$stepsUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_daily_steps"; +$distanceUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_daily_distance"; +$triggerUrl = "$baseUrl/sensor.seocaegeonyi_z_fold7_last_update_trigger"; + +// GET 파라미터 읽기 +$startParam = $_GET['startTime'] ?? null; +$endParam = $_GET['endTime'] ?? null; + +// Home Assistant에서 인식 가능한 UTC 포맷 +$haFormat = 'Y-m-d\TH:i:s\Z'; + +if ($startParam && $endParam) { + // 전달받은 값을 DateTime으로 변환 후 UTC 포맷으로 변환 + $startTime = (new DateTime($startParam))->setTimezone(new DateTimeZone('UTC'))->format($haFormat); + $endTime = (new DateTime($endParam))->setTimezone(new DateTimeZone('UTC'))->format($haFormat); +} else { + // 기본값: 최근 24시간 + $startTime = (new DateTime('-24 hours'))->setTimezone(new DateTimeZone('UTC'))->format($haFormat); + $endTime = (new DateTime())->setTimezone(new DateTimeZone('UTC'))->format($haFormat); +} + +// API URL 생성 +$historyUrl = "https://ha.seoul.chaegeon.com/api/history/period/{$startTime}?filter_entity_id=device_tracker.seocaegeonyi_z_fold7&end_time={$endTime}"; + +// 공통 요청 함수 +function getData($url, $headers) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $response = curl_exec($ch); + curl_close($ch); + return json_decode($response, true); +} + +// 데이터 불러오기 +$deviceData = getData($deviceUrl, $headers); +$geoData = getData($geoUrl, $headers); +$batteryStateData = getData($batteryStateUrl, $headers); +$batteryLevelData = getData($batteryLevelUrl, $headers); +$watchBatteryStateData = getData($watchBatteryStateUrl, $headers); +$watchBatteryLevelData = getData($watchBatteryLevelUrl, $headers); +$activityData = getData($activityUrl, $headers); +$connectionData = getData($connectionUrl, $headers); +$ascendedData = getData($fascendedUrl, $headers); +$descendedData = getData($fdescendedUrl, $headers); +$stepsData = getData($stepsUrl, $headers); +$distanceData = getData($distanceUrl, $headers); +$historyData = getData($historyUrl, $headers); +$triggerData = getData($triggerUrl, $headers); + +// 경로 기록 +$path = []; +if (isset($historyData[0])) { + foreach ($historyData[0] as $item) { + $lat = $item['attributes']['latitude'] ?? null; + $lng = $item['attributes']['longitude'] ?? null; + $time = $item['last_changed'] ?? null; + if ($lat && $lng) { + $path[] = ['lat' => $lat, 'lng' => $lng, 'time' => $time]; + } + } +} + +$lang = $_GET['lang'] ?? 'en'; + +$activityMap = [ + 'ko' => [ + 'Stationary' => '가만히 있음', + 'Walking' => '걷는 중', + 'Running' => '달리는 중', + 'Automotive' => '차량 이동 중', + 'Cycling' => '자전거 이동 중', + 'Unknown' => '-', + ], + 'en' => [ + 'Stationary' => 'Stationary', + 'Walking' => 'Walking', + 'Running' => 'Running', + 'Automotive' => 'Automotive', + 'Cycling' => 'Cycling', + 'Unknown' => '-', + ] +]; + +$aaccuracyMap = [ + 'ko' => [ + 'Low' => '낮음', + 'Medium' => '중간', + 'High' => '높음', + 'Unknown' => '-', + ], + 'en' => [ + 'Low' => 'Low', + 'Medium' => 'Medium', + 'High' => 'High', + 'Unknown' => '-', + ] +]; + +$connectionMap = [ + 'ko' => [ + 'Wi-Fi' => '와이파이', + 'Cellular' => '셀룰러', + 'none' => '-', + 'unknown' => '-', + ], + 'en' => [ + 'Wi-Fi' => 'Wi-Fi', + 'Cellular' => 'Cellular', + 'none' => '-', + 'unknown' => '-', + ] +]; + +$batteryStateMap = [ + 'ko' => [ + 'Charging' => '충전 중', + 'Not Charging' => '충전중이 아님', + 'Full' => '가득참', + 'Unknown' => '-', + ], + 'en' => [ + 'Charging' => 'Charging', + 'Not Charging' => 'Not Charging', + 'Full' => 'Full', + 'Unknown' => '-', + ] +]; + +$triggerMap = [ + 'ko' => [ + "Launch" => "앱 실행", + "Background Fetch" => "백그라운드 갱신", + "Push Notification" => "푸시", + "Periodic" => "주기적", + "Significant Location Change" => "중요한 위치 변화", + "Manual" => "수동", + "Signaled" => "시그널 됨", + "Siri" => "Siri 실행", + "Watch Context" => "워치 상태 전송", + "Geographic Region Entered" => "지정 지역에 들어옴", + "Geographic Region Exited" => "지정 지역을 벗어남", + ], + 'en' => [ + "Launch" => "Launch", + "Background Fetch" => "Background Fetch", + "Push Notification" => "Push Notification", + "Periodic" => "Periodic", + "Significant Location Change" => "Significant Location Change", + "Manual" => "Manual", + "Signaled" => "Signaled", + "Siri" => "Siri", + "Watch Context" => "Watch Context", + "Geographic Region Entered" => "Geographic Region Entered", + "Geographic Region Exited" => "Geographic Region Exited", + ] +]; + +$activityState = $activityData['state'] ?? null; +$aaccuracyState = $activityData['attributes']['Confidence'] ?? null; +$connectionState = $connectionData['state'] ?? null; +$batteryState = $batteryStateData['state'] ?? null; +$watchBatteryState = $watchBatteryStateData['state'] ?? null; + +$address = null; + +if (($deviceData['state'] ?? null) !== 'not_home') { + $address = $deviceData['state']; +} else { + // Locality 값 확인 + $locality = $geoData['attributes']['Locality'] ?? null; + + // Locality가 없거나 N/A면 Sub Administrative Area로 대체 + if (empty($locality) || $locality === 'N/A') { + $locality = $geoData['attributes']['Sub Administrative Area'] ?? ''; + } + + // Sub Administrative Area 도 없을 경우 Name만 사용 + $address = trim($locality . ' ' . ($geoData['attributes']['Name'] ?? '')); +} + +// 해시 요청만 들어온 경우 +if (isset($_GET['hashonly']) && $_GET['hashonly'] == '1') { + $raw = json_encode([ + 'latitude' => $deviceData['attributes']['latitude'] ?? null, + 'longitude' => $deviceData['attributes']['longitude'] ?? null, + 'accuracy' => $deviceData['attributes']['gps_accuracy'] ?? null, + 'updated' => $deviceData['last_changed'] ?? null, + 'trigger' => $triggerMap[$lang][$triggerData['state']] ?? $triggerData['state'] ?? null, + 'address' => $address, + 'state' => $batteryStateMap[$lang][$batteryState] ?? $batteryState ?? null, + 'level' => $batteryLevelData['state'] ?? null, + 'wstate' => $batteryStateMap[$lang][$watchBatteryState] ?? $watchBatteryState ?? null, + 'wlevel' => $watchBatteryLevelData['state'] ?? null, + 'ascended' => $ascendedData['state'] ?? null, + 'descended' => $descendedData['state'] ?? null, + 'steps' => $stepsData['state'] ?? null, + 'distance' => $distanceData['state'] ?? null, + 'activity' => $activityMap[$lang][$activityState] ?? $activityState ?? null, + 'aaccuracy' => $aaccuracyMap[$lang][$aaccuracyState] ?? $aaccuracyState ?? null, + 'connection' => $connectionMap[$lang][$connectionState] ?? $connectionState ?? null, + ]); + + echo json_encode(['hash' => hash('sha256', $raw)]); + exit; +} + +echo json_encode([ + 'latitude' => $deviceData['attributes']['latitude'] ?? null, + 'longitude' => $deviceData['attributes']['longitude'] ?? null, + 'accuracy' => $deviceData['attributes']['gps_accuracy'] ?? null, + 'updated' => $deviceData['last_changed'] ?? null, + 'trigger' => $triggerMap[$lang][$triggerData['state']] ?? $triggerData['state'] ?? null, + 'address' => $address, + 'state' => $batteryStateMap[$lang][$batteryState] ?? $batteryState ?? null, + 'level' => $batteryLevelData['state'] ?? null, + 'wstate' => $batteryStateMap[$lang][$watchBatteryState] ?? $watchBatteryState ?? null, + 'wlevel' => $watchBatteryLevelData['state'] ?? null, + 'ascended' => $ascendedData['state'] ?? null, + 'descended' => $descendedData['state'] ?? null, + 'steps' => $stepsData['state'] ?? null, + 'distance' => $distanceData['state'] ?? null, + 'activity' => $activityMap[$lang][$activityState] ?? $activityState ?? null, + 'aaccuracy' => $aaccuracyMap[$lang][$aaccuracyState] ?? $aaccuracyState ?? null, + 'connection' => $connectionMap[$lang][$connectionState] ?? $connectionState ?? null, + 'history' => $path ?? null, +], JSON_UNESCAPED_UNICODE); +?>