From 56155f5f5ce1a74aad3da70e38d06a57f6310914 Mon Sep 17 00:00:00 2001 From: Philip Abbey Date: Sun, 31 Dec 2023 15:22:21 +0000 Subject: [PATCH] Added Watch Battery transmission Added a background service to send the watch battery level to Home Assistant. Changed the Glance View as requested by a user. Updated to new HA icon using SVG in stead of PNG. --- .gitignore | 3 + compile_sim.cmd | 110 +++++++++++++++ export.cmd | 29 ++-- images/Venu2_glance_start.png | Bin 36021 -> 9310 bytes launcherIconResize.py | 70 ++++++++++ manifest-widget.xml | 5 +- manifest.xml | 3 +- resources-ara/strings/strings.xml | 9 +- resources-bul/strings/strings.xml | 9 +- resources-ces/strings/strings.xml | 9 +- resources-dan/strings/strings.xml | 9 +- resources-deu/strings/strings.xml | 13 +- resources-dut/strings/strings.xml | 9 +- resources-est/strings/strings.xml | 9 +- resources-fin/strings/strings.xml | 11 +- resources-fre/strings/strings.xml | 13 +- resources-gre/strings/strings.xml | 11 +- resources-heb/strings/strings.xml | 11 +- resources-hrv/strings/strings.xml | 9 +- resources-hun/strings/strings.xml | 11 +- resources-ind/strings/strings.xml | 11 +- resources-ita/strings/strings.xml | 9 +- resources-jpn/strings/strings.xml | 9 +- resources-kor/strings/strings.xml | 11 +- resources-launcher-26-26/drawables.xml | 2 +- resources-launcher-26-26/launcher.png | Bin 3909 -> 0 bytes resources-launcher-26-26/launcher.svg | 4 + resources-launcher-30-30/drawables.xml | 2 +- resources-launcher-30-30/launcher.png | Bin 4047 -> 0 bytes resources-launcher-30-30/launcher.svg | 4 + resources-launcher-33-33/drawables.xml | 2 +- resources-launcher-33-33/launcher.png | Bin 4268 -> 0 bytes resources-launcher-33-33/launcher.svg | 4 + resources-launcher-35-35/drawables.xml | 2 +- resources-launcher-35-35/launcher.png | Bin 4287 -> 0 bytes resources-launcher-35-35/launcher.svg | 4 + resources-launcher-36-36/drawables.xml | 2 +- resources-launcher-36-36/launcher.png | Bin 4326 -> 0 bytes resources-launcher-36-36/launcher.svg | 4 + resources-launcher-40-40/drawables.xml | 2 +- resources-launcher-40-40/launcher.png | Bin 4451 -> 0 bytes resources-launcher-40-40/launcher.svg | 4 + resources-launcher-54-54/drawables.xml | 2 +- resources-launcher-54-54/launcher.png | Bin 4942 -> 0 bytes resources-launcher-54-54/launcher.svg | 4 + resources-launcher-60-60/drawables.xml | 2 +- resources-launcher-60-60/launcher.png | Bin 5189 -> 0 bytes resources-launcher-60-60/launcher.svg | 4 + resources-launcher-61-61/drawables.xml | 2 +- resources-launcher-61-61/launcher.png | Bin 5246 -> 0 bytes resources-launcher-61-61/launcher.svg | 4 + resources-launcher-62-62/drawables.xml | 2 +- resources-launcher-62-62/launcher.png | Bin 5196 -> 0 bytes resources-launcher-62-62/launcher.svg | 4 + resources-launcher-65-65/drawables.xml | 2 +- resources-launcher-65-65/launcher.png | Bin 5360 -> 0 bytes resources-launcher-65-65/launcher.svg | 4 + resources-launcher-70-70/drawables.xml | 2 +- resources-launcher-70-70/launcher.png | Bin 5378 -> 0 bytes resources-launcher-70-70/launcher.svg | 4 + resources-launcher-80-80/drawables.xml | 2 +- resources-launcher-80-80/launcher.png | Bin 5869 -> 0 bytes resources-launcher-80-80/launcher.svg | 4 + resources-lav/strings/strings.xml | 9 +- resources-lit/strings/strings.xml | 11 +- resources-nob/strings/strings.xml | 9 +- resources-pol/strings/strings.xml | 9 +- resources-por/strings/strings.xml | 11 +- resources-ron/strings/strings.xml | 9 +- resources-slo/strings/strings.xml | 11 +- resources-slv/strings/strings.xml | 9 +- resources-spa/strings/strings.xml | 9 +- resources-swe/strings/strings.xml | 11 +- resources-tha/strings/strings.xml | 9 +- resources-tur/strings/strings.xml | 11 +- resources-ukr/strings/strings.xml | 9 +- resources-vie/strings/strings.xml | 9 +- resources-zhs/strings/strings.xml | 9 +- resources-zht/strings/strings.xml | 9 +- resources-zsm/strings/strings.xml | 9 +- resources/drawables/launcher.png | Bin 6412 -> 0 bytes resources/settings/properties.xml | 25 +++- resources/settings/settings.xml | 59 ++++---- resources/strings/strings.xml | 9 +- source/BackgroundServiceDelegate.mc | 73 ++++++++++ source/ClientId.mc.unpopulated | 27 ++++ source/Globals.mc | 1 + source/HomeAssistantApp.mc | 125 ++++++++++------- source/HomeAssistantConfirmation.mc | 6 +- source/HomeAssistantGlanceView.mc | 17 ++- source/HomeAssistantMenuItemFactory.mc | 39 ++---- source/HomeAssistantService.mc | 29 ++-- source/HomeAssistantToggleMenuItem.mc | 47 +++---- source/QuitTimer.mc | 6 +- source/Settings.mc | 136 +++++++++++++++++++ source/WebLog.mc | 179 +++++++++++++++++++++++++ 96 files changed, 1152 insertions(+), 260 deletions(-) create mode 100644 compile_sim.cmd create mode 100644 launcherIconResize.py delete mode 100644 resources-launcher-26-26/launcher.png create mode 100644 resources-launcher-26-26/launcher.svg delete mode 100644 resources-launcher-30-30/launcher.png create mode 100644 resources-launcher-30-30/launcher.svg delete mode 100644 resources-launcher-33-33/launcher.png create mode 100644 resources-launcher-33-33/launcher.svg delete mode 100644 resources-launcher-35-35/launcher.png create mode 100644 resources-launcher-35-35/launcher.svg delete mode 100644 resources-launcher-36-36/launcher.png create mode 100644 resources-launcher-36-36/launcher.svg delete mode 100644 resources-launcher-40-40/launcher.png create mode 100644 resources-launcher-40-40/launcher.svg delete mode 100644 resources-launcher-54-54/launcher.png create mode 100644 resources-launcher-54-54/launcher.svg delete mode 100644 resources-launcher-60-60/launcher.png create mode 100644 resources-launcher-60-60/launcher.svg delete mode 100644 resources-launcher-61-61/launcher.png create mode 100644 resources-launcher-61-61/launcher.svg delete mode 100644 resources-launcher-62-62/launcher.png create mode 100644 resources-launcher-62-62/launcher.svg delete mode 100644 resources-launcher-65-65/launcher.png create mode 100644 resources-launcher-65-65/launcher.svg delete mode 100644 resources-launcher-70-70/launcher.png create mode 100644 resources-launcher-70-70/launcher.svg delete mode 100644 resources-launcher-80-80/launcher.png create mode 100644 resources-launcher-80-80/launcher.svg delete mode 100644 resources/drawables/launcher.png create mode 100644 source/BackgroundServiceDelegate.mc create mode 100644 source/ClientId.mc.unpopulated create mode 100644 source/Settings.mc create mode 100644 source/WebLog.mc diff --git a/.gitignore b/.gitignore index dbd8c63..f2e2d14 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ bin/ export/ **/Thumbs.db settings.txt +Thumbs.db +# This file contain credentials, instead provide the empty file ClientId.mc.unpopulated +source/ClientId.mc diff --git a/compile_sim.cmd b/compile_sim.cmd new file mode 100644 index 0000000..a3f3159 --- /dev/null +++ b/compile_sim.cmd @@ -0,0 +1,110 @@ +@echo off +rem ----------------------------------------------------------------------------------- +rem +rem Distributed under MIT Licence +rem See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +rem +rem ----------------------------------------------------------------------------------- +rem +rem GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +rem tested on a Venu 2 device. The source code is provided at: +rem https://github.com/house-of-abbey/GarminHomeAssistant. +rem +rem J D Abbey & P A Abbey, 28 December 2022 +rem +rem For use when VS Code is misbehaving and failing to recompile before starting a simulation. +rem +rem Reference: +rem * Using Monkey C from the Command Line +rem https://developer.garmin.com/connect-iq/reference-guides/monkey-c-command-line-setup/ +rem +rem ----------------------------------------------------------------------------------- + +rem Check this path is correct for your Java installation +set JAVA_PATH=C:\Program Files (x86)\Common Files\Oracle\Java\javapath +rem SDK_PATH should work for all users +set /p SDK_PATH=<"%USERPROFILE%\AppData\Roaming\Garmin\ConnectIQ\current-sdk.cfg" +set SDK_PATH=%SDK_PATH:~0,-1%\bin +rem Assume we can create and use this directory +set DEST=export +rem Device for simulation +set DEVICE=venu2 + +rem C:\>java -jar %SDK_PATH%\monkeybrains.jar -h +rem usage: monkeyc [-a ] [-b ] [--build-stats ] [-c ] [-d ] +rem [--debug-log-level ] [--debug-log-output ] [-e] +rem [--Eno-invalid-symbol] [-f ] [-g] [-h] [-i ] [-k] [-l ] +rem [-m ] [--no-gen-styles] [-o ] [-O ] [-p ] [-r] [-s +rem ] [-t] [-u ] [-v] [-w] [-x ] [-y ] [-z ] +rem -a,--apidb API import file +rem -b,--apimir API MIR file +rem --build-stats Print build stats [0=basic] +rem -c,--api-level API Level to target +rem -d,--device Target device +rem --debug-log-level Debug logging verbosity [0=errors, 1=basic, +rem 2=intermediate, 3=verbose] +rem --debug-log-output Output log zip file +rem -e,--package-app Create an application package. +rem --Eno-invalid-symbol Do not error when a symbol is found to be invalid +rem -f,--jungles Jungle files +rem -g,--debug Print debug output +rem -h,--help Prints help information +rem -i,--import-dbg Import api.debug.xml +rem -k,--profile Enable profiling support +rem -l,--typecheck Type check [0=off, 1=gradual, 2=informative, +rem 3=strict] +rem -m,--manifest Manifest file (deprecated) +rem --no-gen-styles Do not generate Rez.Styles module +rem -o,--output Output file to create +rem -O,--optimization Optimization level [0=none, 1=basic, 2=fast +rem optimizations, 3=slow optimizations] [p=optimize +rem performance, z=optimize code space] +rem -p,--project-info projectInfo.xml file to use when compiling +rem -r,--release Strip debug information +rem -s,--sdk-version SDK version to target (deprecated, use -c +rem -t,--unit-test Enables compilation of unit tests +rem -u,--devices devices.xml file to use when compiling (deprecated) +rem -v,--version Prints the compiler version +rem -w,--warn Show compiler warnings +rem -x,--excludes Add annotations to the exclude list (deprecated) +rem -y,--private-key Private key to sign builds with +rem -z,--rez Resource files (deprecated) + +rem Batch file's directory where the source code is +set SRC=%~dp0 +rem drop last character '\' +set SRC=%SRC:~0,-1% + +if not exist %DEST% ( + md %DEST% +) + +if exist %SRC%\export\HomeAssistant*.iq ( + del /f /q %SRC%\export\HomeAssistant*.iq +) + +echo. +echo Starting compilation for simulation on %DEVICE%. +echo. + +rem call %SDK_PATH%\connectiq.bat +start "Simulator" "%SDK_PATH%\simulator.exe" + +rem Compile PRG for a single device for side loading +"%JAVA_PATH%\java.exe" ^ + -Xms1g ^ + -Dfile.encoding=UTF-8 ^ + -Dapple.awt.UIElement=true ^ + -jar %SDK_PATH%\monkeybrains.jar ^ + --output %SRC%\bin\HomeAssistant.prg ^ + --jungles %SRC%\monkey.jungle ^ + --private-key %SRC%\..\developer_key ^ + --device %DEVICE%_sim ^ + --warn + +if %ERRORLEVEL% equ 0 ( + %SDK_PATH%\monkeydo.bat %SRC%\bin\HomeAssistant.prg %DEVICE% +) else ( + rem Wait to see errors + pause +) diff --git a/export.cmd b/export.cmd index 8ce3b82..4f5315f 100644 --- a/export.cmd +++ b/export.cmd @@ -1,21 +1,23 @@ @echo off rem ----------------------------------------------------------------------------------- -rem +rem rem Distributed under MIT Licence rem See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. -rem +rem rem ----------------------------------------------------------------------------------- -rem +rem rem GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely rem tested on a Venu 2 device. The source code is provided at: rem https://github.com/house-of-abbey/GarminHomeAssistant. -rem +rem rem J D Abbey & P A Abbey, 28 December 2022 -rem +rem +rem Export both the Application and the Widget IQ files for upload to Garmin's App Store. +rem rem Reference: rem * Using Monkey C from the Command Line -rem * https://developer.garmin.com/connect-iq/reference-guides/monkey-c-command-line-setup/ -rem +rem https://developer.garmin.com/connect-iq/reference-guides/monkey-c-command-line-setup/ +rem rem ----------------------------------------------------------------------------------- rem Check this path is correct for your Java installation @@ -118,16 +120,3 @@ echo Finished exporting HomeAssistant dir %SRC%\export\HomeAssistant*.iq pause -exit /b - -rem Compile PRG for a single device for side loading -"%JAVA_PATH%\java.exe" ^ - -Xms1g ^ - -Dfile.encoding=UTF-8 ^ - -Dapple.awt.UIElement=true ^ - -jar %SDK_PATH%\monkeybrains.jar ^ - --output %SRC%\bin\HomeAssistant.prg ^ - --jungles %SRC%\monkey.jungle ^ - --private-key %SRC%\..\developer_key ^ - --device venu2_sim ^ - --warn diff --git a/images/Venu2_glance_start.png b/images/Venu2_glance_start.png index 4d4a1263b3bc1226ae90fbcbce8e9f1176d56bbe..57238dad27ea79ed8f007b9eef1211f86ee4703e 100644 GIT binary patch literal 9310 zcmeIY_g7O}7cML|I9L!H(gg%WnjlT;0g+w=>0nTLuYu6R!GnU797;k56$4TNQbG$! z=qOccXdxhk5+oQRgc8Dy?+@SiN8G!|&d3;hthMJ{WzO|H&)mt+%=E9Y^RS;ebLNVn zfv)A5Gc51_{MgPipSW7xyUP4K7ph}u#m2@qzihsA=FHtQhPv8T5rx}$a1!5o(K@Ae zHFGz+2^y=4%L2-dyZeZ&Pp03Jf6X=0V5o9Q$>}^xl_T2NV@89IKlcf^cvda*%jp8S z3s1xvf7M!Fh5Q_1$Z0)1-_w~uTk3Ey7}>p^C6{5Syd{M9yh7Fqm^AN0KBDQT8NacUJk7(Em`S#BXUY!$N(f%xe8;12o@bNH&vsbly8(asP4XnoVITx)#C2h z*P}+rE|5y2mJhT8t+<;n-lOJ<6@fp6(+`8%Uv$n@)$_Axa3q=oOG_n7Iw18EL z<5xBxSQ}*poV}>j%~CD}otpKN@lEw^$K?V;^(w3+`1$#mw?86KR3aQ0q|nrq_PlHK zmAdpSfS{?WBE04?c$u}(PS~>tyWBYIW7eivao=_zE1>Hh0@FeQKcb8Zc^Uq?;?c!y zb^5;9u=%V6`}*7huqeTdb{^uzGxt!SAx8YQsCLH`&5ofIs5*k4;<5!PfyAbAd3}|Q zYN5Jr3H}||JXDsl;n`0)0s_J=UmS$iSDRK!3+vAN%lYR1OCc?ke*7KghHSFIJ-RTG;=r}2*%8+!KUEJ@9zA^p9@v9uSY@VNk zId1xf18*CUw*MSNwM{&}Pk8Za*Svbge3}AktqXVEP#Sv69rv;JG-7afZyEchISir&6kz> zzgwzs18dR9xl6WdxRvP}S30&cKbVnSm~cH4CX%qw2y%F#5Os zS}1dR{mOeqAGHO2cprM$rDNj`6mtHI+ZwRMVd94GxT*&i1Wfq1 z)yxMdCbxTE1NZB^{dYZxKKVgVdHG9H$z9$?`se+51n!5xW&gQzW)e_l9+A;nQAtU> zls+;Ot|w`njbKKqsLO1VXk@=!nRKySac+}0kE_FQROy)4BYj0MER&4N001MI_kN||Hx1lmc|MHc| zH}_6*q-RMO7*B)LTHjpS(slj+l3&Ai+^zP21vp1Se<10snR|9W$V1Hv! z2@#I82;<#5ik|X8_@q)wtQK4AM2#fi*$o>v*)J50a^2>4pS3SSmRKJ??Z?;RcBXiu zr^0=UU1i$YM0S6YkT+cm{WoBrPOk%CoFl{f9Q-pTO>zDmyWY47t{Xw!c^~7S8$BMq zT_kC&nlojT49~CGB3oCXP*V<5jj0q9g16#?{12^<-KueAk*~&r-}UxB?H{@S?N;{4 z?P5UnVpS`W#7A3eQikAU{AvS1h0)8sq80l$6O?oTH-51OcdE`{QnCb3DkYU&yA{?f5NKrD@nk75ord80yfIhm3w*B84* zCeMSy^tfam_cFb7ewJ7Lyb-U1!Jy_BYDbC4q+i!IHiw!nr%}OGZwU1&U4V6`P|jLf0ZQ$OSe8{AfIZoY_7U6 z^NE;XkkQtUP~*gu^wWgID1-z0*rRmp*Rf0Ka`ILid348yusC%XLopt_&~L$Q-C}9A zm*6;GG|1_DkQabAmQf8@H|u659s3`1cP(gj`}~Uf>6YF9kY&dTz*o#*mYgl>lX^-v)I#_I*HODz=rT291bVq%Pb%s*rmyAfpM zyB=b(Uhg6~;b%i=+ajZ~d<-eAqUdK2i{)qq!+K9lq8VqeM#yU@GG0`shF~I|#>#IM z!H$tMpTI?b4X-QDA) zexAv^1L~+q9dMQ@{^nNwq?SQOqn*(!{FiTtI()-v))t@UOhXH;zr*;V5U*dklAkTm zXd1P#09m`~yyvh84o8^X$~Tp>R}Dt({zSKyvpU!;*%M9M$DioAwutf!WHK8Q9|;SG zILLeU9%jQw?2#wSA{Bf8_&NyAIShIas`;jHKkwrV`a7!cPLL7tHb3-R#M}DQD(9Bt zn#*c6^c8pLRuudsAv0xeE*5-XAdi6ILPo(4qSqQDLiAFFmg4i2YT_GoPZtwS*4mTS z8AprXb8cpff}5)4HEed=M+S8IqDJ@L6lXr-NTYpm-@L#%TBr$cpA=tVQ@N|*%C54v z86y_D*ibzkNFpB}cU%7$MQzq#9QC=wrhU{^Ec%kYC5rZXcGXKQ1wLQ@<0og(gVM?J z#;~K*;2ji}JH)!jl^RfYd&F?RFl^^MHF)hq#*;evb>gq=^+*!%9k+f5%cdcizfe@Q zgbUtt15|rE(ppni>3u0!Wo<|sL#a1-WzU(;$>sk%!eWZ7tcO? zusPCMVWKBBsP?cgt-#w7=JXA;_Fa~z*kGu=z(Im=MmtgN5JhvT0Q)JxS#QQwOKoO*tIkEBrL=ZdJTJM055?Wt6&Fczra<4$l%5a-Q$MVykl_^=6JP4vXEI zE2yvWsLUPC`+Bh2+PLjCP-w|W(PchlT$}|Jk7CK1|GQ2Me2%=WvYOu}iw#0&usj!P1chgeiylk}nYOe)decKm5_` zsI+n%+IJyoD^uKFa6Pima)9q$*oOUd(xdeFbK_YK9Yxk54((6Og=>Q~Wr8~@pj*ne zj8z+%lIZLJOnHx{zh~n}T;FUJK2%>#5OjahJ7WU&_#wCAkHLyRgPJ@$Qj(=C_U%e} z^4XEEyL&m9wI$q&t`khlLA?&hbgL42&_DAjNVZb+2QBzImb+@b$W9L?NoYG7 zc06?I)GXnz<`y)>``Zv&QB*>J5-;*|G{OV{55#JGeO(}Lq}yoe11xI6&_3?R9vU3H z5PyXyiZe)g6on43X~?g+FP3m1-J`wX9DTkxsA~C-u`lWbNTwTF+1+r{7(KDg3-=|& zJSG0_V8)WCuCH}_d*jjeUK$pVGN6LY4R&s+-f7q+H~;Yq+7oSet0(%iu^w~WCI(zYOGygHmi*vf*p;WK&K_AxQB-i?^)Fk}F1i*?=eAx;~P4|~oxjSsZ8 z1GnKjZbdGu8dT%Qk&H|;D}3%^OliEk5dtk<|4!0_hbRXYqv{(Y({9x!1do;7H1O!V-`4)R3a&>9?%R zro(>w7d!86EPXvC&3v-e$S{3ZQC@mQJMUjXtKET&N}$=sB7dPKH2`N@%h;4W>Jga; z=)bffBMrrzoXl&{t337sXp1+7`y+*IM*G6_{=7T4msDRaZ= zt#mEayhuaw_rsX?QK|#Ki>CRkMS??CuD0}kEw|;dXY>t22M{qbC6;Z6e)H3j+fD$? zz92)s03^J=Vw5vJe|kn0mU=k$@cVs5gSQ7asiPh5Q?lRu+du9bCDZaZpTPQ&^|l}R zvRsAoGmTEmf`2FSOMUL?xv;lM{x4gcOgKI$-KIha$$J(M(-9!!z4UHrr9!lnsfAI% z;~%#EC3T|W=}2ZwoVHSMriA2{6Y%GpdUAb5Af-S zEdXe$JuP>nq|G5VSWzC5K3dZ69~e+Rr)YeCxej>VdDWj|d9yW$_?oA!_yF7WeOue8 zk3Xmu>stfJjOiU5uh4wY82J`Xs1DK<^Kh7*_cxb#@I=~s^XeNJNS=$$ZMb=OqN{7Qa>f%2yEP#&U{ z^iO&(hZ^|CDY%=$Rn0@GefQIke4a`>$0Vb2^sREdv&h1QOoMXPoJO0hRoK+#4?&0g zlqG>-_Avad9cR_t53MAj^j<;uk)*4dj(9Fs>y`7~y}jT3Q~O1qx>eFtm&!_66((F@ zAm)1y9;t~qQwlPL(urfgop1-hsNeoGmrwM)Fs45NlX*&SdOOg1CL+!jif2@1xaTOO9Zc2UOMc46J#jLw0-NMSz zZ_Eo?rhV$V+Rbkqq;KmM$w}EEtE;N;kOw;c-eWT7_jZ}^#7^Mi{!tV50~Rqfx4Ic) zAhblc@HuMs(KA?i(Brx%`4~gbhhawBw*eht*DKOP_2Z#F%~^Lep14hG4~FEWQE_K*tPAOKFh&x$P%+`*OCsRwOOvw!=%uu4ULVCL|3< zsfOzHe0cib>XEAAwVo{+W^`_f!K?3zU7FdV%^_t14hJ@0qLgQSolj7-}xJ$-SSh9~e6nH7h zKlCx0ZK!mzn3V~MNcRR8{N_j2sd%l?W91?JpN+BWTj18?1=EJ5Pa$@&q_1qObvtXxc5~T99n@Sv*by!b6=#=-xul-5 zTf{DKVlRmmGQ zBB&Q|$1UbK`?XJhg(x-^xI3J)f;UbdCV;mRb`6wY+N2SaF~v;klG{|D4FFoHa`Bn` z#GT0=Pe}*+Ye#M?q2@1x}lLMaobDROBbkm;b5jEu}_=k5&8_rU_K=mwjrLqgRb zMkb&o_TIgxae|DYsQ+Oqv5>rRRq(eus1NT%gePsadwk528ww8pW@Dr-!qj=-#Q{1U zEZ$K*g=*B)jB}v?*}_9Nu>!|mSJfwY+ybObRZFl3CKUQ(BL6#eFQj0c*VVoZEP{1n z_pdWl&uSKN;k6DXqgxNX5JqkqNP` zOYy%`)s|MjkE*!(B1YY}oor&|SK^l5DSuF|bf|A>w>mf>*m^=iOW#FnX!@+h-Fc)R$*p0rzuXLxgi6pNwQ>Zrj?hC#H~Y4EQ1)(vIE= zDiDLJw{-qcwJbIj&c`>Y-y0VRITJSFuY`_Ks-U|6PJkooLBrj_|E7!|4dj%7FkcFX zJ=&j)(y?vF1?c_P94CZy#IYC?dYAomp)e^aqIjLGJoK6aIWmVWu(!K^QGQRJA&a;h6hd&wyFL+u=I7-PO!l~$dlx<*BK7X@+T4>UMe1_beABeJV z&fcn(IgP?so^u8Xf6N|d3Lvwd?B-l2`o=t?Eyu%ANQYQY+C9T^YUFz6%FPs2TNTWs z;oLp|`VcUM2hEH903;@}I%PIU(v=SEAEWxH!mEfqY0kd@BF>fBOriDZ>f|g7!{5AR zDhTT8S4QO4>&w+ctdW&>cj)7-%y^UXL0od+l6|~gTb&E5u&E+5>na4lpHoNePJNm5 z#9kfDd+LS$;Oyz9F#1tJ_~2eCV$7@2aUz-*1|CT=updCzzufDc3V}-rGm%uo^&mzt zd~V4Sz6zFt+WhyTo2NmkZ0;GX?mqc`?4niw)+WL!|v9ALgVxZVZeNZORDz{ zE-fiycjk4tv|7PL|LE=JpG!-r-pagb%%L&>Q(^cf@A3l%B7=F*BXRbmlDU=08dqW0gxPXJ)+m=B94Z>3CsB2uk@8YX6n01J zi@K|Bs`zdOQ@vd9K#v9S?nR-=WK>`7SC&nME$D@1%4W446HgpqtPHE7kqxb(K3QYJ z>87q7hfLY*4v2u5@*xS5Kc|j6aD^mx^(KrEFSS+=Z0KPAbAHyB+ZUbIgi~TheOlQ( za0g}DyxF9A70JC>`}EyVLXh3iyO)2zsL6JXD(hfNBL*9auYL<2M?0dZRJCSsRP;)} z)=}r_L1&+NT;uUR-cM{x32zJDCH0vrg)_oe_RRya3|cMraJpd10oh9MYxYpXf6|Bb zLd=b!<4nXc)|qiiG;agZr%zu!^Ye|ZDz&{MbNlqksW_!*V5yn000te4_@-B@ACC2= z)H2aCS`(gSn{H(q$RRV=4=GXTyAPj3G!e#p$;#sR`Z21S8oqRLiH~{-=y%HrcZqqD zmJV1P$d_QJEQt5%St0NRxfZ4{LqUV+4|6ATX1ry!%9@p%UweRln=lJLbdR^PSI~wU!PA(L+@>+(;IN%REs~!}}OP+*su=HU&%(zXe&}fOr*t-;GR#w( zegIT8|3H@Ubc2+wyc8*o@eJ)h?foZ%#DKRA4T@Pxxw-C;MTplTR;*?t?0Bx|?HR&Aea$;XRqDzid`5c|Q>ZKiy)@ZU5u&+Hj|2_s(@MmG|E7NabA!X}Friy0I z2yfEX|2eynBCv3ot>lyDNgz8FC&AytoJ$`Bk-c%snN(7d*;k}_CMbO z5cao{ojP~)UxPOrj+-g`bqBYw__{ljD}oLOF1>$WtSonuVC_xVx-JKW{4$TvVvhGo zM4fNUH)h$fD>S_GF?VRWwrnS|H%NouJySij#WoKh85jK*!T4HZInHU(fJCXSdjl?B z&Ei`wIU}ynof8H$%c;qke&CCug*%^6szlleaX%nZg2@&LiM%e*)znJEZ(G~}kcO6O z&yk^!4)56QEnENw7)o0t9}#MBG*W40q~_VH9hW&Q(md(+EMWs4^;rQ|<0~F@vxpbx za+pr|KY;Hh(my$#dr2A!>fjz#z%x?^6v58L{{Od|nBTdAs97I`TnPv`5oG#kE0V1qN``2KXAsIQxa3KdvVdHCrnM%po4|_N`NVk3_S^DK0v&ccAPa=GoR-^c3F1$ z@a$n4k9?hP4x43wc#N*MSQ4E%wzsOyzpsx1ia< zynpSIQ*@?scH1YjC@D#uw%zz zYK)(v8*39yy_JIv>mv(dQ(;*+AmPGu|w&gvHUb(s`n6 zX6jmThgHSaPod}g0yWQ>>GoWQXHU2NC+UUQPK~8gYp95ZC%DpF-SFNUw^JVEeVNHt zmOYI7hf+X@zto^>&qQ#Au+4_6tADI0g*@Lx%_|rJ{h+pn&AiLwC2RbSMfUEl3VsqNJn@4Z_gf z;dy4T-uHLT`qnz<`vY0PAI`I%z3=6EWcwbootFW7S5%>YmTwYBc3#%lC^u!n+_?Z}X>yaZC7TqQE7xwM@TpL(e zk#}w@%0GY`ta{15ztmn*heHU4jx;n9P;lMNBqb@!l%s!v^2gC1k)x+UH4&KHW9K93 zyy>U&BC*x)5p&{A;2#DpKVw>kAwT0Zh8=%G_eRRO26jUJktuuvTsyq=!p4+o_kyOXxPkiw1&2*sb(%i+59m4o9ySG@O6?0Rb2eLTll>OID4 zx3;*KXA+8>Dh%pcc}|DyHwp~z7v61m%Nc5WTlmURoL}qfSl!Ffiu^5d(WB?sOrt~J`RS}Vfo*|BLRhMb%-@U;h*>jrjrt9d^`hK6t3 z`X|go7~e#cn+jDSp6Z()2iRK$C>m4-5!%6UHQjr+O!D}^nzNca0H4x^N^Uw1#UB~))Vr2N*KXhMSb~4|1Fwj9`iHAO zJ}{W5*uZl6&4jFeaPC?ZMLzDIejHlaKWuNySu}d7FxMDTLN`C6Ky6~{JN8An{X6Kv z#Hwj0p2nbDZxy+*vQ$#6xl(nsn+iO;*TaVuV%1|e z5BE)7Ltvmy>M=uvH~#QIv4ti$|M*k3aA*ZiAi|H>Ub+)&bD&)B%cJ;Q!L+(b9MB#K zwaM(=PPa1BmHEsB3++^w{@nm?M%#@qxQ4MFY~x71pNCuat~+~uO0Z!9;!Ie zN}7c7e+p88aP7LJuF?XSa5_mm4hvJ`KDeyzRpG;VOExj976*HNbjq4*~BH8=IYIEZlV+~7i26U@DIWG(t_<~J1JN=vL)Y2 zoTalM&EIu|*w)KZ1cp+)SwX)PF6<}T7M3oCshb<$t z#lo}3ak%E1-u2sw7R`FGiQw}MLB*J16#f~D`(rpkEp%vSa?4ka;9v%LgW67kYs>H$6tv!iYj zemh4U#P-qfk0ruWmdqiiO1g{biz?FXvD&Lt+QVF$o1H<+4`j869dYNhWW-B5l0gnA zdi2_`oJuFgnoIDUP;cZ(<) z((K&*neXCGx=U$^o$aZXTzn-}dYbW1L-|G-w|njNWkuA7cV~wPT0H!SiI=PESZ(IG ze-#;V;V((u>=PuQog~QHW8Ahx9C}AC)L3var-8uhdkB2?16oLnQfA_|1^q~uJU_6) zUN%DI-Sd~H2#TaOo~~&$uEOx~UQ@FsH7YW9;ye!b5ZoaavXk|J%ttrsQK_toqxT80 zXB*3VM95Vw%-Q4U(@m9ZnFT|=FAWa}#Osi9LJ)S;RC}GFG#_NQtXZF z)LFov?&XX+R%K&~2upm&533^=sqHUD_DU%&`ju_gE6_#Ztn%kpmO5qVXA*pQtv^m? zl)Qn!R}?tLwm&#Gty!~uy)AY5eymKMj?|g4X3df}G)0Rt`oX#bmFy#Vi&Fv&-mE6Z zc6&HWCrqPP4s=HCMEqMOo-B%q3<9lfixQZK-gchwS2w(%Yad6ro;`btGy01qhnE-mrIZf0+n z6Lqng{vH|T>(p*0$OR_5ADpK^8~U{<^eDc{xJQZZ{OKt-hId7(c^zrCqzFxP9n{ob zaa0e`btlD{^Ho)*Rje10Q`t<@L0a61q-S#VXOfxdtjbuZzqu9J4%p#SIT-f@j$jFS z<*v8Cj`Bno5EonSSCw5zICU&GQG)6%_}v&Czj5Xrs@3Nms=Hrd0otqwTYEWEd?dg0wdL2FiJ2uZq>o7jEgH_r>o~FSVm;Nfh$PW;%%i+}aXuu}Bh%>`>n-&o_XUS(AOJ-BQAq z2xMTpQ0^kXRC}a#>P@y1Mm_!b&bc>9vBl;})@0%1Qf=xR56DR+j=ls!&yfgL=`HIn z3x`XAF2SYZKuL%m%=Zk;!R$PI^f}z*gN~aws@ivnu64ggUNbk9O862pKjfub0d&hJ zj5GfN4(@=POg2;=)0U+jtrzm zlJ+uIyL}AvM-HL|RSTN-5u6%v)TK|2)rOz8;yiz~jx(Au{3=q4PJf;7oDn06hhm>| z%jr#f8EVwl@~Z3VfloriIP)*WSjPb!lJu8&(K%BuFl>E5Z$dLFE8}S1>m2i1zQ5WA z5$10;RWERFU|@!4_p>TG-v*6*C+l-KrX@g+WNSTNjGObcy^}5;)Ht{bS0Hj;bPY7a z*0b(piO1Ev;sX+nOCuJxT!0 zic}sh;?a)M6si63F7kx?{Q-x>30-f1p)4x>WRdtMYwuys!pSz-!P9~GeT~YsJ#a-$ zz%WI%wt<>Iu+W|s@gU3e$ectGCjBCEVjj~Z=d@^~yYQ>yXOVLWFg3O4s^e&xt9z(g0JqMt0{sh0&R%V(h6H(=+$?j# zZ%K8cu|C!-J=p<*ZeGKz2H&zM=L*c2Y?sq=2jnJmU>vcvJq zIQ{W`{&Mxt6DLzuA9&|*NVkvkM4Bi38%v$@2n%AgA@&xik;nH#Mg*m5hz>YPgv(W3 zKWDbwU^th#bWYQQ54|PdsMr82ce|D)=lCYIE*P|p58=vRK5{RM!<<8#GGQ~#rxHyC zSlAiQ6v`)uUq`{wRmkZa#t^e_0KKX0cW=_{b5T`V5Q&)q7G8xo^z&xg?An?6eoaWd z+voaiTx!20slz4W6iNm`0>*FgviB+6Ou|ZU#}S8Ju#YAq8xCLdvCq)HE0A?lNm1c_ z5`Hm_hM?8;Y6CEpPEV4JZq{v^lv(dDcFjNugKW~y>vSm6wN%CI@tq&xF{laX=N$kZ z2Lq_o`uN?!D1>Vz=>j+?e%QYIwc%7Q6WvY=b4s5b4i((kN-3V3qf9t8>eBY6dJVB- zZJ47px~Hk&B1)j2f;BDoWhWVWnkVf#3FRU+^2Wu#r{2$^B_oaT{JugDHc@Qz7dJLz zh!AJ>y1k8k{j%0g$~t&M9(U@8*?uR`@|_LQUWojl^(-gnT_xequZN;<$_}eLpE6gk zcKLZ)@}r^BtneFj0fb!t>SR6srMEp57WI9^{+qdy4bYQ|b+QUN6=x*Y2cu>z#IW#E zkzA-I@%XsP1aqarhE}G9VBBu`DdE#}ux}8H4V5QQ%%f%)bb)%9_U-)U2S0c9jC~Ja)5uMY{{u2eB9cpeC z-Ch~_uE+G=tRZJ%c;VOyWqG>eqsp}T-Lb3 z&B&krhyo9R@>AFAdcpzk^XeRrcae~r2_WBT{N zM+&(fjz&YUj=(^|-B8+*u1n*%%XOlRy5`%|umF0h19py+9JaVaPxm%%won=Mg6Rm& zLw}@ic@S>0ws9HdLPpxY>o=Bq*Hl?v!q<*uenEoTSxZN$;ZNH?l&8lmJL~rNJ-$5D zP7k1jIF51vxXTP*7kI6Y!L9$%p%+K!lvLq{kQcg#C@9$fOO01#2kdGNBYN1WSwtSZ z_eM{D1On&N-(KK%B4oeAm~su779`h3c<`rtK znG*XTMw!EX!9dlbEUXtl< zHgW_1*}iRnG1yS`-4~~~F)pNX4cgZ^_~$xk*Un7I|8cB?3jM4b@2RiVE-_$3r5g^U_@`$r< zH&s*6H9vlR`EC~SneM4*ZDORdHECgPhhRm#+dyLIT943ceLqEgcr@d8XoQrBaAmbp z5^+1nOs-*g&HMn#P8vO5S}=9F{hBGyQFyIR7zYM-r>lMz=G1Q=!+9IlG!zNZRe(Dd_zytpoWlOWSYGgQwuX$A8Il%g2;WAg91uU$oX8>auCv@kf`c= zd}rkmS>Lct$LsRzLmm6hp?Sa**A%q1h2$?j>DGvniK$yqgR2kHMANN?++Mnu{-=E7uj%!ZM zBF9T(D8u~JR{97D$G;m>Q;aD3HCOb<)7(1HL48`3BYPP~ z=I}l!G@E%pXX}IE7yF5okb>#*f$TlZf-5GB8jbfPMRhH-d7KUcMF3Giy!#h?+m!tR zo>WfL-xkGEhBswmM((FOR(G}O`bNrEK2c~2aBm@5nSUNl+#~qf8vtD}yM`3}=0@H@ z9T7Q(YlgRCbe*tR>%B`oPNrAakUh~O7OV)L8p(Rc8cC0z0@Lqnl(AG+Qhlp)*jQX9 zz3LcU*9){qA`z<({A9>NnIm^l<5^u%#10Y^Gv<+R?NroTHw;kK)&~3B4o2T8Yh}I2 zX9ixKQDHXuOZ3o^a`etKig*`sjz9+fB9P=K5c<|Y2kwm2?@wke>^gW*C~oSRR1XDURsXH9J=lT;@C{{9%Qsdy2%}H%94NP*kHb%XsUsBonR*#Ih33bg+*45#!PN2d1 z5?Q~tsZR}eH>(fA$oO;m?Ljx5a*blSQ{NI_(*O#}=fnrX?+2YlW;G3eO^W&e57P02 zcUc0-774(S!~cXMR=*K44rl{CEC)c_8W=z-tB->-9l=e}m8Dc$OTc*Mu4AkK0C@2j z7xZc1FJ99w@Z>TK29HTwm~*&*%=4)>p5}RCTTAUvN~6-pYR9F|5+i5V>|NLSk|>hG z%!NKR9F)dr)Ceb2Zks&a+30QyMVwyoHy|~jPT@A*aaG_7ZL-F?)^;&>>7!dxbHw6f z+J4B}_FFYY2_p)HxmVGrdg{Jm=aZo?%1eC{__yZJd=*%k%*3!mM5L2zsEJwELZP!j z&YusBP?{dFR<%@1hnyE5nT0Yv(%6Q-Y*oGyU%6~J`sFYmD9FFCj}Qrb<0Fqh_Ezk8 zr%TsUe}SXGWi5U&)$5}hM9<1-!tpVq^a;$-l7gEzb!mGq4=00zn!5@{f zaqA0r1@-%5hHX;f1+QHe48y>Y8`gcI*+PSa%bVrvgGJ=P5PEwo$f~m~I$lQDlDjH9 z_+|=lZi+ZrPB7lF6j)8}I5Ot+0Do+krbJ zvh@sFOX4puPxjE7E8*xpBD_f!C2s#S zd>Y@HQBl_-7H9LarAH=GCmY}Jywg)OHF2~QDJ=$fSK^!3cA|9Gyv^i`lE{bCgE@<@ zKs2Z7L`g39%!D)1g1h|c3begy*n`^#_S2c7Sc<%sVW$0b3BExd(rSE#cpJ>mf+M>z12?dKq2PuA;`okg{S16 zmING5MLAktk2XXm_B7W#kzq@#p1+GjMp#e0v+CoG^!iz}UbB8S>3VX*3I4oX+py^{ z$9x=jlrj-yyPfVFfHTi$a2Yo@x2)8wWVpUeFI{niVO@)t;O~Nd6 zCtD_X8QUT{63CY`9H0;Zjz@tjk?t21_?w!MU_t2KlOvpNbcg}hGVVyX+& zcimWpjaA3Q#PvCmpQHNcxtzUhA?P;&(Cac<4`j_1N>$s33dlqEaHy%y5dbZQy#1G? z1a0xES~Pq%*0V$=Mp2GbP5U~6j#TRx=zM#%0T#md7YkAF<}d12_r>+ER}A!C5N=2_ z2e~CuYO$s>s$$pMN(iy-uBZ5TmZF@PCwW~j7X(hE?mw`lQ=obnN|_iX2M!b=7~D4r zsO#j|O=4m()!N04zq9)d-HXq`_H3n~{nu(fZCTVh3D-=MW9R3#M{^fa{tIq%tu&=G zmIz*P*|wm5yV{CCn4$5ug~DGX!YkjuXz9+KHz+#7OVLtPRL{T}KOZv^LYUBIB7IAmC za8kcC-B8$cl}R7z!C?et7&MEdJEakFv!2=^X=A5$PG{Fr3|U;1i-u$c{pz`hK{u^H zo$BaSeoLI28uerTRkF>0QLw%kaSNW!zk9yK`dOWUvrtjZdK%ZRTx_X+WAcu~sDkxl zVr!B+A=fKD8IV@JsaOM36vb=s1q=z4i?>@g0&R84No^J?rG(ah4Cobg#o%9{A$C2e`Q25e*I zYhD+g5y!)lx(pM}{$3H3q{w%1HQx4jbq)J6b?p^pxS|*?Fr$J6tI98o#`)D-7v_)XXAqVpuXbRKiRBMiY05BcMzHCgYG!X zlt#&<`=&^gqg4XBmS$8YvqwP!SyI>HN1DN$lrq|&2LKuzM*Os#_D z4Ym}ciZ;{YkbxKgq7)LGZJ=;B9ngy(PXhn&>GE2HZwlz_3~_umIVlYLD&pfeSpSLu zFV)B44#fSlENr1xozfw*)c0CHXl-_g3&8~NY62O;wg6)s>}hE_c%SNyG(kS{RmCIh z5(`tlr=n6t)cac#R&qT1qi{WfYW2=9$yDteTS+f_`in9smheY1a(uj#$BQ0Qe<-|d z<`AbES`Y62q6}b|r3)%dFJ=K2%W3B&F;FK9!7YFgA@fJOV_tkN&~B+E(}XVSSa#u_ zp#}!9t)qgql%AMs57&fA7n_o0O<2SCoPAMQ%1!lC7JE;leh)l(|GUwhxTnPZi^m30 z;V)Hh?H}6*jt+)L_Lvib;vNDmH zJfMMdEk6(;F;B|nNA<5Z=s|0P)a>mx^H-SYAC6ob+vnDS9EqeWY?4yfwlFuQtoG5wjR74x<3CdVvW*EFbWJXW zbgBU66qS&`tlBJjYSyKwb%$py{GGv(3t77{GoZM*16*oKjQk)5_tR#A$yGy_jS1e| zq)2cWdSa=XvtEH!R@xMp$(j6X)_R-#8}1k4oHd}DQLbayXD-1Rx#g>D=}bn0IQ;`{62|#Gz2EaNM z5?krLa)KSpy9eN2x;-KTA$M`V4cqeuixwf@l}wC{b>~~pCr87ga)~T0oyiRXx)+Dr zO>Yl~6WVK-ak=@K->+u%3PrHAiwO9UB{&59!_61SO%hLkdj>TIFW4{EyhHw0`}V3% z>DZ0w%gwG=Q7K3^e`j_gcC(0I{AC)jrX1xs#2WX+@gACLJgz{ddvk_jlh+l`XNa=r zhEz>0fQw~6GA+qFo5KaJefmE3`7JD2!vQPiaH`m2NB-2A-7SM%$QtVlO(4gc0PpU* zPRKdS83aoUWP~ZU%fl2=!ZT4$0f;oex%v0|dkNc&sK*n^Ic?p~j>i}M{%oh!tQ18Fj&8{(H@nDU))2Qb2?TwZxK;_(wN~Zh2#GnN-cQybb#kMH zL6o*S$nELH@3gOSP2BAIBc)|!+X0~Zm^B1TK~^- zPM^e!-!IjPub=?bdFIAZsE8}K-bQKj`I4h-cmQGTIi4AE@183rwKD?y;AGt!lhy zGxFr|N$-8356bm9Q1t>vBZI^XmPW9N+#6EhwPXJ1gFT0J5#7%oLHso$iGH`=j$|q= zJS>F9bS%R&LgYBpM_(0$jv~aAbYkLli&i~RoP>Qp>_LW|ae`o7^X1i(RDL5{FN#ss zz*Tahk2oe5w4JN@w_yP6;j?#E6Qb?Wt5n~0be0yAv;7e-oRUw>5#sHaV>x$RMM=E{ zh+sbFA{d$4olfWQ+JlDF>}djIfXgizIba)3_BVz%h98vcJdwjo)iN!W&tPyH3&r|u zN7(U2Sxeqssu$b~-X#d!Co#dju&dh0M6&NZF|aQZZlf<6EjshT#*M2NvL1C|Xg1q- zwV22>zjS8WO><&su`aEGEkT|e*JM)^@?^mb_l_H#Ypc7bEam8DZ5Wz-MPt4f!T{$% zo5>=qc59z7QV^eS{+nxj5X+`NAi3~jH5LhQh~l)SD%Su|B3aR9=+fXY#B|x(8wYp? z8<5Y0(?9U(yL^qVU`2*zyxAyPKYRi1HN1Q$XH04v+emIQ4m+)GGyFK2cdoW6K}Xfd zh{S|!G|*{c0C`}MzgRPSH^4g>v+@Ly52IMMaSu5kq>F9pQGaxFK=_&w;KhC>ZB|6k z#)@3kmks44=qmz*WVCqO61Z=pfF1-nRDZ;!0OD7{({j7ntRp)1#=kXfm(op+eg}1%l@>1P( zOHFPUPBCFKg}^bZjE$64z!#vO5x6W_-p1v(t zSGpqKx9lIq3u7fSx%M!d)2j@OHA!d-2;d7^GE_bDuWz7o%75JNJ{yl&wVD@{n84y$ zvACf@{YL?}pgITK!|07Kjp~Y}?CZKLb$WoKkNfRb&a{!l$E|7FnACLcOj-Q>(N0a+ z&JVUk1)*TSMiin&HEPaApKmQ%Ilnrt^ z>;ke-?0eet&ua*tEb9ztBG$9a2(*W<2v0*>BzINphf^P8A5G_5Uq_z2*EnkS!eHee z#~n@4a3PMKNGBFYQn`aabtxr)kAu=i=#QLWO|eqx$zWhmTt)o)R3D}bzKe6l@bYKe z-Hlz2oVJ-4WVEi0EZQw2;>*dlrfqshuR zHd_;kmXMNN^+B})_?^u@y=Ri**M-^9)rMYjf2?Lo2X#SXl?o#>p1WtVyt${2W6|om zFTgt;+goq~vKOD1n8^98a!VO)cawS#tP!xu16?|vWTUn9`6)3!86r=pfq}2=h*W(8 zL7?u(O&a_G6Op+=9iyB3UFOOsFYJDm70DETL4vT7%Is9#tRvC2!G!r)=9v!#-^1Sn zrP53=tYDm==#>!U`crjxR^M6tG9h*wNR#8bfBzrbV=!D3EH$_w$en^VX6;<-K6E;QssPUJ@C*ecrXg|ma%&wa3yq>DXT5=2Zs!w_F* z3P_=)>J{JNqzw$$R71(-1sD4G0QUk=#o^J!yR$&E%9E2(ZgeSnA=!s^D*(zF1Ul#)*C3fc>y@&LXMuB@+{Sn6*rTTWwiQFJpXg zUQZQLHS?DV0OQRguD@vL`c=U{!-lWy^&|E>lCH-IVh8RW&t`Ls*T4F1+k-ldyBH?MBf~5F_v=S8GhY1ec!g> zj|_k%-;)}=z17PEMq5WP7MuD?z{&f6w%BN6PtY970mXVkcSm+fBc@uIia}#w0mmn2 zdtCNw9@`;d{D;~);h=4eo@!+_Hs}4xl+B3uP#8?0KY`xABREqv;O0PL>saMlsg6ce zh;J6(C+Tv3+wBPkfi_}3yuh_fuY&%ZGuRK*a{Sce zi#vDPNS{I8kf>-!LThH)zUUoAOy0&B0(494?+7u1{Ps%9imu22JY9NAJ^2et!j)#jG1rpH^S-!K+p ziMG|Z=A}ovX!`o-oW2$=BX&dmnFjR8w>aFz$@7_5eH0;z7uUi(csC+NPqKT)e2|6y z2RqXt%Hvs-w*6LnhFOGeKJ3qH4_XcV zEH6&?bO6fzI=6CMbb%R_d|zJ#P`*AfMwMqRA&#nYCP!#Us<6@9r2O>0rwzt%S}&OxsMM`(s*;Cni~jb zf8dLu@TCxrz0z+Vwush8hs!em;74`(Ac51|&uo-AD8>fbNEbjwkoN6%X4330=~&Y) zEIB%lDX-$iw2aNw3L33Hf(-@cAMS{>>E-9DCcUW5ZrS~Ob!7O{;8I8fMv5;^3?F|r zkrlJ(R-%w zt}s>W=R(XS#6aZ41^R{f8kPx*-JFBS(V zVEAJ5&KA?cI^vsjoeD(JP(WiPr+9~kIr3|Y9SL-IZ)5G={!a6a{oOg={eXHdJS(bE zW&~V~C8Efrh)kd6v^UV+}qaoM6{vDUDl-N72xq#KL%)h#weT={t#b4u9!!K*uk zAmiFeZ07=?>P=}K-L>@H=kzk>P~aJ9V|K_Eqy_d)Ah34`-R63GibX&v`)xXV>g~@$ z4`I?R$!$atxsj2*bB?Fau`dp{coK>Cm)Q5H^6sb+N-1NaB#iAQCIBFRs!;VZCc2d4 zJp$RD2+$D87{NECE-GfJBG6pI8tdF^ZmW?PRV>Zh?uDLL^8#dhonUY`@=)=!#BJ;X zo{b8T^n-+koN2R@X6m9^w`|ziv|xr%zSq(xtaaQ7YQczQy7~JbwwE47k~*gd%qGB?OykJ93RqArX#N6lnDdm{ zbij)`#S``af@Ic8GZoVOoa=@!Pmx%0;vQ$;vH&5yP>}pCsbh zu!zqj?J+ncGPO1tFEl0+|0NILqcwI;(BFK>)iM=`@E}mO*YMz`2P!xHLn*uR`Wn9A z$PW8j@hq_MKv@#J?_k%Pg&T^rnz}Z?Z(Zd(neltKR!IiyBJ6PwxZ31t+vhjG>Pm5- zP&~r@nk~#{X*fALY8fGxA!e{d5IM?QnVtRFDV2y5k}CX~$&sn6f?KWylP4MbCr|Rr z8&07b8YJz=)cy6wfphxt``h_Q$3%3Xga%nzV28ud+;XRVXg4yM%-j@X3`d~@QQf`) zNv$yr{G+*jmGX9Tiz#JP7pdJtFJJOROqqi}hr%3jv?LKTk2W^$jjgtcF?%|VjQi}< zN=%)ccKOS&dyf~Lah;Hb&IINTv^gH?$x6!NFR)eSiQrb*%>On?%h z(QWH4A!2X<~wLnAgvF#9a&{2;vH!)#+( z07ipbSRY^OUi)VGep&-+G1W#WrMI)vZM=Wd-}QwMf?6G>*hTQJD3ptA z(-Sx5nw!_K*Pb8G0YSMPgW;L|Kv)`aTQeoyyTgnL>A8%EjlC=axD7lC3k+&8lzU^* zW%SJR$;A)eAJ(HWroaDTyFoF4e&t-e08cGC=i+GnnphA>iB+Q={zRH?b5zTF%;(;r zgVcTpUJUa1Cqc)O4~AXGH)YeG*(TvL6~>BXnZCG8>T!OuK|<_ z*O+Gyotk{8h1w%G2#fYDm~90b)(?&9l-a(KEb~%*2+Cu{BIGbYPV0ssaJ~)u=-`n; zim&r+j~+UDiK(yJ{EEo@&DmK6v;xrp*J-BGlG(RCk)!8=IbavIQUlzncxby{Z%}E@ z_xodCg*gG8smH`rNF=*|AB-i@VM7J~>jqv`sF^8CDP-FLI*AAN#1#e*-qA+a4H+Xu zHI?nRlxW(%?~+9u)HHR6WW$!9BR9B$_Mh!;oy{lrF(|*79FTr@WG6eRH`~~wFqLFm zY9}PnVAZ%R;eH&dW>I{^agWB`vjgwAPXW9JTPIjwl?mVpzAF&r#svU%52OVxC-^0 zriW({f_0n?`7qPw@5qYktl^DT6}$OY4OR`y;_e9s{m2m9ZQ~1NCiVWr9WE<-PLp{H z(9zJmKXyPMZ1&t;Qhh%HQZ9O{Ge|cP^f!I*n@R`v3_1ha8>RQ(wj4kDzp9l51K^4M z?aR@gYVf?{Lp>S+wW1_GM7pSHay$;%2avq(P<_JmQ#r1PX-MG#O#4t^Dp|K`O# z2q_FM*ka`cpWQT|no1r*TleR>iHp2p?s53z;T|(KT@d<&x@hF;@)7G8lAdr<->y`KdPiW?vvX2rrK>66RQEj(W1cNgt_* z1i%83Hed%p0)7aGPMfE6%pnKKl~45(^4NA<@u}>m#R0s)vlZGkwUqqiT6z^MZE0c2 z-4>t9#keOjlRSA`Y7~ILg8W5E=+Iws?4PjPeCD&TD)kb2w#5GHV^cxc6wC~ifhT~S z9(+NuFRzxUq0X4Cq$r0CvVAXSTxX{jVoy^j^0EqmesrxIy{Mc$v`15@g?=^C4OLl~ z!L+caO#t|L0p|_|3y1R}RSach={tP}rycz2QZA=Ks_15<%!Lf3Rij+~_mBz3Aq; z*YSNKipcQ(7>}P*ptOGzFkW0ZtrB0s9 zY>#Hn-h}H?FJZiLx~23fPeMh3#1nt^{ihP&lxy&BH3Ughn*_kNB>23dU&o9N07eV< ze~>Dp?_a~d{KCIpbGie8O)&*)g#-L=J)#=#+IC+BBv2mQ*lhcRHvvy1E$=wqIGhJU z>7fCV<7D&6pGEEI9=#m)%FRnBECIk0rqoRXnEL4vz*^gvX)6^h!gv*>`V-uvIf_Q# z>5u~f)W2qPtg4qi1L5Wa8b+FOUY1sSCg<><^OxBiaS1rNoL3U#x*d7YY9r<0Td(RK zk%=$LM}VMD58j#CxY=@*PtcdpP--gYafXjWw`;mQ^jItpTYx^0gurocksWHBqB--`+5O@{)v8}e-zv3rTC;J zAc4n^ztJ|MLaf<9qWH7L|D+SgFv88;kyptFR3(<u;DYqg*1i3MukGWrvRs*JzJ5{%Ql}ft>XTl!=@*oGI< zPS#R4avL7C-7xCAk<#)2u3LJw^{K~%i;a|(0#KOb>wXkpdO*NqSt=CLFF>GC(-?K@0=g+XhXMe_Z7iSb<(9?@X87mDJGr zNUcBlNPgLkw%(8!e%el)JkC_UW)k8&=EN`YveL%0Zbu6_h^079D;?T2FV8mDvCVB{ z@i&fs#uND1{a7eT(KAue?u&UN;DxT{-Oo0_0QD#s1%!T8`HI}MJZ*Y6ub@*rF*+*2 zI-0uhxW!w{t90zx^nlBR{PmljNO2N?3@dg7Zk8) z-BaHD6(KHRY9b*TcGj_Q#SVS?&aEt5MV4MUqZKMlxd75$Jx`YNj^c0kI#(UtN3hk4 zvM-UU-onhjAdi;&9^B{<-2eU63rBBFag?D){>U$T6E1LYUh}MtnH4&xnpBV6V#iDkVtqYywB@VdW6de4DeO-7wg0->SErVW(mWUBoDH6`df4T$>WSU9)XU46!yeXU& z?Pe2eL275E;Kf?<3aHt-NntI{6M5iPfUBW$_!V6FA7%k6_kUP2gZqEX0_e*)CTdgt zg=hE>N~x{dKWq$#k%vn5WrE)4b8C0Fa(e*~DO#24l$8716!7)wM_^i=5*_127mw6Fs? zn)Cn}S_Y_`7N`=f>ia4h0AaBz`xf>+(Aj`(6Cl!r60aiz1EqycZX|x;6a&m%7!Ru2 zWSjCXube+XRsS9siAyi+segUgKyKhRMT$t!gn=Z>ZsP%#+?4xz*m&+hUgYKFE}Ru&-7C_YR!s(tzE@eL1JE=C$S~)4UtLSq!tZMb>>_8S4>5}54>B22;lOPVS=!77%BCPlnF1RNmRM10y+eHR3N7SL}fr= zIlw7=3N4H4fe9)%{m#GP{8#$hM%C;C<=XEn0mi>xtt2khVH)qNFP2rbJ44hv$ zKD7hpzK4(4r>o*WX>h$A{90Y;+3nGH9$5nI#3nTp_Y2s>>phx#L<0q$Te$qG4I*m-)DOFD}fWC`Y-0w0{)9 z4nSUa`EP@MD2#pe@L~;NIQr)vgck7-IJ$G`!nvs}@#s9!d)`W;K57ZX4ZLq4??@yu z(|zZ2o~bS7K>QOl+IfD?FA-txfq=nMC!~MSg1iNH4{B$lP-{4#4qi3o{YMWjFO|+Z zNs7@45;=b`Y!VT9MQ9Vse`J*yTR4u-zD1jDdd#!-A^q3_5JXc1(e0bh_s_*SL|`;@ zm-!^}$A+Ha__z?C{cnyr>T2mU^m^GxLu~Z9qeKA%^v@kpZ^qpT<$Y2A8qr(KK~}17 zAQWczcn6j}*~CPuWtk#GXL6+ztSqlnj&hZc1s_~Y7mRBJ@2P&fW=!MTUPM6~=pQ8j9D2ky1M`%jSakd zQvxy;+m;9+J5v#a;0p$fS{p%Dvz(?nI(F@J3wNfH(cy;=K_d>}Hz|uAn{SAJm~flq zE^g?AR(Ck&3;vp9AO`*Bwpf6pb>wnq+g=sHfAn;8rf>ucqJ_y6-sVTgfl7&AqpuMH z(lSl(13N$OpYJ8z7l0AZ3TMVb)#Mp)TaCm$*`+)|iOWEe3_Vj3tjv=@nncv4wE0(t zfY%0GN6<1;sM9VUe53{RIZ0E#Qq}jg>{GOmC&$*z<-q+gaNvHJ`CGleQd0jF%TYu= z+C(9M>wSQ$F&<+P5*6YCmxBq*kh`AcZAWbsl2fTor&hgC4ZP{BR4WkUX!-He{e(7~ zX5^5Zbrt#MP0yyl{6;b$dbTh`5QcztI3Z*bZyGQN4!m;_2H++zHyey4_xkGk)fJ(w zR`;Oifhe?sU;4|6h*2G`6$B<;xS?-p1w>$T;qy(-A7nqI0PDhF6c#C(G z8^aUYO+TjI>I|JtEWHF+Kee(i+NV{lB;VzfYp7BK0)_=ni0XUHrhR~2d0`yZAWn4l zpdK47FHHZh_TDq9sV!<7B?-M3rB@MAkrE{I5>OG5cH{^MF(9BIA%G$hT1Wr|6$A^? zn;b->1eM-}5j4g0&oc6zL^A-0tb+H*!E1h;-(#a1uKE-J zWlp7u-+exFIRWgN(Q%P~@X=ou&A??A13`Z7?FF^L*AioWymE2fj#Re+Xleu~;+p9D zQt~(I3Z?<@yr|$|F@Wx^ZQ@bQ9D1>3BnTkSeFNNbDq5E{h=D|nmi=@W+er5r3em2v z{?^O&kYqol7TmSec$FM0IGQr7pJGatF(ERwXiFkNtpB8ozL!jT)1!wEfP!-2tFl1* z`H<^VOgg&l?kfQpyyMYdtBpUzU4_vNB62fIKpP+%{udsT`?J^cL)t=5p8>^Ae7$Yr z5!2e6ioKmpR7EV}0c7PoL>Pfat+#6vDjdVMJV8TuL&oDnNm=SitNWjtUaoJ~e#v{Y z`|csSEf+uZJ_VZgUd;z8kZvE)K8!1oSCHWKj*bCZJ^}w)xE#GF$LL9%_smrkN)n4T zlY!T;0R2OM*o4N`!_fQQIz=2LYk8pKX-5F)#Z{pD{s#JWvNh?cOmeaepmVNIutZ3o zno#Fl39pAq@N=)cw3*>Wb8D%LfjRq_$oXhC!aX70={@z80l0s+^t&TR#0;&vQ}Ze- z=i;~MPDinzNbD6q3)yE|C(?_a+kooa+OAw=Ir>u!UDu=RsTeK%b#1nUPJFG&vBs6w zJfMIHsR2Ya?c=;WpHqn;>ybKH>H%Obdo3Gk0JX7=t(%d587T%a%O zL^pUH-StAZZp*V6lw|Msm|S?OIG3=Ks=o#Fuq*A|_i~&uwv6BBcKiuDpV_pV+o3-YpYa(Q~YL1y7;dnb-p>Fbve9;54$;Yv-z4h=a8VA0^A<*IfzrwRboRyfS{IWr;a!%o-)d><+f)KNDgn7+?9P}ku1g6J#YEAu7Rbmz0&8SjJ506iZRs64 zCu6pI140QLb7U~(Owh>)xP>zPPNLsHc9KF8 z+|Ib97EW(bBFB6geoJ$?^d~}-2`wvszmtA!)|#Cb93$eUz{yAp#uxsihv4DjoK`~r zs~^~{e~sCZpPwO+XP9WzNYXT^k)aWvjwYBuQWMWW&nh#mS?B{aVKkqILs1LTY-is| zv(p^*GOSI53TFP;r%6^9M}V-3pkd4nU2wBeLW&ixNb@#-jaV1L#a}5$ z3IiLd#wpO^UMH=cB?!L8+9McG%P1O76WLpPv3Jc?89R_bIZz409*y+s#Ld>sJ5_UW zBp>Tf%vNR0Rzs(E-9tjF$2F(lra+vM0Sl<*{=9$(rYlR6L5^%^?sH^wY-heDth%cE z0Yi^C7FIpHpn52*>Vr9#49OI8I30Q6wNp)N`tvn|Q<~4`k~R%a?GH)#^hHrr(}?Lo z4SkLIZ+BAE+{sbz8*YywYV!U_^=)q$L&BIFu%fSYBw1+X_AgBza$F%Qpd#J}Y zS79{MmT9jt$EoF%zj9ffH(9kh{b~1nF!Q&(!6Dg;c)#_b+|yHf=L~{qBes?v<7$ z+u)BJ#Fq{gLj{)h>YVL0&CASyrT(jK9P6GvM|+?kN;w7*ww8yD`1$Owqu+GMXO9=^LM0iHpqh z{QV|=Ta}4PaW~bPLQw>{R>Ubg*PphDR>@r`1}o>bzoN?pNMAYb{OAuP&RFQ|q?;W;PqUEY6+Wbv-V_FECUldB|6OrrF$BP)-LXLB;MQnC zymPnVakWJs()WiSx!Nx5?e#tWeS)*Ld=snKwE{3Uu>*+W{&DfbfJ}XSL(PdIDm-kb z|6bL%QidzyoQz9gi&z4S$038M3g(FNXm7bvBoWJ_`awY@Z$CNf?xInL)>*-cX|das z&2gRD?DbTjN|10yAq3l5ad3rBdwk_sIjnOpzK)sf1xhx5!f=0MD@9(6{Pl-b?4W*= zaM82iT&7Yg>?$$%J*c3B1{uMib>{MY!RzC*FKGBlcSk93Nvk_may9kB>t=uC;C9>t z$B?`3f!swfk}|LZd_g`U7zkaoXcYDUM4_+Yb9z=X2emxb3ye01@K7F&#PlrCEhfhnl8o$p3zM6MT)0y&jJr} z(idnKnBA7?j>jvcvarjv4bu72h1l}nO&dE|An_MgE^i<9q5hC4T$c23MYo%#TuHp| zJ_c6!F)6c1jzJ4MFT7p(TA8*jJEg8@zhHUi+=aM6A*k&aEe_9FCP*1Qe`3(cPiBJ` z)v(|!RZLGv1^*sxoTboffNnHZsvA<^3PBFvw!RqCz&~V3;a74;ZSg0`MCHsP>7jcm zu+5`y+6$$w0ZgR;@Xg@roq5bE3=^xNV~@)ZnZ=B(!nSvNs8?M(ae~NB z0QCcCw(_@j4PO2Thg=^67^McgOI^oko+Wef;ab&PP`rEvO`#gJJC>W#J^adj>Pp`q zR}P(ULGn#R&=m;~nn_5?>)oyWs9*{Z7?UX`_?DaR+s#^)b;gKNIg>tf0_**GH3(uF zZ}vQbqyR-5IF~bAfeguiwVcw8Yz_Fi6mv454~)#a$DVa^D3N|+tcb?l2A3<_{>pDu zuncL>FAZ(WUeucN)#@0LcdvRkWz!+=L(oqxmh39Lv5IDa6JJsmXnuT%SX6trLe2<1 zNm>l51%M_W@ex}t7*+Chwx=!b366e9{6$K$y%*E{m@bD3`O>7p?9aB788G#f?Cc*Y z@q(2)=Jx5cUkkYz9ue#Nlry*eM%FV1L9QA)sk1=qwML9(I@x^R#(Zi9ZG1n4K%1jr z%g1U`d%LTA;^9^>6;Cm|bL0fJOGTAV!u5eKbhpWo=s~s@wqVS8nHBinQJK@rN7z{ywlrxk=gE*Yf~k;Kt--j6Ami1l{ed0@(xxSLCH?2Dn>-nyUtO zq3{>QtQ3(B9Y^nqq+qxh_tH+j-`uc``5yQp!7H z1gX5e_Ya)qr39L-1cJZWVq2EOZ*8^kf}|Vy*;ZRCQ<{c1gL)jZVfmy4h?i<{FXMwkB&E0+ot*%H;;^JN8FZ+HZ_sh4sBZiv#9Ff&JWU{>H5A- zv2AsGbx0rQn&Q=`2| zxjNDB`%%Q!cib@cYhW4sRD~cMV9UEMfv93C?-7z_4QrlL?$Rf80Pgtz4tLU#)vhPx z#y_Zs1D^Lr?rZCTiA2iuZ59pr|ouaO_FV4KiRnO+e&1wJyrS z!&pHAc{?CmxBWPU*s}d%AFsC zy@l&_Re080p6UObbs9{htIu%oz-NOeSm4zb z?l!(J&*`?#%(h9Ktz_^`0VVaew0~a4z&pErk1PD=1Kz~n7!@4Z*eE0;n8GhpxM?Pz z_1anC0o<|#8VgBBPR_vu755I61i_jpY*lF$ZT-*XK;04Pi8D`oIZVszRX9{8k$Q@> zDAoYm1oqF$f+z!XhpP@J9C84Wf#>3^=AdISogL)`9{_3b^)s)doi36l4^Rss107p6u?CjqNL`Kr?XRzQ2?L_Yaov z1fA;Ey1+fIxXw(ciVghSRG*-QdUmV{dx0#!2%*kdtV2g*b@eX|?5b*@wVVTERN|cEvFxvoiQs z`A9SPg$I6{mE{RG84`O81hJgr;W$vvb34@`>73{Jfzo1$)0UTp86W+kSG+EJVa8_@ ztU{;@^%^Hw(yK31&BYJf*AYP~yv~4hU~^-=Kiy+~{PKny^PZQlgI84u(XXI=C!T^H zIs9I^imbHEyhCYxIk-zaqRCLhsqOpE-)Y=@k0)$(F*8sBpeiPP$jXGL+h|Q*g;TNY z+dL{)CX~_;FSs4Lp3-#WA^&uZ`UU8U__;=^>mEo0QV$qx0zr@>sUVuda|J!fhH(CV%H^#23n zF*Y3VPp;E*G2ksdyFIulJ|h9cj}J~1B?Wd2sTHCo-!C=0@H5TP>AGv5p5}Z|u=^;% z+>Z-iKASICm!(PsyRE)njHu%eddc?iJn7}u#_LPOR{Xy%NFpET)EMS92#3=0mnk$a zKM^Wl-6tYNv|9XAwEYF@lENPoYs;Ib>7Wp_dc&{*y;`5(RBRiH=lt|Pz7GDC^NN6i zAV0fXR?{bt{g1u3BkL%6pq+4Z?!g{?Ba(tDrjO$c5!LtITESR10qYQA31+JY@U4n_K9aw zevr6tnN@s3u~7~N|N3>!Ns!Dj1IFDI1#2!NBstBOSV*ePmM8c}eV@I97)!JX-j4nS z2N%wIIoF~>6Z0*$#C?$m5R+dnoa6%{bmv+xr+%zyW9~qS{!|>@isRS98I<;0zc=tH z!!rdWAXLg3-U4IYEWCr+?E~<@ux`Si|8pD+KJ~UYrO0^(Znh z%Wr4?0cBLDda>%T)4gneRV-h^r!c56kLlU935NBC3kA9cBk`eqKZa7}Jq;?&r~bKm zD_!Er{5>v6Jo#<#IY@j3>5>>K0$EmvkARc*i;1XjT2n$Hj^p$Tedy27 z>A(ll8Z0GDqBq72Ts{ zYR8erp7cs|iS`cU-N5lL^Q=dQw#{cY+jWwcXX8058FqBFZgJJ|>wl0WrP)jJC;~ou znZ>XjC6yYtyKQ&+sRqr_3WJPzevJH`XP}?)oxzcjWvlmRE>h9lfQ_Z?Z;N%7leG{$ zLA#8ay>^f719TeC7#qyg{L3?Sw{fP`vIn}QKJ=SCBsZ1V&g$w_?2d%H_5p{C#HU(V z8aW=NCu^y9mH4%uR{A&5S>H;UM z!*S<4qts1HmJmhylPJM1;^0^1e4Xupu6<`uPr#|#5VdyG$!D-yw_%$P+~%}YNvS2p zn zJf=8MCh1mQ`W5*+-)0^RnGRTBYk_hpC)Irm-5>bNNNnlXX~JAC1OA(l-Aj-Jy{k-^ z@A0FN>?;)ol?dddV3GdBOgCXvB?6Jumf=w7UwvWt@ZsZ`g95j=M@aY0%a|pwz#N3sxgs9rPtgsaQ<%dKUdrj((Aao^JYqE+At6 zUYSG$S$efI1kU!ZxfTC7c1}1jXMfZAa-`zr)Zn5eb_4knlmUP`s}mlU`cQdKFGN4& z3d@_^lLliva(G?^k(gL%#|(rlsY{aPQCs%YIFiE_Bf2HNceWMvr)@S?Z7c7RJ18@={K8W=!`4}4kvU{jx{30+LZlxKJ98qD4zX=0&zEm zNd>@y-#&BiFHOeM%5X z<9+bD2RQOrgU#%C^OqcsN@55{!J3OZ ztstsG1sPdbivGO3*!})I;Zn2V#~($>GJNuB_k`4u-)4*C2^y4Lj04yYce1+QBYowB zu!(t6mG%jbfOcso?VZq@-QLGXRr>>=$&!0Oqb{UuJw~iNrs@n%%WS2#x`$>zvdQ7d zU9t1!6o5n`3hYVG0$xI|q`=V(r}udlC)gU<7QXk-juKUwPFvQ!#m#Jt*v&7#dY~@7 zRb~PyF!+U z`6lA6Eu_{jLTxj1qVKlH(i(vrG{kx5CVRK!bWJM)XL@ z`@Wa0q@)9C2EZTRR50Amp6%HO`01V7rRM9q#O=%?nYFRz8umNDCAQp`V$6<_{|TU? z*4MEc33NdeQ-!P=`4d-Ka2}qt;XQsLg>$C087HIoTWZYSK68H4N}X;7e4R@!cY&4Y zG%O~qOI#!zY*>br30EVp*j^qQxhmV`>~JA0Z9<{K2mA3?Bg> z-ndJ#58#e#3Q|@@_3R!|SCb*y@Mt??yOV68B)TKd=+vJEw6n;P>A?R&eQhh_Es8^M^vY zex3uS3~3yFA>cH1H==mX$y=}pETV;=b}JPlRigOmhr2|K2m|S5oDjolZRwZM}smbSI0rcjx$pcy#ZNN_libV6FFALb9Y{zOG4m<&+PO= z=XGCNMa%p9zJB1o#S*M7sR?bO;3U*D(6u$jp9I<5cl_D^x9t&Z2|xV>DHp0nzqzJk z`$(nrf}NgV=CK+Yu2Q{MrLhOZsj$cS5_XFJDUN4Q;VEWy77E4KI$LS-tLMA`hpspWhMB%uxN8|bQE2)bTXYcxpUmR zIMAzF<6s);9c*!_Tv@zAnl<3CIriGQmHuZxrrX-I&Vuo9JHGr=B`k2qJ9-$+$e7}f zuvGNXI!v6OEsph4xRWJ)Ncp&%Ti{;qi9xa<5dZ)61V7VHc5$j@TRap8s&%A6X=^Bm zBX^@fASs^pNtjn@^uL>X;vpSX?X`PlR4fDO1F75BU8QTgdd!#vqn5;*B)t09KdBeN zTk7tJ=?J`v87x_#KiyQHof3W@vtH_j1bp;gnLWEk56hZ%#vNOo5I!_P-y@ohksu<& zbuh|7z$%_mR6&~a$)p1Ar6u4QNKFSGaoWnumwcl?ok?u)UxEpu1d-JrOggit{-TK!d z58tOTxuP2;(V{BlM7D>+=kL>x9Qf(>j-5)c^_+GK(lTSG-;|8&pA&0bD|jLZsY6v9 z?xC@j_7!SxXbATKVg4se*&G0>!>sM;dhbV!q$h9}fbN_ups$kFJf2mmIxN;fD%^$t z)BoBAj{=$z)~%_EX|)yb)OKCO)}pR|K>&HLsy zC+2QI^y*QjSmGDF3wgaQ&8y-A`5#22L_}VbKYxE5yWJRvN>?a4~E4U zF#<-ojBbeiOREb4p8XzwAghbT=BCubYKrzh{%7W=RT@Q&^8}r9Dvkd_(v5D(UIbqlbF9_um zO8nt--7%46&9>SrqQ?>-G?;a|cDCT51bL#@JH_3?Osl0p^bi?w=%5!5nc96jp2VYl zQuRBAaey`FR>4cu*UwvkfnmjT>I6+le|C4*Bp7iOUwW3HBfVL=!#!78Q4#uXgkuRL z39W7um#mY|*0WmoRxL3J>2*|yl(yBHrw)7d+uQ10`C*%kUK?~8C0A>&CLc$@!?l~M zu}xkd12>wb6Z+Xrz6N0G$dg&4Z!(7sTVflBAE5PK1B@0et|zhPqO^H@gkL?*BZ)Q`nnPCh6<)d9QETd4=@ewUW3K4KerG$dq=~G(A3eYpM0n zg)RI2*T~MDml{~CkcGOVdazie4f9=QRD48)pNz!xXt2Fhm{}il6LBw_9#w<0EH*7r zqS1#dm$7|W0CRz$8WC*EXqC?D`RHL6tqo*E;tRSXRg2YL^E+aV}%vSXXL+UpG zP!2h?T+F)jft%J=v}$-=;`=|H_Dg+J-*(QdmEn3SU|odrZLPJ3a5?!0Y&Mc>8*_sz z3Ho^^q@K^i&c3X$x@yOoc+5Uw9uIVO2qJ4+5OEDT+7(rAm zkN99hhf$RSliHZ^_sOI5|!rAE$HvL~T_#Wko|Pj_JKr~^3OrrB$Zs>H3BHZnrZ zoPXwfo#H$t?3>v4wh8h$Ja3Tv_Mv*-BHdW5#aa<+oG*e{<@>K&HFl$-Uzs+RMNP}e z&B#p%>}~{jt3Y)|ezCbnD{GEg4p-+)1_uy-ingoXRO9M;AbYy3gGZ80L%-7j1+w9| zAkYggU6%VH=9A(=`FwB0HxE$}5|5t4oJ$!wB2G!>OH-50LnG%(;?8_ACMK_tO^!<$ z8V&PpeN9j2wDd8uPVy@1lLnx1mo7d0_-5!eRCc0L9yccDo}g$l`xkQXek$*jQU$aW zJv%9Qy(n!8u(bETuqgmf(fbJS3_++l`K9F(iBP8YawUm7R4Q1UE#NeW;AOXwoO(2R zqQb|Kovn2qP2FjRkJKzv=92p|D%qFAD>wQ2s->KqRoUOZQ_65&jh`4qBZQiOuS^Pp zDBkNtS6LU*Tfx=BMaq?hhcKiZCEn}*%fA3b zVf!(&Nt|A8maEX94+^kEK67iPbv=;Rky5}l7r%_?pPee>~}3!!z;A zy{Ih3d`B}nnjFTzbJg*{+x^3oyzwo6A}A;m^0jfQ)|Nhj<7JWISHpKdkTn3uneUY$ z2boSgQH&?my2(wcy!q?rTC^9@K3yY}B8gIjwhFQtU+O?=0zK<&ogsa1tfZKap@cY= z_^Cn*?6dX*UbxJm;2aeDls> z$TQ-F+lSyy?GdWmF^#k|7LLL&m6pH^uD{7vqJB)oK&b1~!)l{Tv>#cdfp8VkrjrHUQ5Ofr;pWWCopPoUM9e zr_0x~1XdLD1RAJ8ikP1RzWWG0xDhR~if$k|P;96XHGEGfciWV7A8MH@L46#6+%#ED z-e6{|j`cklTh~wZ1}WmvKyM3BPtx?S?F7(kt^Sd;x5-Xs@%s0V6z#HNuKB`O&|viB z1mO1VYMXfcHXIdfg$|aaj^f;Muy%UD6vKS3xoBX{_O#Jmx5|S5%wbzeIPQ+-K{32K zunz#VDBzld{fuqsQN`pjJ+O@cg0g>`p=WKSTf9=80)2pbbYMVB6&I=S4~0+!f)W#J zqSMh=@;j3JmT(fgeFK>L&85SnYoS{r*8r~Mc4>1s&ki7f*=rXy{dQ5FZNMNQ0)ZTx zo1LcRnYLQXqDQ1V-uvw%LU<(0ORnijNuIcm#a;o({yFHshV(RwAtz`|ZGk|ibu{&N zDF79hCumeqK=R|WV7@pr7r&<87GOB-uHYo8Jz@0!UBvGK&{eCq^;Zo)RXYB$)29}h zp%Ms&IzvVkDb1bs;O)VX@N1ZC?s-)5C(j7|{_yZ~|9J-ug8~?B;p8yfBD~}x`(TKj zL5YT2v`s-H=KxMo04n(%C|CL0ExNK(29c4_ZvSVdSxFlVs_NKDp3-ZId=9Tz_X& z^5{Op9fbLUE}2F(SNdRL@DlNO5*x{oVt(xDg7SZy67fnm`wK{WbONybns%l8jzWfO znuTgKpRCVGfRMA5z_MNrW&e$;+9WoQ1?~@;HRX;ytD?{nW0@Aw){6Dh z&(n)P8nY6yi^{g%^|!;qRk-KA(f~6C^J`J`!*j467Y>;b5cYFzyDf40*n@SAoG==Z zGCtveTmLHLpZ+}Gy8@s@BT&lCEfjV#gwvkoRcLDs&Q9Oe!1fI^AZe#lh%{2#D?4gh z<=bO-q5ZnR(E5I}!_=ua+`a19S?PNFbi;d%;=%S`-vj0foBiDz!-*KL za~HCE9t}URGi(iujpnKi847>R^?5f0LxyV z62pN7?}dE@Se@~X z9=@iE`uGcu*wDnsJmhOlp4))WSRNQKez>Ni^Jx5-@?xdi()2A?R~U@0#|Ks9qr|L1cnSO2O?Ivb7Uq8zxiEK=!zef+G}TQRvlH6f zYX1$0TF-qEGNS};>T#Ql={!Jz@z-gn`(a)C6dHAFO95G#^Z(Iu5Oi{ZQi9x{=Q?Co7RdF zihu1_V`)-akM>DARX=i)1%;xNpIGPIg)6Asb|B+x=ls4XAcHQ(%%u)A|6WDy1DFJ3mhz&XSXG=>a`X_8-|v>X+S$F%0L zoa9%5r@u5S@Wyg3*y-7Z8_&%Tn!W+L8tlmun0+W@0M|vpt5~uv6}gH+p=rd&1=rAD z21np*{h7DGXL-Og#c1xwc(OaGFRI^^-;CeP&X)RmH|SmM zRpW%ngJ33+@ybD=E>jMPlYcEMDT>+2Lh336xd%sj*3}px%m^BQG3~saoq-&prn7_I z04_hGi3EYy6rRJtJnd$AYLub|p`DtW7y*cLZ>vPx+5Ahtp1^S_DT(cdF6vZ*a-Fr| z*CF5HOxf?i@z+^_J6)oeiR(NZ*Ce(vtSvZckwMl1QBK+lZ1{GNCoAIvce!Wt!*DwW z>Q48%NRok$=Sk)d>UCGd2>v?-39+WuhdGYga2d##rir-g#>O2urA^H-VSEic_4>U) zk~oPLj@ClOl+IOm63#mRYeRO4))Hf z^e=5^$S2{CP8fPl8(p$1zDtIAQeQy5k1kOK2&HdC*L$ONSD)4CNG754h_xjN|K3vxd|KH{b;7!r^z5{_tX{OG;ocUEEUi1Teo~~!14}>zWdH!x!>-uV#Y*YrR7otBo)CMstf>LOcv#ZiITbge*GNFiH@i2BMCzNmcF2pT{)^h60!fYzjJwIH_-pmHi)b9(BO3qKm#<5C+?bEWK)-@K*W0cFi^mUo8JN`NYKqALrtseXVG z`O9}EP$A8RFg_M86lYFYy@Ra zE2dwsu!mRd;Xyy$vFyYImL(mcfcM^d98?^d{Nk=Qj`u(UjxJa`Xx-ka)qfzhU)$$d`m+K+Bv|vjv>bck} zL0m0}mBR&p2hC$3F;bck-h4$-6sypgM% ztdIhq_(ZikMs$TZ6U;z&H1RcFPpB(~!qSB6Fkt*5Ga$zWcz%|I@F(B=93c3bo1wt( zhjoP_o>~eq(&q61NBzI%%m2oDlbOs|Ifhiu27dBpGE}1h{$0Cbayd`WF6jROXbN;j diff --git a/launcherIconResize.py b/launcherIconResize.py new file mode 100644 index 0000000..0dc8b1a --- /dev/null +++ b/launcherIconResize.py @@ -0,0 +1,70 @@ +#################################################################################### +# +# Distributed under MIT Licence +# See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +# +#################################################################################### +# +# GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +# tested on a Venu 2 device. The source code is provided at: +# https://github.com/house-of-abbey/GarminHomeAssistant. +# +# J D Abbey & P A Abbey, 29 December 2023 +# +# +# Description: +# +# Python script to automatically resize the application launcher icon from the +# original 70x70 pixel width to something more appropriate for different screen +# sizes. +# +# Python installation: +# pip install BeautifulSoup +# NB. For XML formatting: +# pip install lxml +# +# References: +# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/ +# * https://realpython.com/beautiful-soup-web-scraper-python/ +# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/#parsing-xml +# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/#xml +# +#################################################################################### + +from bs4 import BeautifulSoup, Comment +import os +import shutil + +output_dir_prefix = 'resources-launcher-' +# Original icons for 416x416 screen size with 70x70 icons +input_dir = output_dir_prefix + '70-70' + +# Convert icons to different screen sizes by these parameters +lookup = [26, 30, 33, 35, 36, 40, 54, 60, 61, 62, 65, 80] + +# Delete all but the original 48x48 icon directories +for entry in os.listdir("."): + if entry.startswith(output_dir_prefix) and entry != input_dir: + shutil.rmtree(entry) + +# (Re-)Create the resized icon directories +for icon_size in lookup: + output_dir = output_dir_prefix + str(icon_size) + "-" + str(icon_size) + print("\nCreate directory:", output_dir) + if os.path.exists(output_dir) and os.path.isdir(output_dir): + shutil.rmtree(output_dir) + os.makedirs(output_dir) + for entry in os.listdir(input_dir): + if entry.endswith(".svg"): + print("Create file: ", entry.ljust(40) + " SVG - Change file") + with open(input_dir + "/" + entry, "r") as f: + soup = BeautifulSoup(f.read(), features="xml") + svg: BeautifulSoup = list(soup.children)[0] + h = int(svg.attrs["height"]) + svg.attrs["width"] = icon_size + svg.attrs["height"] = icon_size + with open(output_dir + "/" + entry, "wb") as o: + o.write(svg.encode("utf-8")) + elif entry.endswith(".xml"): + print("Create file: ", entry.ljust(40) + " XML - Copy file") + shutil.copyfile(input_dir + "/" + entry, output_dir + "/" + entry) diff --git a/manifest-widget.xml b/manifest-widget.xml index 6fdc41b..227f805 100644 --- a/manifest-widget.xml +++ b/manifest-widget.xml @@ -17,7 +17,7 @@ Someone0nEarth's Test Widget id="bf69be91-5833-4d96-92ea-c5f1a9db5dcc" type="widget" philipabbey's Test Widget id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" - Live Widget id="" type="widget" + Live Widget id="585af26f-6ff7-44e8-80dc-b3670e5b8648" type="widget" --> @@ -140,8 +140,9 @@ palette to update permissions. --> - + + - + + + يختار... مفتاح API لـ HomeAssistant. رمز الوصول طويل الأمد. عنوان URL لواجهة برمجة تطبيقات HomeAssistant. عنوان URL لتكوين القائمة (JSON). المهلة بالثواني. قم بالخروج من التطبيق بعد هذه الفترة من عدم النشاط لحفظ بطارية الجهاز. بعد هذا الوقت (بالثواني)، يتم إغلاق مربع حوار تأكيد الإجراء تلقائيًا ويتم إلغاء الإجراء. اضبط على 0 لتعطيل المهلة. - تمثيل الأنواع بأيقونات (إيقاف) أو بالتسميات (تشغيل). + نمط عنصر القائمة. + أيقونات + نص إضافي محاذاة القائمة لليسار (إيقاف) أو لليمين (تشغيل). + من اليسار إلى اليمين + من اليمين الى اليسار (القطعة فقط) قم بتشغيل التطبيق تلقائيًا من الأداة دون انتظار نقرة واحدة. + قم بتمكين خدمة الخلفية لإرسال مستوى بطارية الساعة إلى Home Assistant. + معدل التحديث (بالدقائق) الذي يجب أن تكرر عنده خدمة الخلفية إرسال مستوى البطارية. \ No newline at end of file diff --git a/resources-bul/strings/strings.xml b/resources-bul/strings/strings.xml index 7c70a3c..e7b5dd3 100644 --- a/resources-bul/strings/strings.xml +++ b/resources-bul/strings/strings.xml @@ -43,13 +43,20 @@ Неконфигуриран Меню + Изберете... API ключ за HomeAssistant. Токен за дълготраен достъп. URL адрес за API на HomeAssistant. URL за конфигурация на менюто (JSON). Изчакване в секунди. Излезте от приложението след този период на неактивност, за да запазите батерията на устройството. След това време (в секунди) диалоговият прозорец за потвърждение за действие се затваря автоматично и действието се отменя. Задайте 0, за да деактивирате изчакването. - Представяне на типове с икони (изключено) или с етикети (включено). + Стил на елемент от менюто. + Икони + Допълнителен текст Ляво (изключено) или дясно (включено) подравняване на менюто. + Отляво надясно + От дясно на ляво (Само за джаджа) Автоматично стартирайте приложението от джаджата, без да чакате докосване. + Активирайте фоновата услуга, за да изпратите нивото на батерията на часовника до Home Assistant. + Честотата на опресняване (в минути), с която фоновата услуга трябва да повтори изпращането на нивото на батерията. \ No newline at end of file diff --git a/resources-ces/strings/strings.xml b/resources-ces/strings/strings.xml index 80217d0..9c571e0 100644 --- a/resources-ces/strings/strings.xml +++ b/resources-ces/strings/strings.xml @@ -43,13 +43,20 @@ Nenakonfigurováno Jídelní lístek + Vybrat... Klíč API pro HomeAssistant. Přístupový token s dlouhou životností. URL pro HomeAssistant API. Adresa URL pro konfiguraci nabídky (JSON). Časový limit v sekundách. Po této době nečinnosti aplikaci ukončete, abyste šetřili baterii zařízení. Po uplynutí této doby (v sekundách) se dialog pro potvrzení akce automaticky zavře a akce se zruší. Nastavením na 0 deaktivujete časový limit. - Znázornění typů pomocí ikon (vypnuto) nebo pomocí štítků (zapnuto). + Styl položky menu. + ikony + Doplňkový text Zarovnání nabídky vlevo (vypnuto) nebo vpravo (zapnuto). + Zleva do prava + Zprava doleva (Pouze widget) Automaticky spusťte aplikaci z widgetu bez čekání na klepnutí. + Povolte službu na pozadí, aby odeslala stav baterie hodin do Home Assistant. + Obnovovací frekvence (v minutách), při které by služba na pozadí měla opakovat odesílání úrovně baterie. \ No newline at end of file diff --git a/resources-dan/strings/strings.xml b/resources-dan/strings/strings.xml index 0eb465d..fbf8946 100644 --- a/resources-dan/strings/strings.xml +++ b/resources-dan/strings/strings.xml @@ -43,13 +43,20 @@ Ukonfigureret Menu + Vælg... API-nøgle til HomeAssistant. Adgangstoken med lang levetid. URL til HomeAssistant API. URL til menukonfiguration (JSON). Timeout i sekunder. Afslut applikationen efter denne periode med inaktivitet for at spare på enhedens batteri. Efter dette tidspunkt (i sekunder) lukkes en bekræftelsesdialog for en handling automatisk, og handlingen annulleres. Indstil til 0 for at deaktivere timeout. - Repræsenterer typer med ikoner (fra) eller med etiketter (til). + Menupunkt stil. + Ikoner + Yderligere tekst Venstre (fra) eller Højre (til) menujustering. + Venstre til højre + Højre til venstre (Kun widget) Start automatisk applikationen fra widgetten uden at vente på et tryk. + Aktiver baggrundstjenesten for at sende urets batteriniveau til Home Assistant. + Opdateringshastigheden (i minutter), hvormed baggrundstjenesten skal gentage afsendelsen af ​​batteriniveauet. \ No newline at end of file diff --git a/resources-deu/strings/strings.xml b/resources-deu/strings/strings.xml index 057d090..25780bf 100644 --- a/resources-deu/strings/strings.xml +++ b/resources-deu/strings/strings.xml @@ -23,7 +23,7 @@ An Aus Antippen - Menü + Menü Sicher? Keine Telefonverbindung Keine Internetverbindung @@ -35,7 +35,7 @@ URL nicht gefunden. Möglicher API-URL-Fehler in den Einstellungen. URL nicht gefunden. Möglicher Konfigurations-URL-Fehler in den Einstellungen. Von der HTTP-Anfrage wurde kein JSON zurückgegeben. - Die HTTP-Anfrage gab folgenden Fehlercode zurück = + Die HTTP-Anfrage gab folgenden Fehlercode zurück = Die API-URL darf keinen abschließenden Schrägstrich „/“ enthalten. Verfügbar Überprüfung... @@ -43,13 +43,20 @@ Unkonfiguriert Speisekarte + Wählen... API-Schlüssel für HomeAssistant. Langlebiges Zugriffstoken. URL für die HomeAssistant-API. URL zur Menükonfiguration (JSON). Timeout in Sekunden. Beenden Sie die Anwendung nach dieser Zeit der Inaktivität, um den Akku des Geräts zu schonen. Nach dieser Zeit (in Sekunden) wird automatisch ein Bestätigungsdialog für eine Aktion geschlossen und die Aktion abgebrochen. Auf 0 setzen, um das Timeout zu deaktivieren. - Darstellen von Typen mit Symbolen (aus) oder mit Beschriftungen (ein). + Menüelementstil. + Symbole + Zusätzlicher Text Menüausrichtung links (aus) oder rechts (ein). + Links nach rechts + Rechts nach links (Nur Widget) Starten Sie die Anwendung automatisch über das Widget, ohne auf einen Tipp warten zu müssen. + Aktivieren Sie den Hintergrunddienst, um den Batteriestand der Uhr an Home Assistant zu senden. + Die Aktualisierungsrate (in Minuten), mit der der Hintergrunddienst das Senden des Akkustands wiederholen soll. \ No newline at end of file diff --git a/resources-dut/strings/strings.xml b/resources-dut/strings/strings.xml index 20b60e1..a799e61 100644 --- a/resources-dut/strings/strings.xml +++ b/resources-dut/strings/strings.xml @@ -43,13 +43,20 @@ Niet geconfigureerd Menu + Selecteer... API-sleutel voor HomeAssistant. Toegangstoken met lange levensduur. URL voor HomeAssistant API. URL voor menuconfiguratie (JSON). Time-out in seconden. Sluit de applicatie af na deze periode van inactiviteit om de batterij van het apparaat te sparen. Na deze tijd (in seconden) wordt automatisch een bevestigingsvenster voor een actie gesloten en wordt de actie geannuleerd. Stel in op 0 om de time-out uit te schakelen. - Typen weergeven met pictogrammen (uit) of met labels (aan). + Stijl van menu-items. + Pictogrammen + Aanvullende tekst Links (uit) of rechts (aan) Menu-uitlijning. + Van links naar rechts + Rechts naar links (Alleen Widget) Start de applicatie automatisch vanuit de widget zonder te wachten op een tik. + Schakel de achtergrondservice in om het batterijniveau van de klok naar Home Assistant te sturen. + De vernieuwingsfrequentie (in minuten) waarmee de achtergrondservice het batterijniveau opnieuw moet verzenden. \ No newline at end of file diff --git a/resources-est/strings/strings.xml b/resources-est/strings/strings.xml index 7ab95cc..94938c0 100644 --- a/resources-est/strings/strings.xml +++ b/resources-est/strings/strings.xml @@ -43,13 +43,20 @@ Konfigureerimata Menüü + Vali... API-võti HomeAssistantile. Pikaealine juurdepääsuluba. HomeAssistant API URL. URL menüü konfigureerimiseks (JSON). Aegumine sekundites. Seadme aku säästmiseks sulgege rakendus pärast seda tegevusetusperioodi. Pärast seda aega (sekundites) suletakse automaatselt toimingu kinnitusdialoog ja toiming tühistatakse. Ajalõpu keelamiseks määrake väärtusele 0. - Tüüpide tähistamine ikoonidega (väljas) või siltidega (sees). + Menüüelemendi stiil. + Ikoonid + Täiendav tekst Vasak (väljas) või parem (sees) menüü joondamine. + Vasakult paremale + Paremalt vasakule (Ainult vidin) Käivitage rakendus automaatselt vidinast ilma puudutust ootamata. + Lubage taustteenus, et saata Home Assistantile kella aku tase. + Värskendussagedus (minutites), mille juures taustateenus peaks aku taseme saatmist kordama. \ No newline at end of file diff --git a/resources-fin/strings/strings.xml b/resources-fin/strings/strings.xml index fd70bc2..31239a6 100644 --- a/resources-fin/strings/strings.xml +++ b/resources-fin/strings/strings.xml @@ -43,13 +43,20 @@ Määrittämätön Valikko + Valitse... API-avain HomeAssistantille. Pitkäikäinen pääsytunnus. HomeAssistant API:n URL-osoite. URL-osoite valikon määrityksiä varten (JSON). Aikakatkaisu sekunneissa. Poistu sovelluksesta tämän käyttämättömyyden jälkeen säästääksesi laitteen akkua. - Tämän ajan kuluttua (sekunneissa) toiminnon vahvistusikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoksi 0 poistaaksesi aikakatkaisun käytöstä. - Esittää tyyppejä kuvakkeilla (pois päältä) tai tarroilla (päällä). + Tämän ajan kuluttua (sekunneissa) toiminnon vahvistusikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoksi 0, jos haluat poistaa aikakatkaisun käytöstä. + Valikkokohdan tyyli. + Kuvakkeet + Lisäteksti Vasen (pois) tai oikea (päällä) valikon kohdistus. + Vasemmalta oikealle + Oikealta vasemmalle (Vain widget) Käynnistä sovellus automaattisesti widgetistä odottamatta napautusta. + Ota taustapalvelu käyttöön lähettääksesi kellon akun varaustason Home Assistantille. + Virkistystaajuus (minuutteina), jolla taustapalvelun pitäisi toistaa akun varaustason lähettämistä. \ No newline at end of file diff --git a/resources-fre/strings/strings.xml b/resources-fre/strings/strings.xml index ab02a1f..6e8b5cf 100644 --- a/resources-fre/strings/strings.xml +++ b/resources-fre/strings/strings.xml @@ -20,7 +20,7 @@ HomeAssistant - Activé + Activé Désactivé Clic Menu @@ -31,7 +31,7 @@ Pas de clé API dans les paramètres de l'application Aucune URL API dans les paramètres de l'application Aucune URL de configuration dans les paramètres de l'application - Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil. + Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil. URL introuvable. Erreur potentielle d'URL d'API dans les paramètres. URL introuvable. Erreur potentielle d'URL de configuration dans les paramètres. Aucun JSON renvoyé par la requête HTTP. @@ -43,13 +43,20 @@ Non configuré Menu + Sélectionner... Clé API pour HomeAssistant. Jeton d'accès de longue durée. URL de l’API HomeAssistant. URL de configuration des menus (JSON). Délai d'expiration en secondes. Quittez l'application après cette période d'inactivité pour économiser la batterie de l'appareil. Passé ce délai (en secondes), une boîte de dialogue de confirmation d'une action se ferme automatiquement et l'action est annulée. Réglez sur 0 pour désactiver le délai d'attente. - Représentation des types avec des icônes (off) ou avec des étiquettes (on). + Style des éléments de menu. + Icônes + Texte supplémentaire Alignement du menu à gauche (désactivé) ou à droite (activé). + De gauche à droite + De droite à gauche (Widget uniquement) Démarrez automatiquement l'application à partir du widget sans attendre un clic. + Activez le service d'arrière-plan pour envoyer le niveau de batterie de l'horloge à Home Assistant. + Fréquence de rafraîchissement (en minutes) à laquelle le service en arrière-plan doit répéter l'envoi du niveau de la batterie. \ No newline at end of file diff --git a/resources-gre/strings/strings.xml b/resources-gre/strings/strings.xml index 7e77b57..39550d4 100644 --- a/resources-gre/strings/strings.xml +++ b/resources-gre/strings/strings.xml @@ -29,7 +29,7 @@ Δεν υπάρχει σύνδεση στο διαδίκτυο Καμία απάντηση, ελέγξτε τη σύνδεση στο Διαδίκτυο Δεν υπάρχει κλειδί API στις ρυθμίσεις της εφαρμογής - Δεν υπάρχει URL API στις ρυθμίσεις της εφαρμογής + Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις της εφαρμογής Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις της εφαρμογής Κλήσεις API πολύ γρήγορες. Παρακαλώ επιβραδύνετε τα αιτήματά σας. Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL API στις ρυθμίσεις. @@ -43,13 +43,20 @@ Μη διαμορφωμένο Μενού + Επιλέγω... Κλειδί API για το HomeAssistant. Διακριτικό πρόσβασης μακράς διαρκείας. URL για το HomeAssistant API. URL για τη διαμόρφωση μενού (JSON). Timeout σε δευτερόλεπτα. Κλείστε την εφαρμογή μετά από αυτήν την περίοδο αδράνειας για να εξοικονομήσετε την μπαταρία της συσκευής. Μετά από αυτό το χρονικό διάστημα (σε δευτερόλεπτα), ένα παράθυρο διαλόγου επιβεβαίωσης για μια ενέργεια κλείνει αυτόματα και η ενέργεια ακυρώνεται. Ορίστε στο 0 για να απενεργοποιήσετε το χρονικό όριο. - Αναπαράσταση τύπων με εικονίδια (απενεργοποίηση) ή με ετικέτες (ενεργό). + Στυλ στοιχείου μενού. + εικονίδια + Πρόσθετο Κείμενο Αριστερά (απενεργοποίηση) ή Δεξιά (ενεργό) Ευθυγράμμιση μενού. + Από αριστερά προς τα δεξιά + Δεξιά προς τα αριστερά (Μόνο widget) Αυτόματη εκκίνηση της εφαρμογής από το widget χωρίς να περιμένετε ένα πάτημα. + Ενεργοποιήστε την υπηρεσία παρασκηνίου για αποστολή της στάθμης της μπαταρίας του ρολογιού στο Home Assistant. + Ο ρυθμός ανανέωσης (σε λεπτά) με τον οποίο η υπηρεσία παρασκηνίου θα πρέπει να επαναλάβει στέλνοντας το επίπεδο της μπαταρίας. \ No newline at end of file diff --git a/resources-heb/strings/strings.xml b/resources-heb/strings/strings.xml index f3fbb14..3dcf146 100644 --- a/resources-heb/strings/strings.xml +++ b/resources-heb/strings/strings.xml @@ -43,13 +43,20 @@ לא מוגדר תַפרִיט + בחר... מפתח API עבור HomeAssistant. אסימון גישה ארוך-חיים. כתובת URL עבור HomeAssistant API. כתובת URL לתצורת תפריט (JSON). פסק זמן בשניות. צא מהאפליקציה לאחר תקופה זו של חוסר פעילות כדי לחסוך בסוללת המכשיר. - לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי לבטל את הזמן הקצוב. - ייצוג סוגים עם סמלים (כבוי) או עם תוויות (מופעל). + לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי להשבית את הזמן הקצוב. + סגנון פריט בתפריט. + אייקונים + טקסט נוסף יישור תפריט שמאלה (כבוי) או ימינה (מופעל). + משמאל לימין + מימין לשמאל (יישומון בלבד) הפעל אוטומטית את האפליקציה מהווידג'ט מבלי לחכות להקשה. + אפשר את שירות הרקע כדי לשלוח את רמת הסוללה של השעון אל Home Assistant. + קצב הרענון (בדקות) שבו שירות הרקע אמור לחזור על שליחת רמת הסוללה. \ No newline at end of file diff --git a/resources-hrv/strings/strings.xml b/resources-hrv/strings/strings.xml index 79ac32c..5b8d9db 100644 --- a/resources-hrv/strings/strings.xml +++ b/resources-hrv/strings/strings.xml @@ -43,13 +43,20 @@ Nekonfigurirano Jelovnik + Izaberi... API ključ za HomeAssistant. Dugotrajni pristupni token. URL za HomeAssistant API. URL za konfiguraciju izbornika (JSON). Istek u sekundama. Izađite iz aplikacije nakon ovog razdoblja neaktivnosti kako biste uštedjeli bateriju uređaja. Nakon tog vremena (u sekundama), dijaloški okvir za potvrdu radnje automatski se zatvara i radnja se poništava. Postavite na 0 da onemogućite vremensko ograničenje. - Predstavljanje tipova ikonama (isključeno) ili oznakama (uključeno). + Stil stavke izbornika. + Ikone + Dodatni tekst Lijevo (isključeno) ili desno (uključeno) poravnanje izbornika. + S lijeva nadesno + S desna na lijevo (Samo widget) Automatski pokrenite aplikaciju iz widgeta bez čekanja na dodir. + Omogućite pozadinsku uslugu za slanje razine baterije sata kućnom pomoćniku. + Brzina osvježavanja (u minutama) pri kojoj bi pozadinska usluga trebala ponavljati slanje razine baterije. \ No newline at end of file diff --git a/resources-hun/strings/strings.xml b/resources-hun/strings/strings.xml index 22da591..f404dd9 100644 --- a/resources-hun/strings/strings.xml +++ b/resources-hun/strings/strings.xml @@ -43,13 +43,20 @@ Nincs konfigurálva Menü + Válasszon... API-kulcs a HomeAssistant számára. Hosszú életű hozzáférési token. A HomeAssistant API URL-je. URL a menükonfigurációhoz (JSON). Időtúllépés másodpercben. Az eszköz akkumulátorának kímélése érdekében lépjen ki az alkalmazásból ezen inaktivitási időszak után. - Ezen idő letelte után (másodpercben) a művelet megerősítő párbeszédablakja automatikusan bezárul, és a művelet megszakad. Állítsa 0-ra az időtúllépés letiltásához. - A típusokat ikonokkal (kikapcsolva) vagy címkékkel (bekapcsolva) ábrázolja. + Ezen idő elteltével (másodpercben) egy művelet megerősítő párbeszédpanele automatikusan bezárul, és a művelet megszakad. Állítsa 0-ra az időtúllépés letiltásához. + Menüelem stílusa. + Ikonok + Kiegészítő szöveg Balra (ki) vagy Jobbra (be) Menüigazítás. + Balról jobbra + Jobbról balra (Csak widget) Az alkalmazás automatikus indítása a widgetről anélkül, hogy egy érintésre várna. + Engedélyezze a háttérszolgáltatást, hogy elküldje az óra töltöttségi szintjét a Home Assistantnek. + Az a frissítési gyakoriság (percben), amelynél a háttérszolgáltatásnak meg kell ismételnie az akkumulátor töltöttségi szintjének küldését. \ No newline at end of file diff --git a/resources-ind/strings/strings.xml b/resources-ind/strings/strings.xml index 0a8591d..9f6f529 100644 --- a/resources-ind/strings/strings.xml +++ b/resources-ind/strings/strings.xml @@ -30,7 +30,7 @@ Tidak Ada Respon, periksa koneksi Internet Tidak ada kunci API di pengaturan aplikasi Tidak ada URL API di pengaturan aplikasi - Tidak ada URL konfigurasi di pengaturan aplikasi + Tidak ada URL konfigurasi dalam pengaturan aplikasi Panggilan API terlalu cepat. Harap memperlambat permintaan Anda. URL tidak ditemukan. Potensi kesalahan URL API dalam pengaturan. URL tidak ditemukan. Potensi kesalahan URL Konfigurasi dalam pengaturan. @@ -43,13 +43,20 @@ Tidak dikonfigurasi Menu + Pilih... Kunci API untuk HomeAssistant. Token Akses Berumur Panjang. URL untuk API HomeAssistant. URL untuk konfigurasi menu (JSON). Batas waktu dalam hitungan detik. Keluar dari aplikasi setelah periode tidak aktif ini untuk menghemat baterai perangkat. Setelah waktu ini (dalam detik), dialog konfirmasi untuk suatu tindakan secara otomatis ditutup dan tindakan tersebut dibatalkan. Setel ke 0 untuk menonaktifkan batas waktu. - Mewakili tipe dengan ikon (mati) atau dengan label (aktif). + Gaya item menu. + Ikon + Teks Tambahan Penyelarasan Menu Kiri (mati) atau Kanan (hidup). + Kiri ke kanan + Kanan ke kiri (Khusus widget) Secara otomatis memulai aplikasi dari widget tanpa menunggu ketukan. + Aktifkan layanan latar belakang untuk mengirim level baterai jam ke Home Assistant. + Kecepatan refresh (dalam menit) saat layanan latar belakang harus mengulangi pengiriman level baterai. \ No newline at end of file diff --git a/resources-ita/strings/strings.xml b/resources-ita/strings/strings.xml index 1c02546..8fc873a 100644 --- a/resources-ita/strings/strings.xml +++ b/resources-ita/strings/strings.xml @@ -43,13 +43,20 @@ Non configurato Menù + Selezionare... Chiave API per HomeAssistant. Token di accesso di lunga durata. URL per l'API HomeAssistant. URL per la configurazione del menu (JSON). Timeout in secondi. Uscire dall'applicazione dopo questo periodo di inattività per risparmiare la batteria del dispositivo. Trascorso questo tempo (in secondi), una finestra di dialogo di conferma per un'azione viene chiusa automaticamente e l'azione viene annullata. Impostare su 0 per disabilitare il timeout. - Rappresentazione dei tipi con icone (disattivata) o con etichette (attivata). + Stile della voce di menu. + Icone + Testo aggiuntivo Allineamento del menu a sinistra (spento) o a destra (acceso). + Da sinistra a destra + Da destra a sinistra (Solo widget) Avvia automaticamente l'applicazione dal widget senza attendere un tocco. + Abilita il servizio in background per inviare il livello della batteria dell'orologio a Home Assistant. + La frequenza di aggiornamento (in minuti) alla quale il servizio in background deve ripetere l'invio del livello della batteria. \ No newline at end of file diff --git a/resources-jpn/strings/strings.xml b/resources-jpn/strings/strings.xml index da834ac..180f7e5 100644 --- a/resources-jpn/strings/strings.xml +++ b/resources-jpn/strings/strings.xml @@ -43,13 +43,20 @@ 未構成 メニュー + 選択する... ホームアシスタントの API キー。 有効期間の長いアクセス トークン。 ホームアシスタント API の URL。 メニュー構成の URL (JSON)。 秒単位のタイムアウト。デバイスのバッテリーを節約するために、この期間非アクティブになった後はアプリケーションを終了してください。 この時間 (秒単位) が経過すると、アクションの確認ダイアログが自動的に閉じられ、アクションがキャンセルされます。タイムアウトを無効にするには、0 に設定します。 - タイプをアイコン (オフ) またはラベル (オン) で表します。 + メニュー項目のスタイル。 + アイコン + 追加テキスト 左 (オフ) または右 (オン) メニューの配置。 + 左から右へ + 右から左に (ウィジェットのみ)タップを待たずにウィジェットからアプリを自動起動します。 + バックグラウンド サービスを有効にして、時計のバッテリー レベルをホーム アシスタントに送信します。 + バックグラウンド サービスがバッテリー レベルの送信を繰り返すリフレッシュ レート (分単位)。 \ No newline at end of file diff --git a/resources-kor/strings/strings.xml b/resources-kor/strings/strings.xml index e54002c..efdf8d2 100644 --- a/resources-kor/strings/strings.xml +++ b/resources-kor/strings/strings.xml @@ -43,13 +43,20 @@ 구성되지 않음 메뉴 + 선택하다... HomeAssistant용 API 키. 장기 액세스 토큰. HomeAssistant API의 URL입니다. 메뉴 구성을 위한 URL(JSON)입니다. 시간 초과(초)입니다. 장치 배터리를 절약하려면 이 비활성 기간 후에 애플리케이션을 종료하십시오. 이 시간(초)이 지나면 작업에 대한 확인 대화 상자가 자동으로 닫히고 작업이 취소됩니다. 시간 초과를 비활성화하려면 0으로 설정합니다. - 아이콘(끄기) 또는 레이블(켜기)로 유형을 나타냅니다. + 메뉴 항목 스타일. + 아이콘 + 추가 텍스트 왼쪽(끄기) 또는 오른쪽(켜기) 메뉴 정렬. - (위젯만 해당) 탭을 기다리지 않고 위젯에서 애플리케이션을 자동으로 시작합니다. + 왼쪽에서 오른쪽으로 + 오른쪽에서 왼쪽으로 + (위젯만 해당) 탭을 기다리지 않고 위젯에서 자동으로 애플리케이션을 시작합니다. + 시계 배터리 수준을 홈어시스턴트로 보내려면 백그라운드 서비스를 활성화하세요. + 백그라운드 서비스가 배터리 수준 전송을 반복해야 하는 새로 고침 빈도(분)입니다. \ No newline at end of file diff --git a/resources-launcher-26-26/drawables.xml b/resources-launcher-26-26/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-26-26/drawables.xml +++ b/resources-launcher-26-26/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-26-26/launcher.png b/resources-launcher-26-26/launcher.png deleted file mode 100644 index c82ef3a7b25ae1ad394abe8c5d528331c4ca3ad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3909 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 TqbXU+00000NkvXXu0mjfR-9Bq diff --git a/resources-launcher-26-26/launcher.svg b/resources-launcher-26-26/launcher.svg new file mode 100644 index 0000000..8d7af19 --- /dev/null +++ b/resources-launcher-26-26/launcher.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources-launcher-30-30/drawables.xml b/resources-launcher-30-30/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-30-30/drawables.xml +++ b/resources-launcher-30-30/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-30-30/launcher.png b/resources-launcher-30-30/launcher.png deleted file mode 100644 index 6ee0210f9ecc4b87c33c018d20c3454066d83df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4047 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 + + + \ No newline at end of file diff --git a/resources-launcher-33-33/drawables.xml b/resources-launcher-33-33/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-33-33/drawables.xml +++ b/resources-launcher-33-33/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-33-33/launcher.png b/resources-launcher-33-33/launcher.png deleted file mode 100644 index 8dfd7127f4565c33732573134919aa0478f7fa02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4268 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 + + + \ No newline at end of file diff --git a/resources-launcher-35-35/drawables.xml b/resources-launcher-35-35/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-35-35/drawables.xml +++ b/resources-launcher-35-35/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-35-35/launcher.png b/resources-launcher-35-35/launcher.png deleted file mode 100644 index 1d51ea41e84f771d057e365fee205c522c781891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4287 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 diff --git a/resources-launcher-35-35/launcher.svg b/resources-launcher-35-35/launcher.svg new file mode 100644 index 0000000..b8cfded --- /dev/null +++ b/resources-launcher-35-35/launcher.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources-launcher-36-36/drawables.xml b/resources-launcher-36-36/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-36-36/drawables.xml +++ b/resources-launcher-36-36/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-36-36/launcher.png b/resources-launcher-36-36/launcher.png deleted file mode 100644 index f1fbe43ca162be09e89a4a8584609f2da3b6437b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4326 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 + + + \ No newline at end of file diff --git a/resources-launcher-40-40/drawables.xml b/resources-launcher-40-40/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-40-40/drawables.xml +++ b/resources-launcher-40-40/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-40-40/launcher.png b/resources-launcher-40-40/launcher.png deleted file mode 100644 index 2bfe588cefcb68e34430d2e7b6148b2c5392e49f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4451 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 + + + \ No newline at end of file diff --git a/resources-launcher-54-54/drawables.xml b/resources-launcher-54-54/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-54-54/drawables.xml +++ b/resources-launcher-54-54/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-54-54/launcher.png b/resources-launcher-54-54/launcher.png deleted file mode 100644 index 76bfe319706b3f1b6fc14c8d0c5e6dbe9be3d18d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4942 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 + + + \ No newline at end of file diff --git a/resources-launcher-60-60/drawables.xml b/resources-launcher-60-60/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-60-60/drawables.xml +++ b/resources-launcher-60-60/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-60-60/launcher.png b/resources-launcher-60-60/launcher.png deleted file mode 100644 index 3a2d836aa25fe517c96970d1b5a5d7fe9801661c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5189 zcmV-L6uRq)P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000SaNklA7tO2^mc1zUvI1z0(*t7$W0`W5)@K#`X?`Vfs;D={2;QIyEo*dWG06cKI zNh=1pJ&=k5DJV?7hdrwW)|^^_p<<4uPm}4i@*QgwLEMht~0a(UA zQiC56xT7>8L3=(|S z*#fr$PxNK#_4YzxArKTJ8-P^;EhPaMLq6j(YWf0}-Ty4pmux|M8e@Vm&`rSOgNd|` zJna^N2gAUMC?+ph&WvUE;B|H|_J(FAEm(~NU;;4L&6}w{_Y*w7y&YpTmSvX$y+Oexz?aKJT>k;*^E^*x8;x$9!J1VZCc0FrVUi5 zQ&c1qJ)RqPU23Y*Ol#UeL;E8bU6#n&fhPw|rzK(tbij2>HZf`b8md!C5^*@wR5?)`RfE;P!9BbU}so=J|N?vh#_}aQ$KeZSI=EZMa;oA|iM>&BU8q8GS<&$(T(=GWkD6OFSOO*P78^ zTm%??`p{}3vCxurBd`n9%Ca676)CZzIHq$O$l_4XW_{}CF6Y|Y?k1f~P&NfGiK!l&6Tu>44&H)Rxt#Oy zW>BWP6Ri_B*u;W;>&k)6XMF1CuAshg4Kc^+H?T)6olcX8T1>dPjp<7_V|-n5v=nS2 z=D^~(e)q}a!`nJG2b6MyJsV=d-mN9U8iSwr88@qu`nju#MJ#Hns|G~&OjlMCwPC_7 zZA@9b9xq=yr;DHuHpYUzcXz8cC=sD?;z$HVT)($7YW6P+0~`378Ml9nF|%%?G8w0` zk8`#+cJR<4GT8!u`o;J8)y|DzNy+9!5#U>u&*q%-7J!xg$iuFF|K6xMP#SDkoxOVA zO2*AuN+RZ*7O+Q%Ea65NJ7+1gRy>IIf->RV(Gb_WcYGAmG5!9MnAvw%7#n+e&6Gv$ zOkTJiH)2y$UCrsV>Z&Si@%jAJuP|ldnqqjD5D~hL9zv(zrFMfzud7NzmUUrN);b@v+Ibe4$Il;OE+`X zP0Mke{voJ0I}MM&6@+*80#O@Q40ouBbPGgGZvx!0zdoi8k7~3%IP6p zfUQ>{nADxVMGS?UW=88~Cfw9U#4^;@^c==}_U=V#pP1FN`j-u$wzd}6?Ri9eGb?O+ z-3xF3rPwJiI^Ut@xQ=;fT^%2Mu#YQdE+)_(FYMR|&aqRLLI_msRR&8 z1FG0m6f{>h+{*Zd7A*0pt*I;hFxuy@hYkP8JI6LR0%=E>m?&UEE2gNy!DE!iMJ#x$Jx=1$H;p#VCeX_`LKPuiwAvD5Z!+qjYo};;M#L z^4a|M7a!Y_OjJZJ73|lHavv4t{KYvMFYGc_Y^`^wgNw&r#TC;Vw|V*O^+kC#TsjgU zssyaA)y)!?3@C{e719h78kYX??blxZ@jqYrEzx9@V!7>BheQmyjt+)hd&^$L8hQ@-&dy_7%R)YjvTQD&*1-IGo+3ST7=bQuCY$#1RGo7H zw`_Qf3oji_A)6uBdAK+&wQk-#BL(LN; za=>vwOmP|AKey>Czj&e`IB{i7`SdWBg_GICw5R4Ud%^g_3_p?Nh+U z7_`=9wXIVMF$K0U40Ux`T{<2C(H? + + + \ No newline at end of file diff --git a/resources-launcher-61-61/drawables.xml b/resources-launcher-61-61/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-61-61/drawables.xml +++ b/resources-launcher-61-61/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-61-61/launcher.png b/resources-launcher-61-61/launcher.png deleted file mode 100644 index 4b0ac644369ccaa78011cfd47a24f318bdc91bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5246 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 + + + \ No newline at end of file diff --git a/resources-launcher-62-62/drawables.xml b/resources-launcher-62-62/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-62-62/drawables.xml +++ b/resources-launcher-62-62/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-62-62/launcher.png b/resources-launcher-62-62/launcher.png deleted file mode 100644 index bfd1b0811807bb907de6790affd8cc2d5d3e4b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5196 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 + + + \ No newline at end of file diff --git a/resources-launcher-65-65/drawables.xml b/resources-launcher-65-65/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-65-65/drawables.xml +++ b/resources-launcher-65-65/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-65-65/launcher.png b/resources-launcher-65-65/launcher.png deleted file mode 100644 index 16d697f9a274eae7d9e6d68a32e9c7574c1485b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5360 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 + + + \ No newline at end of file diff --git a/resources-launcher-70-70/drawables.xml b/resources-launcher-70-70/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-70-70/drawables.xml +++ b/resources-launcher-70-70/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-70-70/launcher.png b/resources-launcher-70-70/launcher.png deleted file mode 100644 index ec89b581e9316e88869fbe9856d48a79c2680293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5378 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 g)#y5AK=J + + + diff --git a/resources-launcher-80-80/drawables.xml b/resources-launcher-80-80/drawables.xml index b9e68f9..44c0b71 100644 --- a/resources-launcher-80-80/drawables.xml +++ b/resources-launcher-80-80/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-80-80/launcher.png b/resources-launcher-80-80/launcher.png deleted file mode 100644 index 3feefd131136b6900cd6ee06660bd1affccea83a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5869 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 + + + \ No newline at end of file diff --git a/resources-lav/strings/strings.xml b/resources-lav/strings/strings.xml index 4b5088b..f4c516d 100644 --- a/resources-lav/strings/strings.xml +++ b/resources-lav/strings/strings.xml @@ -43,13 +43,20 @@ Nav konfigurēts Izvēlne + Izvēlieties... API atslēga Home Assistant. Ilgmūžīgs piekļuves marķieris. HomeAssistant API URL. URL izvēlnes konfigurācijai (JSON). Taimauts sekundēs. Pēc šī neaktivitātes perioda izejiet no lietojumprogrammas, lai taupītu ierīces akumulatoru. Pēc šī laika (sekundēs) tiek automātiski aizvērts darbības apstiprinājuma dialoglodziņš un darbība tiek atcelta. Iestatiet uz 0, lai atspējotu taimautu. - Apzīmē veidus ar ikonām (izslēgts) vai ar etiķetēm (ieslēgts). + Izvēlnes vienuma stils. + Ikonas + Papildu teksts Kreisā (izslēgta) vai labā (ieslēgta) izvēlnes līdzināšana. + No kreisās uz labo + No labās uz kreiso (tikai logrīkam) Automātiski startējiet lietojumprogrammu no logrīka, negaidot pieskārienu. + Iespējojiet fona pakalpojumu, lai uz Home Assistant nosūtītu pulksteņa akumulatora uzlādes līmeni. + Atsvaidzes intensitāte (minūtēs), ar kādu fona pakalpojumam ir jāatkārto akumulatora līmeņa nosūtīšana. \ No newline at end of file diff --git a/resources-lit/strings/strings.xml b/resources-lit/strings/strings.xml index ab3a3e2..483635d 100644 --- a/resources-lit/strings/strings.xml +++ b/resources-lit/strings/strings.xml @@ -43,13 +43,20 @@ Nesukonfigūruotas Meniu + Pasirinkite... API raktas, skirtas HomeAssistant. Ilgalaikis prieigos raktas. „HomeAssistant“ API URL. Meniu konfigūravimo URL (JSON). Skirtasis laikas sekundėmis. Po šio neveiklumo laikotarpio išeikite iš programos, kad taupytumėte įrenginio akumuliatorių. Praėjus šiam laikui (sekundėmis), veiksmo patvirtinimo dialogo langas automatiškai uždaromas ir veiksmas atšaukiamas. Nustatykite 0, kad išjungtumėte skirtąjį laiką. - Tipai su piktogramomis (išjungta) arba etiketėmis (įjungta). + Meniu elemento stilius. + Piktogramos + Papildomas tekstas Kairysis (išjungtas) arba dešinysis (įjungtas) meniu lygiavimas. - (Tik valdiklis) Automatiškai paleiskite programą iš valdiklio, nelaukdami palietimo. + Iš kairės į dešinę + Iš dešinės į kairę + (Tik valdikliui) Automatiškai paleiskite programą iš valdiklio, nelaukdami, kol bus palietus. + Įgalinkite foninę paslaugą, kad į „Home Assistant“ būtų išsiųstas laikrodžio akumuliatoriaus lygis. + Atnaujinimo dažnis (minutėmis), kuriuo foninė paslauga turėtų pakartoti baterijos lygio siuntimą. \ No newline at end of file diff --git a/resources-nob/strings/strings.xml b/resources-nob/strings/strings.xml index 044215f..871526f 100644 --- a/resources-nob/strings/strings.xml +++ b/resources-nob/strings/strings.xml @@ -43,13 +43,20 @@ Ukonfigurert Meny + Plukke ut... API-nøkkel for HomeAssistant. Langlevd tilgangstoken. URL for HomeAssistant API. URL for menykonfigurasjon (JSON). Tidsavbrudd i sekunder. Avslutt applikasjonen etter denne perioden med inaktivitet for å spare enhetens batteri. Etter denne tiden (i sekunder), lukkes en bekreftelsesdialog for en handling automatisk og handlingen avbrytes. Sett til 0 for å deaktivere tidsavbruddet. - Representerer typer med ikoner (av) eller med etiketter (på). + Menyelementstil. + Ikoner + Ekstra tekst Venstre (av) eller Høyre (på) Menyjustering. + Venstre til høyre + Høyre til venstre (Kun widget) Start applikasjonen automatisk fra widgeten uten å vente på et trykk. + Aktiver bakgrunnstjenesten for å sende klokkens batterinivå til Home Assistant. + Oppdateringshastigheten (i minutter) som bakgrunnstjenesten skal gjenta sendingen av batterinivået med. \ No newline at end of file diff --git a/resources-pol/strings/strings.xml b/resources-pol/strings/strings.xml index adf1b27..38066f3 100644 --- a/resources-pol/strings/strings.xml +++ b/resources-pol/strings/strings.xml @@ -43,13 +43,20 @@ Nieskonfigurowane Menu + Wybierać... Klucz API dla HomeAssistant. Długowieczny token dostępu. Adres URL interfejsu API HomeAssistant. Adres URL konfiguracji menu (JSON). Limit czasu w sekundach. Wyjdź z aplikacji po tym okresie bezczynności, aby oszczędzać baterię urządzenia. Po tym czasie (w sekundach) okno dialogowe z potwierdzeniem akcji zamyka się automatycznie, a akcja zostaje anulowana. Ustaw na 0, aby wyłączyć limit czasu. - Reprezentowanie typów za pomocą ikon (wyłączone) lub etykiet (włączone). + Styl pozycji menu. + Ikony + Dodatkowy tekst Wyrównanie menu do lewej (wyłączone) lub do prawej (włączone). + Od lewej do prawej + Od prawej do lewej (Tylko widget) Automatycznie uruchamiaj aplikację z widgetu, bez czekania na dotknięcie. + Włącz usługę działającą w tle, aby wysyłać poziom naładowania baterii zegara do Home Assistant. + Częstotliwość odświeżania (w minutach), z jaką usługa działająca w tle powinna powtarzać wysyłanie informacji o poziomie baterii. \ No newline at end of file diff --git a/resources-por/strings/strings.xml b/resources-por/strings/strings.xml index 620fc13..6bccfe1 100644 --- a/resources-por/strings/strings.xml +++ b/resources-por/strings/strings.xml @@ -31,7 +31,7 @@ Nenhuma chave de API nas configurações do aplicativo Nenhum URL de API nas configurações do aplicativo Nenhum URL de configuração nas configurações do aplicativo - Chamadas de API muito rápidas. Por favor, diminua a velocidade de seus pedidos. + Chamadas de API muito rápidas. Por favor, desacelere seus pedidos. URL não encontrado. Possível erro de URL da API nas configurações. URL não encontrado. Possível erro de URL de configuração nas configurações. Nenhum JSON foi retornado da solicitação HTTP. @@ -43,13 +43,20 @@ Não configurado Cardápio + Selecione... Chave de API para HomeAssistant. Token de acesso de longa duração. URL para API HomeAssistant. URL para configuração do menu (JSON). Tempo limite em segundos. Saia do aplicativo após esse período de inatividade para economizar bateria do aparelho. Após esse tempo (em segundos), uma caixa de diálogo de confirmação de uma ação é automaticamente fechada e a ação é cancelada. Defina como 0 para desativar o tempo limite. - Representando tipos com ícones (desligado) ou com rótulos (ligado). + Estilo do item de menu. + Ícones + Texto Adicional Alinhamento do menu à esquerda (desligado) ou à direita (ligado). + Da esquerda para direita + Direita para esquerda (Somente widget) Inicie automaticamente o aplicativo a partir do widget sem esperar por um toque. + Ative o serviço em segundo plano para enviar o nível da bateria do relógio ao Home Assistant. + A taxa de atualização (em minutos) na qual o serviço em segundo plano deve repetir o envio do nível da bateria. \ No newline at end of file diff --git a/resources-ron/strings/strings.xml b/resources-ron/strings/strings.xml index 2327d7f..5d53005 100644 --- a/resources-ron/strings/strings.xml +++ b/resources-ron/strings/strings.xml @@ -43,13 +43,20 @@ Neconfigurat Meniul + Selectați... Cheie API pentru HomeAssistant. Token de acces cu viață lungă. Adresa URL pentru API-ul HomeAssistant. URL pentru configurarea meniului (JSON). Timeout în secunde. Ieșiți din aplicație după această perioadă de inactivitate pentru a economisi bateria dispozitivului. După acest timp (în secunde), un dialog de confirmare pentru o acțiune este închis automat și acțiunea este anulată. Setați la 0 pentru a dezactiva timeout-ul. - Reprezentarea tipurilor cu pictograme (dezactivate) sau cu etichete (activate). + Stilul elementului de meniu. + icoane + Text suplimentar Alinierea meniului la stânga (dezactivată) sau la dreapta (activată). + De la stânga la dreapta + De la dreapta la stanga (Numai widget) Porniți automat aplicația din widget fără a aștepta o atingere. + Activați serviciul de fundal pentru a trimite nivelul bateriei ceasului către Home Assistant. + Rata de reîmprospătare (în minute) la care serviciul de fundal ar trebui să repete trimiterea nivelului bateriei. \ No newline at end of file diff --git a/resources-slo/strings/strings.xml b/resources-slo/strings/strings.xml index 4e2c3f0..212c9e3 100644 --- a/resources-slo/strings/strings.xml +++ b/resources-slo/strings/strings.xml @@ -37,19 +37,26 @@ Z požiadavky HTTP sa nevrátil žiadny JSON. Požiadavka HTTP vrátila kód chyby = Adresa URL rozhrania API nesmie obsahovať koncovú lomku „/“ - Dostupné + K dispozícii Prebieha kontrola... nedostupné Nekonfigurované Ponuka + Vybrať... Kľúč API pre HomeAssistant. Prístupový token s dlhou životnosťou. URL pre HomeAssistant API. Webová adresa pre konfiguráciu ponuky (JSON). Časový limit v sekundách. Po tejto dobe nečinnosti ukončite aplikáciu, aby ste šetrili batériu zariadenia. Po tomto čase (v sekundách) sa dialógové okno s potvrdením akcie automaticky zatvorí a akcia sa zruší. Ak chcete časový limit deaktivovať, nastavte na 0. - Typy predstavujú ikony (vypnuté) alebo štítky (zapnuté). + Štýl položky menu. + ikony + Doplnkový text Zarovnanie ponuky vľavo (vypnuté) alebo vpravo (zapnuté). + Zľava doprava + Zprava doľava (Len miniaplikácia) Automaticky spustite aplikáciu z miniaplikácie bez čakania na klepnutie. + Povoľte službu na pozadí na odosielanie úrovne batérie hodín do domáceho asistenta. + Obnovovacia frekvencia (v minútach), pri ktorej by služba na pozadí mala opakovať odosielanie úrovne batérie. \ No newline at end of file diff --git a/resources-slv/strings/strings.xml b/resources-slv/strings/strings.xml index 512dc90..3102bb6 100644 --- a/resources-slv/strings/strings.xml +++ b/resources-slv/strings/strings.xml @@ -43,13 +43,20 @@ Nekonfigurirano meni + Izberite ... API ključ za HomeAssistant. Dolgoživ dostopni žeton. URL za HomeAssistant API. URL za konfiguracijo menija (JSON). Časovna omejitev v sekundah. Po tem obdobju nedejavnosti zaprite aplikacijo, da prihranite baterijo naprave. Po tem času (v sekundah) se potrditveno pogovorno okno za dejanje samodejno zapre in dejanje je preklicano. Nastavite na 0, da onemogočite časovno omejitev. - Predstavljanje tipov z ikonami (izklopljeno) ali z oznakami (vklopljeno). + Slog elementa menija. + Ikone + Dodatno besedilo Leva (izklopljena) ali desna (vklopljena) poravnava menija. + Od leve proti desni + Od desne proti levi (Samo pripomoček) Samodejno zaženite aplikacijo iz pripomočka, ne da bi čakali na dotik. + Omogočite storitev v ozadju za pošiljanje stanja baterije ure domačemu pomočniku. + Hitrost osveževanja (v minutah), pri kateri naj storitev v ozadju ponavlja pošiljanje stanja baterije. \ No newline at end of file diff --git a/resources-spa/strings/strings.xml b/resources-spa/strings/strings.xml index 5961adb..18ae970 100644 --- a/resources-spa/strings/strings.xml +++ b/resources-spa/strings/strings.xml @@ -43,13 +43,20 @@ Desconfigurado Menú + Seleccionar... Clave API para HomeAssistant. Token de acceso de larga duración. URL para la API de HomeAssistant. URL para configuración del menú (JSON). Tiempo de espera en segundos. Salga de la aplicación después de este período de inactividad para ahorrar batería del dispositivo. Después de este tiempo (en segundos), se cierra automáticamente un cuadro de diálogo de confirmación de una acción y se cancela la acción. Establezca en 0 para desactivar el tiempo de espera. - Representando tipos con iconos (apagados) o con etiquetas (encendido). + Estilo de elemento de menú. + Iconos + Texto adicional Alineación del menú izquierda (desactivada) o derecha (activada). + De izquierda a derecha + De derecha a izquierda (Solo widget) Inicia automáticamente la aplicación desde el widget sin esperar un toque. + Habilite el servicio en segundo plano para enviar el nivel de batería del reloj a Home Assistant. + La frecuencia de actualización (en minutos) a la que el servicio en segundo plano debe repetir el envío del nivel de la batería. \ No newline at end of file diff --git a/resources-swe/strings/strings.xml b/resources-swe/strings/strings.xml index f5eb436..ed40b30 100644 --- a/resources-swe/strings/strings.xml +++ b/resources-swe/strings/strings.xml @@ -29,7 +29,7 @@ Ingen internetanslutning Inget svar, kontrollera internetanslutningen Ingen API-nyckel i applikationsinställningarna - Ingen API-URL i applikationsinställningarna + Ingen API-URL i programinställningarna Ingen konfigurations-URL i programinställningarna API-anrop för snabba. Vänligen sakta ner dina förfrågningar. Webbadressen hittades inte. Potentiellt API-URL-fel i inställningarna. @@ -43,13 +43,20 @@ Okonfigurerad Meny + Välj... API-nyckel för HomeAssistant. Långlivad åtkomsttoken. URL för HomeAssistant API. URL för menykonfiguration (JSON). Timeout i sekunder. Avsluta programmet efter denna period av inaktivitet för att spara enhetens batteri. Efter denna tid (i sekunder) stängs en bekräftelsedialog för en åtgärd automatiskt och åtgärden avbryts. Ställ in på 0 för att inaktivera timeout. - Representerar typer med ikoner (av) eller med etiketter (på). + Menyalternativ stil. + Ikoner + Ytterligare text Vänster (av) eller höger (på) menyjustering. + Vänster till höger + Höger till vänster (Endast widget) Starta programmet automatiskt från widgeten utan att vänta på ett tryck. + Aktivera bakgrundstjänsten för att skicka klockans batterinivå till Home Assistant. + Uppdateringshastigheten (i minuter) med vilken bakgrundstjänsten ska upprepa sändningen av batterinivån. \ No newline at end of file diff --git a/resources-tha/strings/strings.xml b/resources-tha/strings/strings.xml index 7ebd76a..4cbaa49 100644 --- a/resources-tha/strings/strings.xml +++ b/resources-tha/strings/strings.xml @@ -43,13 +43,20 @@ ไม่ได้กำหนดค่า เมนู + เลือก... คีย์ API สำหรับ HomeAssistant โทเค็นการเข้าถึงที่มีอายุการใช้งานยาวนาน URL สำหรับ HomeAssistant API URL สำหรับการกำหนดค่าเมนู (JSON) หมดเวลาเป็นวินาที ออกจากแอปพลิเคชันหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่งเพื่อประหยัดแบตเตอรี่ของอุปกรณ์ หลังจากเวลานี้ (เป็นวินาที) กล่องโต้ตอบการยืนยันสำหรับการดำเนินการจะปิดโดยอัตโนมัติและการดำเนินการจะถูกยกเลิก ตั้งค่าเป็น 0 เพื่อปิดใช้งานการหมดเวลา - เป็นตัวแทนประเภทด้วยไอคอน (ปิด) หรือมีป้ายกำกับ (เปิด) + รูปแบบรายการเมนู + ไอคอน + ข้อความเพิ่มเติม การจัดตำแหน่งเมนูซ้าย (ปิด) หรือขวา (เปิด) + จากซ้ายไปขวา + จากขวาไปซ้าย (วิดเจ็ตเท่านั้น) เริ่มแอปพลิเคชันโดยอัตโนมัติจากวิดเจ็ตโดยไม่ต้องรอการแตะ + เปิดใช้บริการพื้นหลังเพื่อส่งระดับแบตเตอรี่นาฬิกาไปยัง Home Assistant + อัตรารีเฟรช (เป็นนาที) ที่บริการพื้นหลังควรส่งระดับแบตเตอรี่ซ้ำ \ No newline at end of file diff --git a/resources-tur/strings/strings.xml b/resources-tur/strings/strings.xml index 379ec54..4d0b9b9 100644 --- a/resources-tur/strings/strings.xml +++ b/resources-tur/strings/strings.xml @@ -43,13 +43,20 @@ Yapılandırılmamış Menü + Seçme... HomeAssistant için API Anahtarı. Uzun Ömürlü Erişim Jetonu. HomeAssistant API'sinin URL'si. Menü yapılandırmasının URL'si (JSON). Saniye cinsinden zaman aşımı. Cihazın pilinden tasarruf etmek için bu süre boyunca işlem yapılmadığında uygulamadan çıkın. - Bu sürenin sonunda (saniye cinsinden), bir eyleme ilişkin onay iletişim kutusu otomatik olarak kapatılır ve eylem iptal edilir. Zaman aşımını devre dışı bırakmak için 0'a ayarlayın. - Türleri simgelerle (kapalı) veya etiketlerle (açık) temsil etme. + Bu sürenin sonunda (saniye olarak), bir eyleme ilişkin onay iletişim kutusu otomatik olarak kapatılır ve eylem iptal edilir. Zaman aşımını devre dışı bırakmak için 0'a ayarlayın. + Menü öğesi stili. + Simgeler + Ek Metin Sol (kapalı) veya Sağ (açık) Menü Hizalaması. + Soldan sağa + Sağdan sola (Yalnızca Widget) Dokunmayı beklemeden uygulamayı widget'tan otomatik olarak başlatın. + Saatin pil seviyesini Ev Asistanına göndermek için arka plan hizmetini etkinleştirin. + Arka plan hizmetinin pil seviyesini göndermeyi tekrarlaması gereken yenileme hızı (dakika olarak). \ No newline at end of file diff --git a/resources-ukr/strings/strings.xml b/resources-ukr/strings/strings.xml index fe951b2..45783b3 100644 --- a/resources-ukr/strings/strings.xml +++ b/resources-ukr/strings/strings.xml @@ -43,13 +43,20 @@ Неналаштований Меню + Виберіть... Ключ API для HomeAssistant. Довговічний маркер доступу. URL для HomeAssistant API. URL-адреса для налаштування меню (JSON). Час очікування в секундах. Вийдіть із програми після цього періоду бездіяльності, щоб заощадити батарею пристрою. Після закінчення цього часу (у секундах) діалогове вікно підтвердження дії автоматично закривається, а дія скасовується. Встановіть 0, щоб вимкнути тайм-аут. - Представлення типів піктограмами (вимкнено) або мітками (увімкнено). + Стиль пункту меню. + Ікони + Додатковий текст Ліворуч (вимкнено) або праворуч (увімкнено) вирівнювання меню. + Зліва направо + Справа наліво (Лише віджет) Автоматично запускайте програму з віджета, не чекаючи дотику. + Увімкніть фонову службу, щоб надсилати інформацію про рівень заряду акумулятора годинника до Home Assistant. + Частота оновлення (у хвилинах), з якою фонова служба має повторно надсилати рівень заряду акумулятора. \ No newline at end of file diff --git a/resources-vie/strings/strings.xml b/resources-vie/strings/strings.xml index ca576fa..c82489c 100644 --- a/resources-vie/strings/strings.xml +++ b/resources-vie/strings/strings.xml @@ -43,13 +43,20 @@ Chưa được định cấu hình Thực đơn + Lựa chọn... Khóa API cho HomeAssistant. Mã thông báo truy cập tồn tại lâu dài. URL cho API HomeAssistant. URL cho cấu hình menu (JSON). Thời gian chờ tính bằng giây. Thoát khỏi ứng dụng sau khoảng thời gian không hoạt động này để tiết kiệm pin cho thiết bị. Sau thời gian này (tính bằng giây), hộp thoại xác nhận cho một hành động sẽ tự động đóng và hành động đó sẽ bị hủy. Đặt thành 0 để tắt thời gian chờ. - Biểu diễn các loại bằng biểu tượng (tắt) hoặc bằng nhãn (bật). + Phong cách mục menu. + Biểu tượng + Văn bản bổ sung Căn chỉnh menu Trái (tắt) hoặc Phải (bật). + Trái sang phải + Phải sang trái (Chỉ tiện ích) Tự động khởi động ứng dụng từ tiện ích mà không cần chờ nhấn. + Kích hoạt dịch vụ nền để gửi mức pin đồng hồ đến Home Assistant. + Tốc độ làm mới (tính bằng phút) mà dịch vụ nền sẽ lặp lại việc gửi mức pin. \ No newline at end of file diff --git a/resources-zhs/strings/strings.xml b/resources-zhs/strings/strings.xml index 72928d5..8a65a32 100644 --- a/resources-zhs/strings/strings.xml +++ b/resources-zhs/strings/strings.xml @@ -43,13 +43,20 @@ 未配置 菜单 + 选择... HomeAssistant 的 API 密钥。 长期访问令牌。 HomeAssistant API 的 URL。 菜单配置的 URL (JSON)。 超时(以秒为单位)。闲置一段时间后退出应用程序以节省设备电池。 在此时间(以秒为单位)之后,操作的确认对话框将自动关闭并取消该操作。设置为 0 以禁用超时。 - 用图标(关闭)或标签(打开)表示类型。 + 菜单项样式。 + 图标 + 附加文字 左(关)或右(开)菜单对齐。 + 左到右 + 右到左 (仅限小部件)从小部件自动启动应用程序,无需等待点击。 + 启用后台服务将时钟电池电量发送到 Home Assistant。 + 后台服务应重复发送电池电量的刷新率(以分钟为单位)。 \ No newline at end of file diff --git a/resources-zht/strings/strings.xml b/resources-zht/strings/strings.xml index 3196f55..2ca5a39 100644 --- a/resources-zht/strings/strings.xml +++ b/resources-zht/strings/strings.xml @@ -43,13 +43,20 @@ 未配置 選單 + 選擇... HomeAssistant 的 API 金鑰。 長期訪問令牌。 HomeAssistant API 的 URL。 選單配置的 URL (JSON)。 超時(以秒為單位)。閒置一段時間後退出應用程式以節省設備電池。 在此時間(以秒為單位)之後,操作的確認對話方塊將自動關閉並取消該操作。設定為 0 以停用逾時。 - 用圖示(關閉)或標籤(開啟)表示類型。 + 選單項目樣式。 + 圖示 + 附加文字 左(關)或右(開)選單對齊。 + 左至右 + 右到左 (僅限小部件)從小部件自動啟動應用程序,無需等待點擊。 + 啟用後台服務將時鐘電池電量傳送到 Home Assistant。 + 後台服務應重複發送電池電量的更新率(以分鐘為單位)。 \ No newline at end of file diff --git a/resources-zsm/strings/strings.xml b/resources-zsm/strings/strings.xml index d5d5c20..0afa9c0 100644 --- a/resources-zsm/strings/strings.xml +++ b/resources-zsm/strings/strings.xml @@ -43,13 +43,20 @@ Tidak dikonfigurasikan Menu + Pilih... Kunci API untuk HomeAssistant. Token Akses Berumur Panjang. URL untuk API HomeAssistant. URL untuk konfigurasi menu (JSON). Tamat masa dalam beberapa saat. Keluar dari aplikasi selepas tempoh tidak aktif ini untuk menjimatkan bateri peranti. Selepas masa ini (dalam beberapa saat), dialog pengesahan untuk tindakan ditutup secara automatik dan tindakan itu dibatalkan. Tetapkan kepada 0 untuk melumpuhkan tamat masa. - Mewakili jenis dengan ikon (dimatikan) atau dengan label (dihidupkan). + Gaya item menu. + ikon + Teks Tambahan Penjajaran Menu Kiri (mati) atau Kanan (hidup). + Kiri ke kanan + Kanan ke kiri (Widget sahaja) Mulakan aplikasi secara automatik daripada widget tanpa menunggu satu ketikan. + Dayakan perkhidmatan latar belakang untuk menghantar paras bateri jam kepada Home Assistant. + Kadar penyegaran semula (dalam minit) di mana perkhidmatan latar belakang harus mengulangi penghantaran tahap bateri. \ No newline at end of file diff --git a/resources/drawables/launcher.png b/resources/drawables/launcher.png deleted file mode 100644 index 2d74c0fc0ff89d2ed1b746ee02d77f708ba7226e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6412 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 3 - + 0 - + 1 - + false + + + false + + + 15 diff --git a/resources/settings/settings.xml b/resources/settings/settings.xml index 22aab55..59e55c5 100644 --- a/resources/settings/settings.xml +++ b/resources/settings/settings.xml @@ -18,9 +18,7 @@ title="@Strings.SettingsApiKey" prompt="@Strings.SettingsApiKeyPrompt" > - + - + - + - + - + - + + @Strings.SettingsMenuItemStyleIcons + @Strings.SettingsMenuItemStyleText + - + + @Strings.LeftToRight + @Strings.RightToLeft + - + + + + + + + + + diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml index b93f732..11c8e6b 100644 --- a/resources/strings/strings.xml +++ b/resources/strings/strings.xml @@ -38,13 +38,20 @@ Menu + Select... API Key for HomeAssistant. Long-Lived Access Token. URL for HomeAssistant API. URL for menu configuration (JSON). Timeout in seconds. Exit the application after this period of inactivity to save the device battery. After this time (in seconds), a confirmation dialog for an action is automatically closed and the action is cancelled. Set to 0 to disable the timeout. - Representing types with icons (off) or with labels (on). + Menu item style. + Icons + Additional Text Left (off) or Right (on) Menu Alignment. + Left to right + Right to Left (Widget only) Automatically start the application from the widget without waiting for a tap. + Enable the background service to send the clock battery level to Home Assistant. + The refresh rate (in minutes) at which the background service should repeat sending the battery level. diff --git a/source/BackgroundServiceDelegate.mc b/source/BackgroundServiceDelegate.mc new file mode 100644 index 0000000..e398065 --- /dev/null +++ b/source/BackgroundServiceDelegate.mc @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------------- +// +// Distributed under MIT Licence +// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +// +//----------------------------------------------------------------------------------- +// +// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +// tested on a Venu 2 device. The source code is provided at: +// https://github.com/house-of-abbey/GarminHomeAssistant. +// +// P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023 +// +// +// Description: +// +// The background service delegate currently just reports the Garmin watch's battery +// level. +// +//----------------------------------------------------------------------------------- + +using Toybox.Lang; +using Toybox.Application.Properties; +using Toybox.Background; +using Toybox.System; + +(:background) +class BackgroundServiceDelegate extends System.ServiceDelegate { + + function initialize() { + ServiceDelegate.initialize(); + } + + function onReturnBatteryUpdate(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { + if (Globals.scDebug) { + System.println("BackgroundServiceDelegate onReturnBatteryUpdate() Response Code: " + responseCode); + System.println("BackgroundServiceDelegate onReturnBatteryUpdate() Response Data: " + data); + } + Background.exit(null); + } + + function onTemporalEvent() as Void { + if (! System.getDeviceSettings().phoneConnected) { + if (Globals.scDebug) { + System.println("BackgroundServiceDelegate onTemporalEvent(): No Phone connection, skipping API call."); + } + } else if (! System.getDeviceSettings().connectionAvailable) { + if (Globals.scDebug) { + System.println("BackgroundServiceDelegate onTemporalEvent(): No Internet connection, skipping API call."); + } + } else { + // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run + Communications.makeWebRequest( + (Properties.getValue("api_url") as Lang.String) + "/events/garmin.battery_level", + { + "level" => System.getSystemStats().battery, + "is_charging" => System.getSystemStats().charging, + "device_id" => System.getDeviceSettings().uniqueIdentifier + }, + { + :method => Communications.HTTP_REQUEST_METHOD_POST, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, + "Authorization" => "Bearer " + (Properties.getValue("api_key") as Lang.String) + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, + method(:onReturnBatteryUpdate) + ); + } + } + +} diff --git a/source/ClientId.mc.unpopulated b/source/ClientId.mc.unpopulated new file mode 100644 index 0000000..236b902 --- /dev/null +++ b/source/ClientId.mc.unpopulated @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------------- +// +// Distributed under MIT Licence +// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +// +//----------------------------------------------------------------------------------- +// +// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +// tested on a Venu 2 device. The source code is provided at: +// https://github.com/house-of-abbey/GarminHomeAssistant. +// +// J D Abbey & P A Abbey, 28 December 2022 +// +// +// Description: +// +// ClientId is somewhere to store personal credentials that should not be shared in +// a separate file that is locally customised to the source code and not commited +// back to GitHub. +// +//----------------------------------------------------------------------------------- + +(:glance) +class ClientId { + static const webLogUrl = "https://..."; + static const webLogClearUrl = "https://..._clear.php"; +} diff --git a/source/Globals.mc b/source/Globals.mc index 6089b16..8fbf034 100644 --- a/source/Globals.mc +++ b/source/Globals.mc @@ -20,6 +20,7 @@ using Toybox.Lang; +(:glance) class Globals { // Enable printing of messages to the debug console (don't make this a Property // as the messages can't be read from a watch!) diff --git a/source/HomeAssistantApp.mc b/source/HomeAssistantApp.mc index 13169d1..85950ed 100644 --- a/source/HomeAssistantApp.mc +++ b/source/HomeAssistantApp.mc @@ -21,40 +21,39 @@ using Toybox.Application; using Toybox.Lang; using Toybox.WatchUi; +using Toybox.System; using Toybox.Application.Properties; using Toybox.Timer; +(:background) class HomeAssistantApp extends Application.AppBase { - private var strNoApiKey as Lang.String or Null; - private var strNoApiUrl as Lang.String or Null; - private var strNoConfigUrl as Lang.String or Null; - private var strNoPhone as Lang.String or Null; - private var strNoInternet as Lang.String or Null; - private var strNoResponse as Lang.String or Null; - private var strApiFlood as Lang.String or Null; - private var strConfigUrlNotFound as Lang.String or Null; - private var strNoJson as Lang.String or Null; - private var strUnhandledHttpErr as Lang.String or Null; - private var strTrailingSlashErr as Lang.String or Null; - private var strAvailable = WatchUi.loadResource($.Rez.Strings.Available); - private var strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable); - private var strUnconfigured = WatchUi.loadResource($.Rez.Strings.Unconfigured); + private var strNoApiKey as Lang.String or Null; + private var strNoApiUrl as Lang.String or Null; + private var strNoConfigUrl as Lang.String or Null; + private var strNoPhone as Lang.String or Null; + private var strNoInternet as Lang.String or Null; + private var strNoResponse as Lang.String or Null; + private var strApiFlood as Lang.String or Null; + private var strConfigUrlNotFound as Lang.String or Null; + private var strNoJson as Lang.String or Null; + private var strUnhandledHttpErr as Lang.String or Null; + private var strTrailingSlashErr as Lang.String or Null; + private var strAvailable as Lang.String or Null; + private var strUnavailable as Lang.String or Null; + private var strUnconfigured as Lang.String or Null; - private var mApiKey as Lang.String or Null; // The compiler can't tell these are updated by - private var mApiUrl as Lang.String or Null; // initialize(), hence the "or Null". - private var mConfigUrl as Lang.String or Null; // - private var mApiStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking); - private var mMenuStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking); + private var mApiStatus as Lang.String or Null; + private var mMenuStatus as Lang.String or Null; private var mHaMenu as HomeAssistantView or Null; private var mQuitTimer as QuitTimer or Null; private var mTimer as Timer.Timer or Null; - private var mItemsToUpdate; // Array initialised by onReturnFetchMenuConfig() - private var mNextItemToUpdate = 0; // Index into the above array + private var mItemsToUpdate as Lang.Array or Null; // Array initialised by onReturnFetchMenuConfig() + private var mNextItemToUpdate as Lang.Number = 0; // Index into the above array private var mIsGlance as Lang.Boolean = false; + private var mIsApp as Lang.Boolean = false; // Or Widget function initialize() { AppBase.initialize(); - onSettingsChanged(); // ATTENTION when adding stuff into this block: // Because of the >>GlanceView<<, it should contain only // code, which is used as well for the glance: @@ -100,8 +99,18 @@ class HomeAssistantApp extends Application.AppBase { // with "(:glance)". } + // These are required for the Application/Widget and the Glance view, but not for the background service. + function initResources() { + strAvailable = WatchUi.loadResource($.Rez.Strings.Available); + strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable); + strUnconfigured = WatchUi.loadResource($.Rez.Strings.Unconfigured); + mApiStatus = WatchUi.loadResource($.Rez.Strings.Checking); + mMenuStatus = WatchUi.loadResource($.Rez.Strings.Checking); + } + // Return the initial view of your application here function getInitialView() as Lang.Array? { + mIsApp = true; strNoApiKey = WatchUi.loadResource($.Rez.Strings.NoAPIKey); strNoApiUrl = WatchUi.loadResource($.Rez.Strings.NoApiUrl); strNoConfigUrl = WatchUi.loadResource($.Rez.Strings.NoConfigUrl); @@ -113,24 +122,25 @@ class HomeAssistantApp extends Application.AppBase { strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson); strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr); strTrailingSlashErr = WatchUi.loadResource($.Rez.Strings.TrailingSlashErr); + initResources(); mQuitTimer = new QuitTimer(); - if (mApiKey.length() == 0) { + if (Settings.get().getApiKey().length() == 0) { if (Globals.scDebug) { - System.println("HomeAssistantApp getInitialView(): No API key in the application settings."); + System.println("HomeAssistantApp getInitialView(): No API key in the application Settings.get()."); } return ErrorView.create(strNoApiKey + "."); - } else if (mApiUrl.length() == 0) { + } else if (Settings.get().getApiUrl().length() == 0) { if (Globals.scDebug) { - System.println("HomeAssistantApp getInitialView(): No API URL in the application settings."); + System.println("HomeAssistantApp getInitialView(): No API URL in the application Settings.get()."); } return ErrorView.create(strNoApiUrl + "."); - } else if (mApiUrl.substring(-1, mApiUrl.length()).equals("/")) { + } else if (Settings.get().getApiUrl().substring(-1, Settings.get().getApiUrl().length()).equals("/")) { if (Globals.scDebug) { System.println("HomeAssistantApp getInitialView(): API URL must not have a trailing slash '/'."); } return ErrorView.create(strTrailingSlashErr + "."); - } else if (mConfigUrl.length() == 0) { + } else if (Settings.get().getConfigUrl().length() == 0) { if (Globals.scDebug) { System.println("HomeAssistantApp getInitialView(): No configuration URL in the application settings."); } @@ -218,7 +228,7 @@ class HomeAssistantApp extends Application.AppBase { if (!mIsGlance) { mHaMenu = new HomeAssistantView(data, null); mQuitTimer.begin(); - if (Properties.getValue("widget_start_no_tap")) { + if (Settings.get().get().getIsWidgetStartNoTap()) { // As soon as the menu has been fetched start show the menu of items. // This behaviour is inconsistent with the standard Garmin User Interface, but has been // requested by users so has been made the non-default option. @@ -250,14 +260,10 @@ class HomeAssistantApp extends Application.AppBase { (:glance) function fetchMenuConfig() as Void { - if (mConfigUrl.equals("")) { + if (Settings.get().getConfigUrl().equals("")) { mMenuStatus = strUnconfigured; WatchUi.requestUpdate(); } else { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_GET, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }; if (! System.getDeviceSettings().phoneConnected) { if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call."); @@ -280,9 +286,12 @@ class HomeAssistantApp extends Application.AppBase { mMenuStatus = strUnavailable; } else { Communications.makeWebRequest( - mConfigUrl, + Settings.get().getConfigUrl(), null, - options, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, method(:onReturnFetchMenuConfig) ); } @@ -373,17 +382,10 @@ class HomeAssistantApp extends Application.AppBase { (:glance) function fetchApiStatus() as Void { - if (mApiUrl.equals("")) { + if (Settings.get().getApiUrl().equals("")) { mApiStatus = strUnconfigured; WatchUi.requestUpdate(); } else { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_GET, - :headers => { - "Authorization" => "Bearer " + mApiKey - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }; if (! System.getDeviceSettings().phoneConnected) { if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call."); @@ -406,9 +408,15 @@ class HomeAssistantApp extends Application.AppBase { } } else { Communications.makeWebRequest( - mApiUrl + "/", + Settings.get().getApiUrl() + "/", null, - options, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :headers => { + "Authorization" => "Bearer " + Settings.get().getApiKey() + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, method(:onReturnFetchApiStatus) ); } @@ -437,8 +445,8 @@ class HomeAssistantApp extends Application.AppBase { WatchUi.pushView(mHaMenu, new HomeAssistantViewDelegate(true), WatchUi.SLIDE_IMMEDIATE); } - // We need to spread out the API calls so as not to overload the results queue and cause Communications.BLE_QUEUE_FULL (-101) error. - // This function is called by a timer every Globals.menuItemUpdateInterval ms. + // We need to spread out the API calls so as not to overload the results queue and cause Communications.BLE_QUEUE_FULL + // (-101) error. This function is called by a timer every Globals.menuItemUpdateInterval ms. function updateNextMenuItem() as Void { var itu = mItemsToUpdate as Lang.Array; if (itu == null) { @@ -458,9 +466,9 @@ class HomeAssistantApp extends Application.AppBase { return mQuitTimer; } - (:glance) function getGlanceView() as Lang.Array or Null { mIsGlance = true; + initResources(); updateGlance(); mTimer = new Timer.Timer(); mTimer.start(method(:updateGlance), Globals.scApiBackoff, true); @@ -476,12 +484,25 @@ class HomeAssistantApp extends Application.AppBase { // Replace this functionality with a more central settings class as proposed in // https://github.com/house-of-abbey/GarminHomeAssistant/pull/17. function onSettingsChanged() as Void { - mApiKey = Properties.getValue("api_key"); - mApiUrl = Properties.getValue("api_url"); - mConfigUrl = Properties.getValue("config_url"); + if (Globals.scDebug) { + System.println("HomeAssistantApp onSettingsChanged()"); + } + Settings.get().update(); } + + // Called each time the Registered Temporal Event is to be invoked. So the object is created each time on request and + // then destroyed on completion (to save resources). + function getServiceDelegate() as Lang.Array { + return [new BackgroundServiceDelegate()]; + } + + function getIsApp() as Lang.Boolean { + return mIsApp; + } + } +(:glance, :background) function getApp() as HomeAssistantApp { return Application.getApp() as HomeAssistantApp; } diff --git a/source/HomeAssistantConfirmation.mc b/source/HomeAssistantConfirmation.mc index 414552d..38ed9f6 100644 --- a/source/HomeAssistantConfirmation.mc +++ b/source/HomeAssistantConfirmation.mc @@ -40,10 +40,10 @@ class HomeAssistantConfirmationDelegate extends WatchUi.ConfirmationDelegate { function initialize(callback as Method() as Void) { WatchUi.ConfirmationDelegate.initialize(); mConfirmMethod = callback; - var timeoutSeconds = Properties.getValue("confirm_timeout") as Lang.Number; - if (timeoutSeconds > 0) { + var timeout = Settings.get().getConfirmTimeout(); // ms + if (timeout > 0) { mTimer = new Timer.Timer(); - mTimer.start(method(:onTimeout), timeoutSeconds * 1000, true); + mTimer.start(method(:onTimeout), timeout, true); } } diff --git a/source/HomeAssistantGlanceView.mc b/source/HomeAssistantGlanceView.mc index 8e5d9d8..51b8aad 100644 --- a/source/HomeAssistantGlanceView.mc +++ b/source/HomeAssistantGlanceView.mc @@ -24,8 +24,7 @@ using Toybox.Graphics; (:glance) class HomeAssistantGlanceView extends WatchUi.GlanceView { - private static const scLeftMargin = 20; // in pixels - private static const scLeftIndent = 10; // Left Indent "_text:" in pixels + private static const scLeftMargin = 5; // in pixels private static const scMidSep = 10; // Middle Separator "text:_text" in pixels private var mApp as HomeAssistantApp; private var mTitle as WatchUi.Text or Null; @@ -58,8 +57,8 @@ class HomeAssistantGlanceView extends WatchUi.GlanceView { :text => "API:", :color => Graphics.COLOR_WHITE, :font => Graphics.FONT_XTINY, - :justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER, - :locX => scLeftMargin + scLeftIndent + tw, + :justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER, + :locX => scLeftMargin, :locY => 3 * h / 6 }); mApiStatus = new WatchUi.Text({ @@ -67,15 +66,15 @@ class HomeAssistantGlanceView extends WatchUi.GlanceView { :color => Graphics.COLOR_WHITE, :font => Graphics.FONT_XTINY, :justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER, - :locX => scLeftMargin + scLeftIndent + scMidSep + tw, + :locX => scLeftMargin + scMidSep + tw, :locY => 3 * h / 6 }); mMenuText = new WatchUi.Text({ :text => strGlanceMenu + ":", :color => Graphics.COLOR_WHITE, :font => Graphics.FONT_XTINY, - :justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER, - :locX => scLeftMargin + scLeftIndent + tw, + :justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER, + :locX => scLeftMargin, :locY => 5 * h / 6 }); mMenuStatus = new WatchUi.Text({ @@ -83,7 +82,7 @@ class HomeAssistantGlanceView extends WatchUi.GlanceView { :color => Graphics.COLOR_WHITE, :font => Graphics.FONT_XTINY, :justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER, - :locX => scLeftMargin + scLeftIndent + scMidSep + tw, + :locX => scLeftMargin + scMidSep + tw, :locY => 5 * h / 6 }); } @@ -95,7 +94,7 @@ class HomeAssistantGlanceView extends WatchUi.GlanceView { } dc.setColor( Graphics.COLOR_WHITE, - Graphics.COLOR_BLUE + Graphics.COLOR_TRANSPARENT ); dc.clear(); mTitle.draw(dc); diff --git a/source/HomeAssistantMenuItemFactory.mc b/source/HomeAssistantMenuItemFactory.mc index 21eb111..1e84ef5 100644 --- a/source/HomeAssistantMenuItemFactory.mc +++ b/source/HomeAssistantMenuItemFactory.mc @@ -23,13 +23,12 @@ using Toybox.Lang; using Toybox.WatchUi; class HomeAssistantMenuItemFactory { - private var mMenuItemOptions as Lang.Dictionary; - private var mLabelToggle as Lang.Dictionary; - private var strMenuItemTap as Lang.String; - private var bRepresentTypesWithLabels as Lang.Boolean; - private var mTapTypeIcon as WatchUi.Bitmap; - private var mGroupTypeIcon as WatchUi.Bitmap; - private var mHomeAssistantService as HomeAssistantService; + private var mMenuItemOptions as Lang.Dictionary; + private var mLabelToggle as Lang.Dictionary; + private var strMenuItemTap as Lang.String; + private var mTapTypeIcon as WatchUi.Bitmap; + private var mGroupTypeIcon as WatchUi.Bitmap; + private var mHomeAssistantService as HomeAssistantService; private static var instance; @@ -38,18 +37,10 @@ class HomeAssistantMenuItemFactory { :enabled => WatchUi.loadResource($.Rez.Strings.MenuItemOn) as Lang.String, :disabled => WatchUi.loadResource($.Rez.Strings.MenuItemOff) as Lang.String }; - bRepresentTypesWithLabels = Application.Properties.getValue("types_representation") as Lang.Boolean; - var menuItemAlignment = Application.Properties.getValue("menu_alignment") as Lang.Boolean; - if(menuItemAlignment){ - mMenuItemOptions = { - :alignment => WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_RIGHT - }; - } else { - mMenuItemOptions = { - :alignment => WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_LEFT - }; - } + mMenuItemOptions = { + :alignment => Settings.get().getMenuAlignment() + }; strMenuItemTap = WatchUi.loadResource($.Rez.Strings.MenuItemTap); mTapTypeIcon = new WatchUi.Bitmap({ @@ -74,15 +65,9 @@ class HomeAssistantMenuItemFactory { } function toggle(label as Lang.String or Lang.Symbol, identifier as Lang.Object or Null) as WatchUi.MenuItem { - var subLabel = null; - - if (bRepresentTypesWithLabels == true){ - subLabel=mLabelToggle; - } - return new HomeAssistantToggleMenuItem( label, - subLabel, + Settings.get().getMenuStyle() == Settings.MENU_STYLE_TEXT ? mLabelToggle : null, identifier, false, mMenuItemOptions @@ -95,7 +80,7 @@ class HomeAssistantMenuItemFactory { service as Lang.String or Null, confirm as Lang.Boolean ) as WatchUi.MenuItem { - if (bRepresentTypesWithLabels) { + if (Settings.get().getMenuStyle() == Settings.MENU_STYLE_TEXT) { return new HomeAssistantMenuItem( label, strMenuItemTap, @@ -120,7 +105,7 @@ class HomeAssistantMenuItemFactory { } function group(definition as Lang.Dictionary) as WatchUi.MenuItem { - if (bRepresentTypesWithLabels) { + if (Settings.get().getMenuStyle() == Settings.MENU_STYLE_TEXT) { return new HomeAssistantViewMenuItem(definition); } else { return new HomeAssistantViewIconMenuItem(definition, mGroupTypeIcon, mMenuItemOptions); diff --git a/source/HomeAssistantService.mc b/source/HomeAssistantService.mc index d5a84bd..4588b8b 100644 --- a/source/HomeAssistantService.mc +++ b/source/HomeAssistantService.mc @@ -27,17 +27,11 @@ class HomeAssistantService { private var strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone); private var strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet); private var strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse); - private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson); + private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson); private var strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood); private var strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound); private var strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr); - private var mApiKey as Lang.String; - - function initialize() { - mApiKey = Properties.getValue("api_key"); - } - // Callback function after completing the POST request to call a service. // function onReturnCall(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String, context as Lang.Object) as Void { @@ -123,15 +117,6 @@ class HomeAssistantService { } function call(identifier as Lang.String, service as Lang.String) as Void { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_POST, - :headers => { - "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, - "Authorization" => "Bearer " + mApiKey - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON, - :context => identifier - }; if (! System.getDeviceSettings().phoneConnected) { if (Globals.scDebug) { System.println("HomeAssistantService call(): No Phone connection, skipping API call."); @@ -144,7 +129,7 @@ class HomeAssistantService { ErrorView.show(strNoInternet + "."); } else { // Can't use null for substring() parameters due to API version level. - var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + service.substring(0, service.find(".")) + "/" + service.substring(service.find(".")+1, service.length()); + var url = Settings.get().getApiUrl() + "/services/" + service.substring(0, service.find(".")) + "/" + service.substring(service.find(".")+1, service.length()); if (Globals.scDebug) { System.println("HomeAssistantService call() URL=" + url); System.println("HomeAssistantService call() service=" + service); @@ -154,7 +139,15 @@ class HomeAssistantService { { "entity_id" => identifier }, - options, + { + :method => Communications.HTTP_REQUEST_METHOD_POST, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, + "Authorization" => "Bearer " + Settings.get().getApiKey() + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON, + :context => identifier + }, method(:onReturnCall) ); if (Attention has :vibrate) { diff --git a/source/HomeAssistantToggleMenuItem.mc b/source/HomeAssistantToggleMenuItem.mc index c27024f..388cc5f 100644 --- a/source/HomeAssistantToggleMenuItem.mc +++ b/source/HomeAssistantToggleMenuItem.mc @@ -35,8 +35,6 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { private var strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable); private var strAvailable = WatchUi.loadResource($.Rez.Strings.Available); - private var mApiKey as Lang.String; - function initialize( label as Lang.String or Lang.Symbol, subLabel as Lang.String or Lang.Symbol or { @@ -50,7 +48,6 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol } or Null ) { - mApiKey = Properties.getValue("api_key"); WatchUi.ToggleMenuItem.initialize(label, subLabel, identifier, enabled, options); } @@ -76,7 +73,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Data: " + data); } - var status = strUnavailable; + var status = strUnavailable; switch (responseCode) { case Communications.BLE_HOST_TIMEOUT: case Communications.BLE_CONNECTION_UNAVAILABLE: @@ -168,13 +165,6 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { } function getState() as Void { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_GET, - :headers => { - "Authorization" => "Bearer " + mApiKey - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }; if (! System.getDeviceSettings().phoneConnected) { if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call."); @@ -188,14 +178,20 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { ErrorView.show(strNoInternet + "."); getApp().setApiStatus(strUnavailable); } else { - var url = Properties.getValue("api_url") + "/states/" + mIdentifier; + var url = Settings.get().getApiUrl() + "/states/" + mIdentifier; if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem getState() URL=" + url); } Communications.makeWebRequest( url, null, - options, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :headers => { + "Authorization" => "Bearer " + Settings.get().getApiKey() + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, method(:onReturnGetState) ); } @@ -272,14 +268,6 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { } function setState(s as Lang.Boolean) as Void { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_POST, - :headers => { - "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, - "Authorization" => "Bearer " + mApiKey - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }; if (! System.getDeviceSettings().phoneConnected) { if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call."); @@ -297,12 +285,12 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { } else { // Updated SDK and got a new error // ERROR: venu: Cannot find symbol ':substring' on type 'PolyType'. - var id = mIdentifier as Lang.String; - var url; + var id = mIdentifier as Lang.String; + var url = Settings.get().getApiKey() + "/services/"; if (s) { - url = Properties.getValue("api_url") + "/services/" + id.substring(0, id.find(".")) + "/turn_on"; + url = url + id.substring(0, id.find(".")) + "/turn_on"; } else { - url = Properties.getValue("api_url") + "/services/" + id.substring(0, id.find(".")) + "/turn_off"; + url = url + id.substring(0, id.find(".")) + "/turn_off"; } if (Globals.scDebug) { System.println("HomeAssistantToggleMenuItem setState() URL=" + url); @@ -313,7 +301,14 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { { "entity_id" => mIdentifier }, - options, + { + :method => Communications.HTTP_REQUEST_METHOD_POST, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, + "Authorization" => "Bearer " + Settings.get().getApiKey() + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, method(:onReturnSetState) ); } diff --git a/source/QuitTimer.mc b/source/QuitTimer.mc index fdc7d63..5dd1663 100644 --- a/source/QuitTimer.mc +++ b/source/QuitTimer.mc @@ -24,12 +24,9 @@ using Toybox.Application.Properties; using Toybox.WatchUi; class QuitTimer extends Timer.Timer { - private var api_timeout; - + function initialize() { Timer.Timer.initialize(); - // Timer needs delay in milliseconds. - api_timeout = (Properties.getValue("app_timeout") as Lang.Number) * 1000; } function exitApp() as Void { @@ -41,6 +38,7 @@ class QuitTimer extends Timer.Timer { } function begin() { + var api_timeout = Settings.get().getAppTimeout(); // ms if (api_timeout > 0) { start(method(:exitApp), api_timeout, false); } diff --git a/source/Settings.mc b/source/Settings.mc new file mode 100644 index 0000000..323a4b6 --- /dev/null +++ b/source/Settings.mc @@ -0,0 +1,136 @@ +//----------------------------------------------------------------------------------- +// +// Distributed under MIT Licence +// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +// +//----------------------------------------------------------------------------------- +// +// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +// tested on a Venu 2 device. The source code is provided at: +// https://github.com/house-of-abbey/GarminHomeAssistant. +// +// P A Abbey & J D Abbey, SomeoneOnEarth, 23 November 2023 +// +// +// Description: +// +// Home Assistant settings. +// +//----------------------------------------------------------------------------------- + +using Toybox.Lang; +using Toybox.Application.Properties; +using Toybox.WatchUi; +using Toybox.System; +// Battery Level Reporting +using Toybox.Background; +using Toybox.Time; + +(:glance, :background) +class Settings { + private static var instance; + + public static const MENU_STYLE_ICONS = 0; + public static const MENU_STYLE_TEXT = 1; + + private var mApiKey as Lang.String = ""; + private var mApiUrl as Lang.String = ""; + private var mConfigUrl as Lang.String = ""; + private var mAppTimeout as Lang.Number = 0; // seconds + private var mConfirmTimeout as Lang.Number = 3; // seconds + private var mMenuStyle as Lang.Number = MENU_STYLE_ICONS; + private var mMenuAlignment as Lang.Number = WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_LEFT; + private var mIsWidgetStartNoTap as Lang.Boolean = false; + private var mIsBatteryLevelEnabled as Lang.Boolean = false; + private var mBatteryRefreshRate as Lang.Number = 15; // minutes + private var mIsApp as Lang.Boolean = false; + + private function initialize() { + mIsApp = getApp().getIsApp(); + update(); + } + + // Called on application start and then whenever the settings are changed. + function update() { + mApiKey = Properties.getValue("api_key"); + mApiUrl = Properties.getValue("api_url"); + mConfigUrl = Properties.getValue("config_url"); + mAppTimeout = Properties.getValue("app_timeout"); + mConfirmTimeout = Properties.getValue("confirm_timeout"); + mMenuStyle = Properties.getValue("menu_theme"); + mMenuAlignment = Properties.getValue("menu_alignment"); + mIsWidgetStartNoTap = Properties.getValue("widget_start_no_tap"); + mIsBatteryLevelEnabled = Properties.getValue("enable_battery_level"); + mBatteryRefreshRate = Properties.getValue("battery_level_refresh_rate"); + + // Manage this inside the application or widget only (not a glance or background service process) + if (mIsApp) { + if (mIsBatteryLevelEnabled) { + if ((System has :ServiceDelegate) and + ((Background.getTemporalEventRegisteredTime() == null) or + (Background.getTemporalEventRegisteredTime() != (mBatteryRefreshRate * 60)))) { + Background.registerForTemporalEvent(new Time.Duration(mBatteryRefreshRate * 60)); // Convert to seconds + } + } else { + // Explicitly disable the background event which persists when the application closes. + if ((System has :ServiceDelegate) and (Background.getTemporalEventRegisteredTime() != null)) { + Background.deleteTemporalEvent(); + } + } + } else { + // Explicitly disable the background events for glances and ironically any use by the background service. However + // that has been avoided more recently by not using this object in BackgroundServiceDelegate. + if ((System has :ServiceDelegate) and (Background.getTemporalEventRegisteredTime() != null)) { + Background.deleteTemporalEvent(); + } + } + if (Globals.scDebug) { + System.println("Settings update(): getTemporalEventRegisteredTime() = " + Background.getTemporalEventRegisteredTime()); + if (Background.getTemporalEventRegisteredTime() != null) { + System.println("Settings update(): getTemporalEventRegisteredTime().value() = " + Background.getTemporalEventRegisteredTime().value().format("%d") + " seconds"); + } else { + System.println("Settings update(): getTemporalEventRegisteredTime() = null"); + } + } + } + + static function get() as Settings { + if (instance == null) { + instance = new Settings(); + } + return instance; + } + + function getApiKey() as Lang.String { + return mApiKey; + } + + function getApiUrl() as Lang.String { + return mApiUrl; + } + + function getConfigUrl() as Lang.String { + return mConfigUrl; + } + + function getAppTimeout() as Lang.Number { + return mAppTimeout * 1000; // Convert to milliseconds + } + + function getConfirmTimeout() as Lang.Number { + return mConfirmTimeout * 1000; // Convert to milliseconds + } + + function getMenuStyle() as Lang.Number { + return mMenuStyle; // Either MENU_STYLE_ICONS or MENU_STYLE_TEXT + } + + function getMenuAlignment() as Lang.Number { + return mMenuAlignment; // Either WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_RIGHT or WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_LEFT + } + + function getIsWidgetStartNoTap() as Lang.Boolean { + return mIsWidgetStartNoTap; + } + +} diff --git a/source/WebLog.mc b/source/WebLog.mc new file mode 100644 index 0000000..d845a46 --- /dev/null +++ b/source/WebLog.mc @@ -0,0 +1,179 @@ +//----------------------------------------------------------------------------------- +// +// Distributed under MIT Licence +// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE. +// +//----------------------------------------------------------------------------------- +// +// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely +// tested on a Venu 2 device. The source code is provided at: +// https://github.com/house-of-abbey/GarminHomeAssistant. +// +// J D Abbey & P A Abbey, 28 December 2022 +// +// +// Description: +// +// WebLog provides a logging and hence debugging aid for when the application is +// deployed to the watch. This is only used for development and use of it must not +// persist into a deployed version. It uses a string buffer to group log entries into +// larger submissions in order to prevent overflow of the blue tooth stack. +// +//----------------------------------------------------------------------------------- +// +// Usage: +// wl = new WebLog(); +// wl.clear(); +// wl.println("Debug Message"); +// wl.flush(); +// +// https://domain.name/path/log.php +// +// +// +// Logs published to: https://domain.name/path/log +// +// https://domain.name/path/log_clear.php +// +// + +using Toybox.Communications; +using Toybox.Lang; +using Toybox.System; + +(:glance, :background) +class WebLog { + private var callsbuffer = 4 as Lang.Number; + private var numCalls = 0 as Lang.Number; + private var buffer = "" as Lang.String; + + // Set the number of calls to print() before sending the buffer to the online + // logger. + // + function setCallsBuffer(l as Lang.Number) { + callsbuffer = l; + } + + // Get the number of calls to print() before sending the buffer to the online + // logger. + // + function getCallsBuffer() as Lang.Number { + return callsbuffer; + } + + // Create a debug log over the Internet to keep track of the watch's runtime + // execution. + // + function print(str as Lang.String) { + var myTime = System.getClockTime(); + buffer += myTime.hour.format("%02d") + ":" + myTime.min.format("%02d") + ":" + myTime.sec.format("%02d") + " " + str; + numCalls++; + if (Globals.scDebug) { + System.println("WebLog print() str = " + str); + } + if (numCalls >= callsbuffer) { + doPrint(); + } + } + + // Create a debug log over the Internet to keep track of the watch's runtime + // execution. Add a new line character to the end. + // + function println(str as Lang.String) { + print(str + "\n"); + } + + // Flush the current buffer to the online logger even if it has not reach the + // submission level set by 'callsbuffer'. + // + function flush() { + if (Globals.scDebug) { + System.println("WebLog flush()"); + } + if (numCalls > 0) { + doPrint(); + } + } + + // Perform the submission to the online logger. + // + function doPrint() { + if (Globals.scDebug) { + System.println("WebLog doPrint()"); + System.println(buffer); + } + Communications.makeWebRequest( + ClientId.webLogUrl, + { + "log" => buffer + }, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_URL_ENCODED + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN + }, + method(:onLog) + ); + numCalls = 0; + buffer = ""; + } + + // Clear the debug log over the Internet to start a new track of the watch's runtime + // execution. + // + function clear() { + if (Globals.scDebug) { + System.println("WebLog clear()"); + } + Communications.makeWebRequest( + ClientId.webLogClearUrl, + {}, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_URL_ENCODED + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN + }, + method(:onClear) + ); + numCalls = 0; + buffer = ""; + } + + // Callback function to print the outcome of a doPrint() method. + // + function onLog(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { + if (Globals.scDebug) { + if (responseCode != 200) { + System.println("WebLog onLog() Failed"); + System.println("WebLog onLog() Response Code: " + responseCode); + System.println("WebLog onLog() Response Data: " + data); + } + } + } + + // Callback function to print the outcome of a clear() method. + // + function onClear(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { + if (Globals.scDebug) { + if (responseCode != 200) { + System.println("WebLog onClear() Failed"); + System.println("WebLog onClear() Response Code: " + responseCode); + System.println("WebLog onClear() Response Data: " + data); + } + } + } +}